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

时间:2015-06-03 17:29:15

标签: c# unit-testing visual-studio-2013

我想找到最好的方法(最少的代码/努力)来运行一系列不同的测试,改变数据和环境。

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

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位进程的所有测试。我最近发现了一个只出现在单元测试中的错误,只是因为mstest在32位进程下运行测试(很多不安全的代码......

另外,我并不依赖于使用mstest,但视觉工作室集成会很好。将来,与构建脚本/持续集成的轻松集成也会很好。

3 个答案:

答案 0 :(得分:1)

如果您希望将每个测试显示为不同的报告结果,请在每组条件中包装TestI32。有点像......

[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.
}

从测试执行的角度来看,Bitness无关紧要,您正在测试代码而不是其依赖项。考虑将测试集中在bug周围的区域(如果它真的是一个错误而不是你的代码)。

您可以在VS 2013中启用64位测试(完整说明here

  

从Visual Studio菜单中选择“测试”,然后选择“设置”   然后选择Processor Architecture。选择x64以将测试作为a运行   64位进程。

答案 1 :(得分:0)

你可以将Xunit及其理论属性与inlinedata属性结合使用来管道你的值

答案 2 :(得分:0)

如果您不介意使用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&#34)

如果你不喜欢默认命名,根据提供给测试的参数,你也可以提供一个TestName,虽然它有点复杂。