DbUnit, как защититься от одновременного запуска нескольких тестов?

Я работаю над тестовой средой для проекта и изучаю использование DbUnit.NET для тестирования взаимодействия с базой данных. Но у меня есть один очень большой вопрос:

Мы работаем против Oracle, и создание отдельного тестового экземпляра БД для каждого разработчика действительно невозможно (тем более, что у нас есть только 1 администратор базы данных, который уже привязан ко времени). Это означает, что все разработчики и наш сервер непрерывной интеграции должны использовать одну и ту же схему БД.

Итак, перейдем к вопросу: есть ли хороший способ предотвратить одновременное тестирование более чем 1 человека? Было бы легко поместить в таблицу базы данных запись, указывающую на то, что тест выполняется, а затем удалить ее после завершения тестов, но NUnit не имеет возможности запускать что-либо в начале и в конце тестового сеанса.

Любые другие мысли? Похоже, это должно быть довольно распространенной проблемой... или все действительно запускают отдельные экземпляры БД для каждого разработчика/тестировщика, который может запускать тесты?


person CodingWithSpike    schedule 30.07.2009    source источник


Ответы (3)


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

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

Единственное место, где мы столкнулись с проблемой, это когда разработчик хотел пройти тест в режиме отладки. Это заблокировало бы любых других разработчиков, которые хотели бы запустить тест, пока он не выпустит отладчик. Мы записали имя текущего пользователя в фиктивную таблицу и заставили механизм блокировки выводить сообщение, если он был заблокирован более чем на 30 секунд: «В настоящее время Боб выполняет тест, и это было в течение последних 5 минут».

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

person Don Kirkby    schedule 30.07.2009
comment
Это в основном то, что я думал, что я буду делать. Моя большая проблема заключается в том, что я имею дело с МНОЖЕСТВОМ устаревших pl/sql (значительно более 10 тысяч строк) и триггерами практически для каждой таблицы, и все это в настоящее время не проверено. Так что я должен пройти через Oracle и все его триггеры и sprocs, иначе я хотел бы просто настроить SQLite DB в памяти или что-то в этом роде... Спасибо за вклад! - person CodingWithSpike; 30.07.2009

Вы можете использовать атрибут [TestFixtureSetUp], чтобы внедрить свой флаг, указывающий, что тесты выполняются, как способ имитации «настоящего» семафора.

person Paul Sonier    schedule 30.07.2009

Что-то, что я сделал в проблеме с некоторым сходством с этой:

В программе была переменная конфигурации, которая была добавлена ​​перед всеми соответствующими элементами. У каждой станции была своя настройка, при правильной настройке не было бы конфликтов.

person Loren Pechtel    schedule 30.07.2009