2009-01-02 35 views
2

[编辑(哈伦):Duplicate]在数据库事务中自动换行单元测试?

我正在寻找一种能够自动换我NUnit的集成测试在DB的事务,因此由测试所做的更改,当测试结束自动回滚。理想情况下,我会用一个自定义属性修饰某些测试方法,这会在测试开始时导致NUnit创建一个事务,并在测试结束时将其回滚;我可以编写属性,但我不知道要添加到哪里检查它。

测试DB大小为3GB,因此在每次测试开始时恢复它不是一个选项。我知道我可以在每个测试的主体中手动创建一个事务,但我正在寻找更优雅的东西。

也许有一个IL-rewriting工具(可能是AOP框架),可以为我做这个?任何人有任何建议?

+0

这是一个http://stackoverflow.com/questions/321180/how-do-i-test-database-related-code-with-ununit(我也问过的问题!)的副本 – 2009-01-02 19:05:04

回答

3

有两个建议。首先是使用SetUp和TearDown属性来启动事务并在完成时将其回滚。在NUnit的这样做的文件是在这里:

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

如果你不想使用,其他选项我看到的是它在每一个方法的代码,但在使用使用一个TransactionScope实例声明来创建交易(提供者应该自动登记)。

当然,您也可以在SetUp和TearDown方法中创建TransactionScope实例。

+0

在当时自从我写这个问题以来,我已经使用了“使用”块和setup/teardown方法。当我只需要在灯具中回滚某些测试时,我使用“使用”。如果我想为我的所有测试使用此行为,则会向测试类添加自定义的“RollbackEveryTest”属性。我使用基础测试类的setup/teardown来检查属性并相应地管理事务。这并不完美,但它适用于常见情况。 – 2009-11-02 17:44:30

0

Spring.net?

我来自Java/JUnit背景,但我知道在Java中可以使用Springframework来完成此任务。

(您还必须从ApplicationContext/BeanFactory获取您的测试才能将AOP应用到它)。

4

难道你不会在嵌套事务中遇到麻烦吗?据我所知,大多数DB不支持事务内的事务。因此,如果被测试的代码完全使用事务(我认为如果您使用的是支持事务的数据库,那么您会使用它们),那么您真正想要的是嵌套事务,这是(我被告知)最数据库不直接支持。

+0

这是一个有效的观点。在我的情况下,我只关心SQL Server,但是我将你的回应称为“+1”,因为其他读者可能无法在前面做出区分。 – 2009-11-02 17:41:47