пятница, 13 апреля 2012 г.

Assume that...

Недавно правил интеграционные тесты, которые работали очень нестабильно как локально так и на CI сервере, что не давало скрипту запустить статический анализ кода долгое время. Модуль должен был взаимодействовать с базой и совершать некоторые блокирующие операции. Тест часто падал, потому что база была девелоперская и в ней постоянно кто-то ковырялся и задевал в частности и используемую тестом таблицу.

Это не выглядело правильным и мне пришло в голову во время выполнения игнорировать тест, если база находится в неподходящем состоянии.

NUnit позволяет это делать с помощью очевидно инструкции: Assert.Ignore()

The Assert.Ignore method provides you with the ability to dynamically cause a test or suite to be ignored at runtime.

Однако в JUnit я подобного не обнаружил. Поковырявшись ещё немного, я нашёл класс Assume:

A set of methods useful for stating assumptions about the conditions in which a test is meaningful. A failed assumption does not mean the code is broken, but that the test provides no useful information. The default JUnit runner treats tests with failing assumptions as ignored. Custom runners may behave differently.

То что надо! После рефакторинга вышло что-то такое:

assumeTrue(db.isNotLocked());
db.lock();
// do stuff with db

Работает, как и ожидалось: если база занята - тест пропускается, иначе - выполняется как следует.
Надеюсь, пригодится в написании интеграционных тестов.

Хорошего дня!