четверг, 21 января 2010 г.

Тасование интеграционных тестов

Убил почти два дня на дурацкую проблему. У меня есть интеграционные тесты, которые используют некий внешний ресурс. Я был уверен, что он - read-only, но оказалось, что в некоторых случаях я могу менять его состояние. В результате получалось что тесты могут проходить, а могут и нет, в зависимости от того, в какой последовательности их запускать.

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

И мне пришло в голову такое решение: надо, чтобы test runner умел запускать тесты в случайном порядке. Если так два-три раза прогнать все тесты, то можно быть уже более-менее уверенным. Вроде очень простая идея, но я не видел, чтобы кто-то её реализовал...

4 комментария:

vansickle комментирует...

Писали уже люди такое, вот например http://www.codewrecks.com/blog/index.php/2008/12/06/randomizer-nunit-addin/, да можно и самому всегда написать подобный плагин.

Еще как вариант схожего подхода - у нас CI-сервер провалившиеся тесты двигает в начало очереди при следующем запуске. Это больше для fail fast, но и помогает для определения есть ли проблемы с неизолированностью тестов.

Mikhail Krivoshein комментирует...

А что за CI server?

Anatol Pomozov комментирует...

У нас имеется довольно таки простая имплементация ShuffleTestRunner которая запускает тесты в случайном порядке.

Это правда вызывает flaky tests то есть тест работает, но переодически fail. Хотя это лучше чем flaky tests о которых не знаешь.

vansickle комментирует...

>А что за CI server?
http://www.jetbrains.com/teamcity/

Ratings by outbrain