单元测试——多次运行的最佳实践

本文关键字:最佳 运行 单元测试 | 更新日期: 2023-09-27 17:52:59

我想找到最好的方法(最少的代码/努力)运行一堆不同的测试与变化的数据和环境。

例如,现在我有一个测试:

public void TestI32(Type inspectable, MemberInfo member)
{
Assert...
}

我想要什么:

[TestMethod]
public void ClassTests()
{
  var arg1 = ...
  TestI32(arg1, arg2, "Class");
  TestI16(arg1, arg2, "Class");
  TestFoo(arg1, arg2, "Class");
  TestBar(arg1, arg2, "Class");  
}

并让每个方法调用显示为一个单独的测试,该字符串作为名称的一部分。

我还想从32位和64位进程中重复所有测试。我最近发现了一个只在单元测试中出现的bug,因为mstest在32位进程下运行测试(很多不安全的代码……

此外,我不绑定使用mstest,但visual studio集成将是很好的。在未来,与构建脚本/持续集成的简单集成也会很好。

单元测试——多次运行的最佳实践

如果您想让每个测试显示为不同的报告结果,那么将test32封装在每组条件中。有点像这样……

[TestMethod]
public void TestA()
{
  var result = TestI32(arg1, arg2);
  Assert.IsTrue(result); // or whatever your assertion is.
}
[TestMethod]
public void TestB()
{
  var result = TestI32(arg3, arg4);
  Assert.IsFalse(result); // or whatever your assertion is.
}
从测试执行的角度来看,

位应该无关紧要,您是在测试代码而不是它的依赖项。考虑将测试重点放在bug周围的区域(如果它真的是位错误而不是你的代码)。

你可以在VS 2013中打开64位测试(完整的说明在这里)

从Visual Studio菜单中选择"测试",然后选择"设置",然后然后选择"处理器架构"。选择x64以运行测试64位的过程。

如果你不介意使用NUnit(如果从Nuget安装了NUnit TestAdapter包,你就可以与VS集成),你可以使用TestCaseSource属性。你可以用它来指向一个属性/字段甚至一个方法。例如:

[TestCaseSource("SomeMethodSource")]
public void TestSomeStuff(int x, int y, string text) {
}
private IEnumerable SomeMethodSource() {
    int someValue = 1;
    return new object[] {
        new object [] {someValue++,2, "Case1"},
        new object [] {someValue++,5, "Case2"}
    };
}

命名为:

的测试结果
  • TestSomeStuff(1、2、"Case1")
  • TestSomeStuff(2 2例2)

如果您不喜欢基于提供给测试的参数的默认命名,您也可以提供一个TestName,尽管它有点复杂。

您可以将Xunit及其理论属性与内联数据属性结合使用,以管道输入您的值