.NET单元测试 - 如何区分TestMethods以进行变量初始化

时间:2017-08-04 18:18:18

标签: c# .net unit-testing

我想在[TestInitialize]方法中初始化常用的变量,但我不想为每个测试方法初始化相同的变量。有没有办法通过装饰器或类似的东西来区分测试方法?例如

[TestInitialize]
public Setup()
{
     //pseudocode
     if VariablesContainLetters
       var1 = a; var2 = b; var3 = c;
     else if VariablesContainNumbers
       var4 = 1; var5 = 2; var6 = 3;
}

[TestMethod]
[VariablesContainLetters]
public method1() {}

[TestMethod]
[VariablesContainNumbers]
public method2() {}

这样我可以为不同的TestMethods初始化不同的变量吗?

2 个答案:

答案 0 :(得分:2)

这是我认为你想要完成的一个例子。如果您愿意,可以声明Dictionary您可以将string替换为其他类型。 Bool,int,甚至是对象。

[TestInitialize]
public Setup()
{
     Dictionary<string, string> variables = new Dictionary<string, string>();
     //pseudocode
     if VariablesContainLetters
       variables.Add("var1", "a");
       variables.Add("var2", "b");
     else if VariablesContainNumbers
       variables.Add("var4", "1");
       variables.Add("var5", "2");
}

[TestMethod]
[VariablesContainLetters]
public method1() {MessageBox.Show(variable["var1"]);} //prints "a"

[TestMethod]
[VariablesContainNumbers]
public method2() {MessageBox.Show(variable["var4"]);} //prints "1"

答案 1 :(得分:1)

一个可能的解决方案是在测试类中创建私有方法,以您想要的不同方式初始化变量。

然后,在每个单元测试中,让测试的第一行调用所需的设置方法,然后继续进行其余的测试。

我认为这将为未来的测试维护者带来更易读的设计。

例如:

[TestMethod]
public void UnitTest_Testing_Letters()
{
  InitializeUsingLetters();
  // ...
  // The rest of your unit test
  Assert.AreEqual(a, _var1);
}

[TestMethod]
public void UnitTest_Testing_Numbers()
{
  InitializeUsingNumbers();
  // ...
  // The rest of this unit test
  Assert.AreEqual(1, _var4);
}

private void InitializeUsingLetters()
{
  _var1 = a;
  // ...
}

private void InitializeUsingNumbers()
{
  _var4 = 1;
  // ...
}