如何在visual studio中使用NUnit强制测试最后一次运行
本文关键字:NUnit 测试 运行 最后一次 visual studio | 更新日期: 2023-09-27 18:03:49
所以在我的测试套件中,我有一个集成测试继承的抽象基类。此基类的每个派生都有自己的一组测试。子类所做的断言通过基类上的受保护方法运行。在这些断言期间,基类记录字典中已测试的值。在子类运行了它们所有的测试之后,我希望基类运行一个测试来验证测试了所有正确的东西。
一些免责声明:
- 是的,我知道这是一个有序的测试,那些是皱眉头的在。无论如何,这是我想做的事情。从某种意义上说,我知道这是一个测试我的测试套件的测试。虽然这是虽然经常被人嗤之以鼻,但我发现它很有用。如果你想让你的测试真正作为您的文档,最好有一些基本的验证文档中一些基本内容的测试例如,它是完整的。(在大多数项目中,这可能会太过分了,不值得。然而,在这个特殊的项目中,这既是一个个人项目,也是一个100%工作的实验代码覆盖率)。
目前,我已经用[Test]
和[TestFixtureTearDown]
标记了总结测试,这使得测试在最后运行。然而,这也意味着当测试失败时,测试套件会因为失败而生气。我想要的理想世界是像《RunLast》这样的东西。有什么办法可以做到这一点吗?
当前代码示例:
[TestFixture]
public abstract class AttributesTests : IntegrationTests
{
[Inject]
public IAttributesMapper AttributesMapper { get; set; }
protected abstract String tableName { get; }
private Dictionary<String, IEnumerable<String>> table;
private List<String> testedNames;
[TestFixtureSetUp]
public void FixtureSetup()
{
testedNames = new List<String>();
}
[SetUp]
public void Setup()
{
table = AttributesMapper.Map(tableName);
}
[Test, TestFixtureTearDown]
public void AllNamesTested()
{
var missingNames = table.Keys.Except(testedNames);
Assert.That(missingNames, Is.Empty, tableName);
}
[Test, TestFixtureTearDown]
public void NoNamesTestedNultipleTimes()
{
var duplicateNames = testedNames.Where(n => testedNames.Count(cn => cn == n) > 1).Distinct();
Assert.That(duplicateNames, Is.Empty, tableName);
}
protected void AssertAttributes(String name, IEnumerable<String> attributes)
{
testedNames.Add(name);
Assert.That(table.Keys, Contains.Item(name), tableName);
foreach (var attribute in attributes)
{
Assert.That(table[name], Contains.Item(attribute));
var actualAttributeCount = table[name].Count(a => a == attribute);
var expectedAttributeCount = attributes.Count(a => a == attribute);
Assert.That(actualAttributeCount, Is.EqualTo(expectedAttributeCount));
}
var extraAttributes = table[name].Except(attributes);
Assert.That(extraAttributes, Is.Empty);
}
}
这个适合我:
namespace ZZZ
public class ZZZZZ {
[Test]
public void ZZZZLastTest() {
// Whatever . . .
}
}
我知道没有明确的[LastTest]
-like属性,但我相信你可以用[Suite]
代替。
我知道这种JUnit套件方法将按照定义的顺序按线性顺序执行测试类(尽管不能保证在一个类内执行测试的顺序)。
@RunWith(Suite.class)
@SuiteClasses({ CalculatorTestAdd.class, CalculatorTestSubtract.class })
public class AllTests {
}
这里CalculatorTestSubtract
将最后执行。记住这一点,我想说你应该创建一个套件,在最后有你的总结测试。
查看NUnit文档,我看到一些东西应该是同样可能的:
namespace NUnit.Tests
{
using System;
using NUnit.Framework;
private class AllTests
{
[Suite]
public static IEnumerable Suite
{
get
{
ArrayList suite = new ArrayList();
suite.Add(new OneTestCase());
suite.Add(new AssemblyTests());
suite.Add(new NoNamespaceTestFixture());
return suite;
}
}
}
}
你必须做一些测试,看看它们是否被线性执行,因为ArrayList
不能保证被排序。