Автоматически переносить юнит-тесты в транзакции БД? - PullRequest
2 голосов
/ 02 января 2009

[Изменить (Харен): Дублировать ]

Я ищу способ автоматически обернуть мои интеграционные тесты NUnit в транзакцию БД, чтобы изменения, сделанные тестом, автоматически откатывались по окончании теста. В идеале я бы украсил некоторые методы тестирования пользовательским атрибутом, который заставлял бы NUnit создавать транзакцию при запуске теста и откатывать ее по окончании теста ... Я могу написать атрибут, но не знаю, куда добавить чек на это.

Размер тестовой БД составляет 3 ГБ, поэтому его восстановление в начале каждого теста не является возможным. Я знаю, что могу вручную создать транзакцию в теле каждого теста, но я ищу что-то более элегантное.

Возможно, есть инструмент перезаписи IL (может быть, AOP Framework), который может сделать это для меня? У кого-нибудь есть предложения?

Ответы [ 3 ]

4 голосов
/ 02 января 2009

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

3 голосов
/ 02 января 2009

Есть две рекомендации. Первый - использовать атрибуты SetUp и TearDown, чтобы начать транзакцию и откатить ее после завершения. Документация для этого в NUnit находится здесь:

http://www.nunit.org/index.php?p=setup&r=2.4.8

Если вы не хотите использовать это, другой вариант, который я вижу, состоит в том, чтобы закодировать его в каждом методе, но использовать экземпляр TransactionScope в операторе using для создания транзакции (провайдер должен автоматически подключиться).

Конечно, вы также можете создать экземпляр TransactionScope в методах SetUp и TearDown.

0 голосов
/ 02 января 2009

Spring.net?

Я пришел из Java / JUnit, но я знаю, что в Java вы можете сделать это с помощью Springframework.

(Вам также необходимо получить тест в ApplicationContext / BeanFactory, чтобы применить к нему AOP).

...