DbUnit, как защититься от одновременного запуска нескольких тестов? - PullRequest
0 голосов
/ 30 июля 2009

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

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

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

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

Ответы [ 3 ]

1 голос
/ 30 июля 2009

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

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

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

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

1 голос
/ 30 июля 2009

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

0 голосов
/ 30 июля 2009

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

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

...