Open
Conversation
Owner
|
Великолепно! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Задание №7: Оптимизация Test Suite и сбор DX-метрик
Код здесь: foxy-eyed/task-3#2
Несколько первых прогонов завершились за время в интервале ~ 800–1000 секунд.
Включение
parallel_testscTEST_ENV_NUMBER=2снизило время прогона до 385 секунд.Избавившись от загрузок в фабрике
users, сократили время до 365 секунд.Построила отчёт
stackprofдля самой медленной группы из отчётаrspec --profile(./spec/controllers/internal_users_controller_spec.rb– 104 cекунды).Кстати, для генерации отчёта в формате
jsonтребуется обновить гемtest-prof.Попробовала воспользоваться инструментом speedscope.app для анализа полученного json-файла, подтвердила выводы, известные по итогам вебинара 😅
Отключение
HoneycombвAirbrakeв тестовом окружении позволило сократить время прогона тестов до 285 сек.Оптимизация топ самых медленных тестов из отчёта
RSpecDissectс помощью хелперовlet_it_beиbefore_allснизила время прогона до 225 секунд.Отчёт
FactoryDoctorпоказал, что потенциально "плохих" тестов 98 штук, а возможная экономия времени составит 10 секунд. Не стала связываться, потому что структура тестов затрудняет рефакторинг, а потенциальная польза не очень существенная.Построила отчёт
FactoryFlame. На картинке видно, что фабрикаuserвсегда создает вместе с собой каскадомidentity, всего более 1700 раз.Вынесла создание
identityвtrait, который используется точечно. В результате flamegraph изменился таким образом:До:


После:
Весь test suite прогнался за 213 секунд.
Дальше с помощью инстумента
EventProfпостроила отчёт для событияfactory.createдля всего test suite.На первом месте по продолжительности:
./spec/features/user_views_a_reading_list_spec.rb.Для этой группы сгенерировала flamegraph:
$ FPROF=flamegraph bin/rspec spec/features/user_views_a_reading_list_spec.rbЭто
feature-тест для раздела Reading List, куда попадают сохраненные пользователем статьи (при этом создается модельReaction). Сами тесты проверяют наличие на странице элемента типа "Загрузить ещё", который появляется только когда статей больше чем параметрPER_PAGE=45. Соответственно, создаются 46Reaction+ 46Article+ 46User(авторы) для одного теста.FactoryDefaultдля генерации статей (одна фабрика пользователя в качестве автора).flamegraph после оптимизации:
Итог для данного теста: 18.24 -> 5.36 сек.
Итог по test suite: 205 сек.
Избавление от database_cleaner + use_transactional_fixtures
Сначала я планировала убрать
database_cleanerиз юнит-тестов, но оставить его для feature-тестов. Но потом решила попробовать мигрировать на системные тесты, которые идут с рельсами "из коробки".Краткое содержание квеста:
config.use_transactional_fixtures = true.database_cleanerи все его упоминания в коде.chromedriver-helper. Могут возникнуть проблемы сchromedriverиrbenv(мне пришлось переустановить https://medium.com/fusionqa/issues-with-rbenv-and-chromedriver-990bb14aa57a).capybaraпришлось обновить рельсу до 5.2 ради этого коммита rails/rails@72f17d5featureна типsystem.config.include Devise::Test::IntegrationHelpers, type: :systemРезультат по метрикам хороший: 183 сек.
Сами системные тесты даже отрабатывают с минимальными изменениями без особых падений. Проблема возникла, что странно, с некоторыми unit-тестами, причем с теми, что не были затронуты рефакторингом, и я это связываю с обновлением
Rails.Попытки выборочно пофиксить их не привели меня к успеху, нужно закапываться очень глубоко. В частности, есть обоснованные предположения, что отвалились какие-то сайд-эффекты, происходящие в колбеках моделей и т.п. Кажется, что unit-тесты, допустим, моделей, должны изолированно работать с моделью, и не надо бы им падать из-за всякой внешней ерунды 😅. И коду бы ломаться не надо) Иллюстрирует!
Откатывать не стала, потому что:
График изменения метрики из Chronograf: