diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/case-study.md b/case-study.md new file mode 100644 index 0000000..cadd3a7 --- /dev/null +++ b/case-study.md @@ -0,0 +1,123 @@ +# Оптимизация + +Будем оптимизировать `test-suite` своего проекта. + +В настоящий момент в `CI` есть две параллельных джобы: +- в первой запускаются `spec/models/` & `spec/controllers`; +- во второй все остальные спеки. + +Начнем с анализа текущей ситуации. + +``` +# Полный `suite` сейчас. + +Finished in 9 minutes 1 second (files took 14.98 seconds to load) + +[TEST PROF INFO] TagProf report for type + + type time total %total %time avg + + model 02:17.949 1159 30.55 26.51 00:00.119 + controller 01:29.712 419 11.04 17.24 00:00.214 + service 01:23.116 701 18.48 15.97 00:00.118 + serializer 00:52.336 415 10.94 10.06 00:00.126 + command 00:51.256 126 3.32 9.85 00:00.406 + query 00:34.382 54 1.42 6.61 00:00.636 + job 00:21.393 138 3.64 4.11 00:00.155 + builder 00:11.293 79 2.08 2.17 00:00.142 + request 00:10.441 76 2.00 2.01 00:00.137 + decorator 00:09.839 87 2.29 1.89 00:00.113 + lib 00:08.771 361 9.52 1.69 00:00.024 + mailer 00:06.753 68 1.79 1.30 00:00.099 + publishing 00:03.029 34 0.90 0.58 00:00.089 + validator 00:00.015 8 0.21 0.00 00:00.001 + concern 00:00.006 4 0.11 0.00 00:00.001 + apivore 00:00.002 65 1.71 0.00 00:00.000 +``` + +## Этап 1 (`parallel_tests`) + +Потратил много времени на попытки распараллелить тесты с помощью `parallel_tests`. Столкнулся с проблемами: + +### Ошибки + +Рандомно сыпятся ошибки. Кажется перечитал все `issues` в библиотеке по теме. + +1. Нашел проблему связанную с обращением к внешнему сервису при загрузке изображений и застабил в тестах. +2. Осталась проблема с `requests`, с которой не помогает и `retry-spec` (вероятно, недостаток нужного конфига - где пока не знаю, либо не хватает какого-то сброса состояния перед повторной попыткой прогона теста, но вот какое именно - к сожалению, пока определить не удалось). + +В любом случае не стабильность джоб кажется существенным минусом сейчас. Надеюсь в будущем удастся это добороть. Пока решил отложить. + +### Долгий `setup` БД для параллельных процессов + +В перспективе хотелось бы найти простой способ осуществлять `setup` для первого процесса, а для остальных просто создавать по `template` - быстрого способа сделать этого в нашей конфигурации не нашел. До тех пор польза распараллеливания в нашей конфигурации в целом осталась для меня под вопросом. + +## Этап 2 (`test-prof`) + +Провел профилирование самых больших по времени блоков тестов. + +В рамках текущей задачи решил сконцентрироваться на устранении оверхедов при работи с фактори/БД. + +Главным инструментарием для оптимизации тестов стал гем `test-prof`: +- устранил лишние операции с БД с помощью `let_it_be`/`befor_all`; +- где применимо, заменил `.create` на `.build` в фактори. + +# Результаты + +Примечание. Бенчмарк по `suite` в целом (см. ниже) отличается от отдельных блоков - в лучшую сторону (вероятно, это связано с тем, что время выполнение в общем скопе занимает больше времени). + +### spec/services + +Удалось ускорить выполнение: на 10 сек. с 50 до 40 секунд (20%). + + + +### spec/serializers + +Удалось ускорить выполнение: на 10 сек. - с 42 до 32 секунд (23%). + + + +### spec/models + +Удалось ускорить выполнение: на 18 сек. - с 131 до 113 секунд (14%). + + + +### spec/queries + +Удалось ускорить выполнение: на 12 сек. - с 32 до 10 секунд (31%). + + + +### Итого по `suite` + +Удалось ускорить выполнение: на 1 мин. 32 сек. - с 549 до 457 сек (17%). + +С учетом распараллеливания, чистое расчетное время выигрыша (ускорение пайплайна) чуть меньше - 1 мин. 14 сек. + +``` +Finished in 7 minutes 46 seconds (files took 15.75 seconds to load) + +[TEST PROF INFO] TagProf report for type + type time total %total %time avg + + model 01:57.424 1159 30.55 26.76 00:00.101 + controller 01:31.925 419 11.04 20.95 00:00.219 + service 01:00.054 701 18.48 13.69 00:00.085 + command 00:56.223 126 3.32 12.81 00:00.446 + serializer 00:28.690 415 10.94 6.54 00:00.069 + job 00:23.340 138 3.64 5.32 00:00.169 + builder 00:11.340 79 2.08 2.58 00:00.143 + decorator 00:11.033 87 2.29 2.51 00:00.126 + request 00:10.625 76 2.00 2.42 00:00.139 + lib 00:08.514 361 9.52 1.94 00:00.023 + query 00:07.473 54 1.42 1.70 00:00.138 + mailer 00:07.130 68 1.79 1.63 00:00.104 + publishing 00:04.939 34 0.90 1.13 00:00.145 + validator 00:00.015 8 0.21 0.00 00:00.001 + concern 00:00.005 4 0.11 0.00 00:00.001 + apivore 00:00.001 65 1.71 0.00 00:00.000 +``` + + diff --git a/screenshots/models.png b/screenshots/models.png new file mode 100644 index 0000000..7ab38ca Binary files /dev/null and b/screenshots/models.png differ diff --git a/screenshots/queries.png b/screenshots/queries.png new file mode 100644 index 0000000..f96694d Binary files /dev/null and b/screenshots/queries.png differ diff --git a/screenshots/serializers.png b/screenshots/serializers.png new file mode 100644 index 0000000..1108b97 Binary files /dev/null and b/screenshots/serializers.png differ diff --git a/screenshots/services.png b/screenshots/services.png new file mode 100644 index 0000000..262c003 Binary files /dev/null and b/screenshots/services.png differ diff --git a/screenshots/suite.png b/screenshots/suite.png new file mode 100644 index 0000000..e72ce83 Binary files /dev/null and b/screenshots/suite.png differ