我在C#/ NUNit中实现了几套集成测试。每个测试套件都是一个单独的类,每个夹具设置从脚本创建并填充SQL Server数据库。在Resharper 5.1之前,这一切都很好用。
不幸的是,Resharper 5.1开始同时运行几个灯具。这是一个重大改变 - 他们都在尝试创建和填充相同的数据库,这显然最终会陷入混乱。有什么方法可以让Resharper连续运行我的测试夹具吗?
如果没有,你会建议连续运行我的NUnit测试夹具,一次一个夹具? 单个测试运行的顺序无关紧要。
答案 0 :(得分:23)
我不知道是否可以阻止ReSharper并行运行测试;如果没有,以下hack可能会起作用:使用静态只读Monitor
成员创建一个静态类。然后,在[TestFixtureSetUp]
中,在监视器上呼叫Enter()
,并在Exit()
中呼叫监视器上的[TestFixtureTearDown]
。这样,一次只允许运行一个测试夹具。虽然不漂亮......
答案 1 :(得分:1)
你确定吗?我只是尝试了这个...通过在3个差异NUnit灯具中测试下面的形式的跟踪,然后是“全部运行”。似乎没有并行运行。
Trace.WriteLine(DateTime.Now.ToString("hh:mm:ss.ffff") + "VC:Start");
Trace.WriteLine(DateTime.Now.ToString("hh:mm:ss.ffff") + "VC:Done");
我看到的输出是:(R#Build 5.1.1753.1)
01:06:41.6639IOC
01:06:41.6649Done - IOC
01:06:41.6679VC:Start
01:06:41.6729VC:Done
01:06:41.2439Mef
01:06:41.6589Mef-Done
答案 2 :(得分:0)
除非被测试的代码执行自己的事务管理,否则您可以在事务中运行每个测试。这样,不同的测试不会互相干扰。此外,您不必担心每次测试后都要清理,因为每次测试的事务都可以在测试完成后中止。
在我们的项目中,我们通常让我们的集成测试来自一个看起来或多或少的类:
public class TransactionalTestFixture
{
private TransactionScope TxScope;
[SetUp]
public void TransactionalTestFixtureSetUp()
{
TxScope = new TransactionScope(TransactionScopeOption.RequiresNew,
new TransactionOptions {IsolationLevel = IsolationLevel.Serializable});
}
[TearDown]
public void TransactionalTestFixtureTearDown()
{
TxScope.Dispose();
}
}
答案 3 :(得分:0)
为它们添加字母名称,即在它们前面加上表示其运行顺序的字母。如果您需要这样做,您也应该能够接受这个令人讨厌的命名约定。