Как быстро выполнить и запустить миллионы модульных тестов?

Как выполнить миллионы юнит-тестов быстро, то есть за 20–30 минут?

Вот сценарий:

  • Вы выпускаете определенное оборудование, и у вас есть, скажем, 2000 модульных тестов.
  • Вы выпускаете новое железо и у вас есть дополнительные 1000 тестов для этого.

Каждое новое оборудование будет включать в себя тесты, но вам также придется запускать и выполнять все предыдущие, и их количество будет увеличиваться, как и время выполнения.

Во время разработки это решается категоризацией, использованием атрибута TestCategory и запуском только того, что вам нужно.

Однако CI должен запускать каждый отдельный тест. По мере увеличения числа время выполнения замедляется, а иногда и время ожидания истекает. .testrunconfig уже настроен на выполнение parallelTestCount, но со временем это не решает проблему навсегда.

Как бы вы решили это?


person user3057678    schedule 29.11.2018    source источник
comment
Кто-то действительно сел и написал 2000 релевантных, интересных, отдельных тестов, или мы говорим об автоматически сгенерированных тестах? Последнее могло бы выиграть от выполнения целых групп тестов путем чтения структурированных данных вместо крошечных методов, представляющих отдельные булавочные уколы. Вы можете по крайней мере самостоятельно оптимизировать это; оптимизация MSTest будет немного сложнее. (MSTest также поддерживает модульные тесты, управляемые данными, которые являются возможной альтернативой, но я не думаю, что они выполняются быстрее, просто удобнее.)   -  person Jeroen Mostert    schedule 29.11.2018
comment
Речь идет о ручных письменных тестах. Пока 4380. Не генерируются. Что касается оптимизации, то каждый тест длится миллисекунды, ни один не более 1 секунды.   -  person user3057678    schedule 29.11.2018
comment
Если каждый тест занимал (скажем) 10 мс, а у вас 4380 тестов, то даже при последовательном прогоне на выполнение всех тестов должно уйти не более минуты. Если вы обнаружите, что сервер CI занимает (намного) больше времени, стоит выяснить, откуда берутся накладные расходы (доступ к файлам из-за регистрации результатов?). Я сам не занимался профилированием MSTest, но полагаю, что он может быть не особо оптимизирован, поскольку обычно его не просят запускать огромное количество тестов. Вы также можете рассмотреть альтернативы, такие как NUnit, или даже собственный бегун (перечисление тестов с помощью отражения не сложно).   -  person Jeroen Mostert    schedule 29.11.2018
comment
Не могли бы вы предоставить больше данных о том, что на самом деле занимает так много времени? Выполнение теста быстрое, как вы говорите. А сроки сборки? Связываете ли вы все зависимости со своими тестами?   -  person Dirk Herrmann    schedule 08.02.2019


Ответы (1)


Похоже, что с каждым обновлением Visual Studio 2017 время выполнения меняется. В настоящее время у нас более 6000 тестов, из которых от 15 до 20% — это модульные тесты, а остальные — интеграционные.

Узким местом оказался сам сервер CI, работающий на одной машине. От 70% до 80% тестов являются асинхронными, и анализ показал, что нет блокирующих операций ввода-вывода. Помимо IO, мы не используем базы данных, кэширование так что есть.

Теперь мы находимся в процессе перехода на Jenkins и используем его подключаемый модуль Parallel Test Executor для распараллеливания тестов на нескольких узлах, а не на одной машине. Первоначальное тестирование показало, что время выполнения более 6000 тестов варьируется от 10 до 15 минут по сравнению со старым CI, который занимал 2 часа или иногда останавливался.

person user3057678    schedule 07.02.2019