Я запускаю набор интеграционных тестов с использованием maven, и около 10% тестов не срабатывают или выдают ошибку. Однако, когда я запускаю сервер и запускаю отдельные неудачные тесты вручную из моей IDE (intellij idea), все они проходят без проблем. Что может быть причиной этой проблемы?
Это почти всегда связано с тем, что единичные тесты работают в непоследовательном порядке или состояние гонки между двумя тестами, проходящими параллельно с помощью разветвленных тестов. Если первый тест заканчивается, он проходит. Но если тест №2 заканчивается первым, он оставляет тестовый ресурс, такой как тестовая база данных, в альтернативном состоянии, вызывающем потерю теста №1. Это очень часто встречается при тестировании базы данных, особенно когда один или несколько изменяют базу данных. Даже в IDEA вы можете найти все тесты в классе com.example.FooTest
всегда передаются при запуске этого класса. Но если вы запустите все тесты в пакете com.example
или все тесты в проекте, иногда (или даже всегда) тест в FooTest
завершается с ошибкой.
Исправление состоит в том, чтобы гарантировать, что ваши тесты всегда гарантируют согласованное состояние при запуске. (Это руководящий принцип для хороших модульных тестов.) Вам нужно обратить внимание на настройку тестирования и @Before
с помощью @Before
, @BeforeClass
, @After
и @AfterClass
аннотации (или эквиваленты TestNG). Я рекомендую database unit testing best practices
Google. Для тестов базы данных выполнение тестов в транзакции может предотвратить эти проблемы. Таким образом, база данных возвращается в исходное состояние независимо от того, проходит или не проходит тест. Spring имеет отличную поддержку тестов детабазы JDBC. (Даже если ваш проект не является проектом Spring, классы могут быть очень полезными.) Прочитайте раздел 11.2.2 Поддержка тестирования модуля. Изучите классы AbstractTransactionalJUnit4SpringContextTests/AbstractTransactionalTestNGSpringContextTests и аннотацию @TransactionConfiguration (эта последняя из запущенных Spring Contexts). Существуют также другие инструменты для тестирования баз данных, такие как DbUnit.