DBUnit как защититься от нескольких тестов, выполняемых одновременно?
-
05-07-2019 - |
Вопрос
Я работаю над тестовой средой для проекта и изучаю возможность использования DbUnit.NET для проведения большого тестирования взаимодействия с базой данных.Однако у меня есть один очень важный вопрос:
Мы работаем против Oracle, и настройка отдельного экземпляра тестовой базы данных для каждого разработчика действительно неосуществима (тем более, что у нас есть только 1 администратор базы данных, который уже ограничен во времени).Это означает, что все разработчики и наш сервер непрерывной интеграции должны использовать одну и ту же схему базы данных.
Итак, перейдем к вопросу:есть ли хороший способ предотвратить одновременное тестирование более чем 1 человека?Было бы легко поместить запись в таблицу базы данных, которая указывает, что тест выполняется, а затем удалить ее после завершения тестов, но у NUnit нет никакого способа запустить что-либо в начале и конце тестового сеанса.
Есть еще какие-нибудь мысли?Кажется, что это должна быть довольно распространенная проблема...или все на самом деле запускают отдельные экземпляры БД для каждого разработчика / тестировщика, который может запускать тесты?
Решение
Мы использовали фиктивную таблицу с одной записью в качестве маркера блокировки, когда запускали тесты базы данных для группы разработчиков в общей базе данных. Мы фактически получили блокировку для каждого тестового примера в отдельности, так что разработчику, который хочет запустить один тестовый пример, не нужно ждать, пока другой разработчик, который запускает весь пакет, завершит работу. Мы сделали каждый тест настроенным на собственные данные - без переноса между методами тестирования.
Мы использовали механизм блокировки базы данных, чтобы фактически ставить тесты в очередь, вместо того, чтобы проваливать тест, когда кто-то другой уже запускает тест. Я думаю, что алгоритм блокировки Oracle немного отличается, поэтому я не знаю, как это будет работать.
Единственное место, где мы столкнулись с проблемами, это когда разработчик хотел пройти тест в режиме отладки. Это заблокировало бы любых других разработчиков, которые хотели запустить тест, пока он не выпустит отладчик. Мы записали имя текущего пользователя в фиктивную таблицу и заставили механизм блокировки напечатать сообщение, если оно заблокировано более чем на 30 секунд: «Боб в настоящее время выполняет тест и последние 5 минут». р>
Это было хорошо, но это было много работы, чтобы поддерживать. Мы старались сократить количество тестов базы данных и выполняем большинство наших тестов как чистые модульные тесты в памяти.
Другие советы
Вы можете использовать атрибут [TestFixtureSetUp], чтобы добавить свой флаг, который указывает, что тесты выполняются как способ имитации " true " семафор.
Кое-что, что я сделал в задаче, имеющей некоторое сходство с этой:
У программы была конфигурационная переменная, которая была добавлена перед всеми соответствующими элементами.У каждой станции были свои настройки, при правильной настройке конфликтов не возникало.