如何串行运行NUnit测试装置?

28

我有几套使用C#/NUNit实现的集成测试套件。每个测试套件都是一个独立的类,每个固定装置设置都会从脚本创建并填充SQL Server数据库。这在Resharper 5.1之前都可以正常工作。

不幸的是,Resharper 5.1开始同时运行多个Fixture(测试),这是一个破坏性的变化 - 它们都试图创建和填充相同的数据库,显然会造成混乱。是否有办法让Resharper按顺序串行运行我的测试Fixture?

如果不能,您会建议我以什么方式按顺序串行运行我的NUnit测试Fixture,一次只运行一个Fixture?单个测试运行的顺序无关紧要。


2
你是指串行吗?顺序执行意味着测试运行的顺序很重要。串行只是意味着它们一个接一个地运行,但顺序并不重要。 - Davy8
@Davy8:是的,我已经按顺序纠正了问题,谢谢! - A-K
4个回答

25

我不知道是否有可能防止ReSharper并行运行测试; 如果不行,下面的技巧可能有效:创建一个静态类,并在其中创建一个静态的只读Monitor成员。然后,在[TestFixtureSetUp]中调用监视器上的Enter()方法,在[TestFixtureTearDown]中调用监视器上的Exit()方法。这样,一次只能运行一个测试夹具。虽然不太美观...


2

您确定吗?我刚试过了...通过在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

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();
    }
}

这样做不起作用 - 这些是测试夹具,而不是单个测试。每个都会从头开始创建一个新的数据库。 - A-K
@AlexKuznetsov:啊,我现在明白了,我没有好好读第一段。 - Aasmund Eldhuset
1
如果你使用[TestFixtureSetUp][TestFixtureTeardown]呢? - Mike Two

0

给它们字母名称,即在它们前面加上一个表示运行顺序的字母。如果您需要这样做,您应该能够接受这种不好听的命名约定。


当然,您可以考虑重构测试以便能够在每个fixture中使用自己的sqlite实例运行,这可能需要一些时间,但更加诚实。 - Mark Dickinson
Resharper能保证始终按字母顺序运行测试吗?4.1版本并不是这样的——它按从上到下的顺序运行测试。而5.1版本则按字母顺序排列。 - A-K
@Alex:我昨天试了一下,它按字母顺序一个接一个地运行我的测试夹具。虽然我们总是更喜欢不依赖于此来使测试工作,因为任何测试都应该独立存在,否则它就不是真正的单元测试。我找不到任何设置来使测试并行运行,但我没有早期版本。 - Mark Dickinson
1
仅仅是浏览了其他帖子,我对resharper并行运行测试夹具很感兴趣。但这在我的机器上并没有发生,一个测试夹具组件中的一组测试夹具会以串行方式运行,如果我点击对该组件运行测试。 如果这就是发生的事情,那么使用 TestFixtureTearDown 将给您机会删除数据库,并在下一个夹具中重新创建它。抱歉这并没有太大帮助,我无法复制并行夹具场景。 - Mark Dickinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接