Выполнять только те модульные тесты, которые изменили исходный код?

Я выполняю модульные тесты и тесты Selenium на нашем сервере Jenkins CI. Как мы все знаем, тесты занимают много времени в большом проекте.

Есть ли инструмент/фреймворк для Java, который может запускать только те тесты, чей исходный код изменился? Это потому, что не каждая фиксация SCM влияет на все области исходного кода...

Я использую Cobertura для покрытия кода и Surefire для отчетности.

EDIT: я нашел Atlassian Clover, но я ищу бесплатное решение.

Ответ 1

Я выполняю модульные тесты и тесты Selenium на нашем сервере Jenkins CI. Как мы все знаем, тесты занимают много времени в большом проекте.

Это проблема, с которой я столкнулся. Разделите проект на несколько логических единиц (например, уровень сохранения, уровень обслуживания, веб-уровень) и протестируйте их отдельно. Таким образом, вам нужно только запустить тесты Selenium, когда веб-слой изменился, а время сборки на артефакт растет короче

Ответ 2

Вы можете попробовать JUnit Max или Infinitest, но они оба основаны на IDE.

Ответ 3

Лично я думаю, что вы смотрите на это неправильно. На что лучше было бы взглянуть, будет разбивка ваших тестов Junit на отдельные пакеты, основанные на функциональности и времени.

Для таких проектов я выполняю тесты на здравомыслие для каждого фиксации, но эти тесты очень ограничены и охватывают самые основные функции, а затем поверх этих ночных тестов, чтобы охватить гораздо больше (видя, что никто не работает ночью, он дает 12-часовое окно для проверки кода дней).

Если вам нужен весь комплект тестирования (но я был бы удивлен, если бы это произошло), вы могли бы запустить тестовый пакет для выходных.

Чтобы протестировать только измененные классы, предполагается, что эти классы не влияют ни на какие другие части вашего проекта, что может привести к ошибкам, которые не были бы подобраны, если вы не проводите всесторонние тесты, или просто вы изменили в любом случае.

Я знаю, что это не дает технически ответа на ваш вопрос, но что-то подумать.

Ответ 4

В целом вы не можете надежно заключить, какой код покрывается тем, какой тест не выполняется, и даже когда вы запускаете свои тесты, путь выполнения может отличаться от запуска для запуска. Я подозреваю, что идеальный анализ подобен этому Проблема с остановкой.

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

В конце концов, вы хотите запустить весь тестовый пакет, однако вы правы в том, что выполнение тестов по измененному коду более важно, потому что 1. разработчик знает, что они перепутали раньше и 2. если у вас много изменений, имеет смысл сначала протестировать новую версию и перейти к более ранним версиям только для того, чтобы делить проблемы.

Google официально заявила *, что их взломанный репозиторий кода запускает модульные тесты в момент фиксации ** и что они настраивают среду тестирования, чтобы определить, какие тесты запускать в первую очередь. Я не знаю, являются ли их изменения общедоступными.

* видео-беседа с презентацией конференции, я не помню точное имя или ссылку

** строго после фиксации, а затем автоматический откат, если тесты начинают сбой