首页 > 解决方案 > 使 NUnit3 在整个测试套件中最后运行指定的测试

问题描述

由 Specflow 生成并由 NUnit 运行的最后一个 E2E 测试将是一个恶意的测试,它将锁定用户一段时间。我希望这个测试在整个套件中最后运行。

我发现Order(int)在 NUnit v3 中引入了属性,但这似乎不支持我想要的,因为我必须Order向所有其他测试添加属性,因为:

带有 OrderAttribute 参数的测试在没有该属性的任何测试之前开始。

问题:这是否可以让 NUnit 在套件中最后运行指定的测试(项目中检测到的所有其他现有测试)?如果是,那么如何?

标签: nunit

解决方案


首先,坏消息...

  1. NUnit 中没有全局的测试顺序。允许您在OrderAttribute命名空间套件中的特定夹具或夹具中订购测试。

  2. 即使在特定的包含套件中,也没有办法让测试最后运行,除非您在每个测试中添加 order 属性。

  3. 即使消除了前两个限制,排序也不能保证在测试开始之前早期的测试已经完成。如果测试是并行运行的,那么一旦有空闲线程运行它,最后一个测试就会启动。但是,我不清楚这对你来说是否有问题。

稍微好一点的消息是有几个解决方法。

您可以在运行OneTimeTearDown结束时运行一个方法。为此,您需要SetUpFixture在程序集中的任何已定义命名空间之外创建一个外部。在该夹具中的方法上放置一个[OneTimeTearDown]属性,并将最终测试的测试代码放在那里。这样做的一个缺点是任何断言失败都不会报告为“失败”,而是报告为“错误”。但是,这对您来说可能无关紧要。

第二种更简洁的解决方法是将一个测试放在单独的程序集中。只有在第一个程序集运行后,才在 CI 脚本中运行该程序集。您还可以在 nunit3-console 的命令行中包含这两个程序集。如果您指定--agents=1这两个组装过程将按命令行上列出的顺序依次运行。


推荐阅读