-
Notifications
You must be signed in to change notification settings - Fork 50
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Tests optimization research #47
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
real/* |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
## Test suite | ||
|
||
Ну не так плохо. Есть ворнинги. | ||
|
||
```bash | ||
[bc2942a4] Finished in 1 minute 7.93 seconds (files took 8.24 seconds to load) | ||
[bc2942a4] 2055 examples, 0 failures, 8 pending | ||
``` | ||
|
||
В девелопе: | ||
|
||
```bash | ||
Finished in 1 minute 13.56 seconds (files took 17.12 seconds to load) | ||
2345 examples, 2 failures, 6 pending | ||
``` | ||
|
||
На самом деле иногда есть проблема на CI, когда параллельно запускается много билдов (у нас большая команда и мы вечно пушим). | ||
|
||
Но учитывая test suite, не факт, что есть quick wins, возможно, нужно мелочи оптимизировать (если задаться целью). | ||
|
||
### Memory profile | ||
|
||
```bash | ||
TEST_MEM_PROF='rss' TEST_MEM_PROF_COUNT=10 rspec spec | ||
``` | ||
|
||
Решила память попрофилировать, т.к. по времени вроде всё не так плохо. | ||
Самый жирный кейс недавно коллега оптимизировал, остальные не так явно выделяются, записала себе examples для дальнейшего профилирования по отдельности. | ||
|
||
```bash | ||
TEST_MEM_PROF='alloc' TEST_MEM_PROF_COUNT=10 rspec spec | ||
``` | ||
|
||
По аллокациям есть один спек, к-й 2% занимает, но это просто здоровый тест, там уже всё прописано через `let_it_be` и тд. | ||
Да, можно кое-что замокать, но это скажется на объёме того, что мы тестируем. | ||
|
||
### Rspec --profile | ||
|
||
|
||
```bash | ||
rspec --profile spec | ||
``` | ||
|
||
Самые медленные тесты и example groups выполняются за 0,2-0,5 секунды. | ||
Есть одна группа, к-я выполняется 1,37с , но там в принципе много данных нужно. Я бы наоборот проверки дописала на полученные результаты. | ||
Наверное, мелочи можно оптимизировать, но острой необходимости нет. | ||
|
||
### Rspec dissect | ||
|
||
```bash | ||
RD_PROF=1 RD_PROF_TOP=10 bundle exec rspec spec | ||
``` | ||
|
||
```bash | ||
[TEST PROF INFO] RSpecDissect report | ||
|
||
Total time: 00:54.086 | ||
|
||
Total `let` time: 00:14.948 | ||
Total `before(:each)` time: 00:31.333 | ||
``` | ||
|
||
По времени немного, но есть за что зацепиться - кое-где создаётся очень много записей (например, user), кое-что можно переиспользовать, я думаю. | ||
В т.ч. `let_it_be` использовать. | ||
|
||
### Factory prof | ||
|
||
```bash | ||
FPROF=flamegraph rspec | ||
``` | ||
|
||
Да, есть каскады, в т.ч. большие, но сейчас не разгрести так сразу. + в целом в коде много где используется норм, в т.ч. через `let_it_be`/ | ||
|
||
```bash | ||
FPROF=1 FPROF_THRESHOLD=30 be rspec | ||
``` | ||
|
||
Очень много записей `user` и ещё кое-каких связанных, подозреваю, что для тестов на разные роли. | ||
Думаю, этот момент можно оптимизировать | ||
|
||
### Factory doctor | ||
|
||
```bash | ||
FDOC=1 be rspec spec | ||
``` | ||
|
||
Пока немного, по времени так точно, но понятно, что через время всё равно могут быть проблемы: | ||
|
||
```bash | ||
Total (potentially) bad examples: 40 | ||
Total wasted time: 00:01.016 | ||
``` | ||
|
||
### Event prof | ||
|
||
```bash | ||
EVENT_PROF='sql.active_record' be rspec spec | ||
``` | ||
|
||
Запросов не маленько, но в основном просто так же "много данных нужно". | ||
|
||
### Stackprof | ||
|
||
```bash | ||
TEST_STACK_PROF=1 bundle exec rspec | ||
``` | ||
|
||
``` | ||
SAMPLE=10 TEST_STACK_PROF=1 be rspec | ||
``` | ||
|
||
Ну тут куча внутренних вызовов и тд, наверное, нужно отдельные тесты смотреть. | ||
|
||
### Профилирование конкретных тестов | ||
|
||
Решила немного попрофилировать часть тестов фичи, над к-й сейчас работаем. | ||
|
||
`our_spec_name_spec.rb` | ||
|
||
Finished in 1.75 seconds (files took 9.47 seconds to load) | ||
35 examples, 0 failures | ||
|
||
Оптимизировала с помощью `let_it_be` немного (до 1,5). На самом деле нужно немного реогранизовать тесты + есть особенности из-за параллельной работы нескольких разработчиков над этой фичей ) Реорганизуем и немного оптимизируем со временем. | ||
|
||
|
||
### Вывод | ||
|
||
Потренировалась профилировать тесты, оптимизировала мелочи, сохранила себе информацию для дальнейшего анализа. | ||
В целом придерживалась принципа "не оптимизировать без необходимости" )) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. я бы предложил nate_heckler mode включить, чтобы видеть сколько на фабрики уходит https://github.com/test-prof/test-prof/blob/master/docs/profilers/factory_prof.md |
||
Также попробовала распараллелить, конечно, тесты прошли быстрее (28 секунд). | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. это вообще уже кайф |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
в районе минуты уже неплохо конечно
а вот 8 секунд на загрузку долговато