From 0942cec090b333fe87a1c20561bf7c63ae0ce06f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=BD=D0=B0=20=D0=91=D1=83=D1=8F=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0?= Date: Sat, 15 Mar 2025 14:07:58 +0300 Subject: [PATCH 1/2] Kind of a case study --- .gitignore | 1 + case_study.md | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 .gitignore create mode 100644 case_study.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dd93485 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +real/* diff --git a/case_study.md b/case_study.md new file mode 100644 index 0000000..1d346ce --- /dev/null +++ b/case_study.md @@ -0,0 +1,115 @@ +## 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, когда параллельно запускается много билдов (у нас большая команда и мы вечно пушим :D). + +Но учитывая 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` на `let` заменить. + +### Factory prof + +```bash +FPROF=flamegraph rspec +``` + +Да, есть каскады, но сейчас не разгрести так сразу ) + +```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 +``` + +Ну тут куча внутренних вызовов и тд, наверное, нужно отдельные тесты смотреть + + +### Профилирование конкретных тестов (нашей фичи) From 46eee233b0207936c0cced13c291727fd9c3115b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=BD=D0=B0=20=D0=91=D1=83=D1=8F=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0?= Date: Sat, 22 Mar 2025 15:54:08 +0300 Subject: [PATCH 2/2] Adjusted case_study --- case_study.md | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/case_study.md b/case_study.md index 1d346ce..871aa94 100644 --- a/case_study.md +++ b/case_study.md @@ -14,9 +14,9 @@ Finished in 1 minute 13.56 seconds (files took 17.12 seconds to load) 2345 examples, 2 failures, 6 pending ``` -На самом деле иногда есть проблема на CI, когда параллельно запускается много билдов (у нас большая команда и мы вечно пушим :D). +На самом деле иногда есть проблема на CI, когда параллельно запускается много билдов (у нас большая команда и мы вечно пушим). -Но учитывая test suite, не факт, что есть quick wins, возможно, нужно мелочи оптмизировать (если задаться целью). +Но учитывая test suite, не факт, что есть quick wins, возможно, нужно мелочи оптимизировать (если задаться целью). ### Memory profile @@ -27,12 +27,12 @@ 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` и тд +По аллокациям есть один спек, к-й 2% занимает, но это просто здоровый тест, там уже всё прописано через `let_it_be` и тд. +Да, можно кое-что замокать, но это скажется на объёме того, что мы тестируем. ### Rspec --profile @@ -43,7 +43,7 @@ rspec --profile spec Самые медленные тесты и example groups выполняются за 0,2-0,5 секунды. Есть одна группа, к-я выполняется 1,37с , но там в принципе много данных нужно. Я бы наоборот проверки дописала на полученные результаты. -Наверное, мелочи можно оптимизировать, но острой необходимости нет. +Наверное, мелочи можно оптимизировать, но острой необходимости нет. ### Rspec dissect @@ -61,7 +61,7 @@ Total `before(:each)` time: 00:31.333 ``` По времени немного, но есть за что зацепиться - кое-где создаётся очень много записей (например, user), кое-что можно переиспользовать, я думаю. -В т.ч. `let_it_be` на `let` заменить. +В т.ч. `let_it_be` использовать. ### Factory prof @@ -69,7 +69,7 @@ Total `before(:each)` time: 00:31.333 FPROF=flamegraph rspec ``` -Да, есть каскады, но сейчас не разгрести так сразу ) +Да, есть каскады, в т.ч. большие, но сейчас не разгрести так сразу. + в целом в коде много где используется норм, в т.ч. через `let_it_be`/ ```bash FPROF=1 FPROF_THRESHOLD=30 be rspec @@ -109,7 +109,22 @@ 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). На самом деле нужно немного реогранизовать тесты + есть особенности из-за параллельной работы нескольких разработчиков над этой фичей ) Реорганизуем и немного оптимизируем со временем. + +### Вывод -### Профилирование конкретных тестов (нашей фичи) +Потренировалась профилировать тесты, оптимизировала мелочи, сохранила себе информацию для дальнейшего анализа. +В целом придерживалась принципа "не оптимизировать без необходимости" )) +Также попробовала распараллелить, конечно, тесты прошли быстрее (28 секунд).