【问题标题】:.NET Unit Testing - How to to distinguish TestMethods from each other for variable initialization.NET 单元测试 - 如何区分 TestMethod 以进行变量初始化
【发布时间】:2017-08-05 03:38:20
【问题描述】:

我想在 [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初始化不同的变量了吗?

【问题讨论】:

  • 我最终根据本文所述的测试方法名称编写了条件。这是一个不错的功能。检查一下:stackoverflow.com/a/33895194/7201774 if (TestContext.TestName == "testMethodName")

标签: c# .net unit-testing


【解决方案1】:

这是我认为您正在努力完成的一个示例。声明一个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"

【讨论】:

  • 我不确定如何使用 [VariablesContainLetters] 或 [VariablesContainNumbers] 装饰器。现在的方式他们不会工作。我相信我需要创建一个名为 VariablesContainLetters 的类,该类实现 System.Attribute 类才能使其正常工作。我不确定该怎么做,但我相信这是一个开始。
【解决方案2】:

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

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

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

例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-14
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多