Skip to content
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

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
real/*
130 changes: 130 additions & 0 deletions case_study.md
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)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в районе минуты уже неплохо конечно

а вот 8 секунд на загрузку долговато

[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). На самом деле нужно немного реогранизовать тесты + есть особенности из-за параллельной работы нескольких разработчиков над этой фичей ) Реорганизуем и немного оптимизируем со временем.


### Вывод

Потренировалась профилировать тесты, оптимизировала мелочи, сохранила себе информацию для дальнейшего анализа.
В целом придерживалась принципа "не оптимизировать без необходимости" ))
Copy link
Collaborator

Choose a reason for hiding this comment

The 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 секунд).
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

это вообще уже кайф