Visual Studio C#单元测试 - 使用各种/多个测试初始化​​运行单元测试,多次运行相同的单元测试?

时间:2012-11-21 16:25:32

标签: c# visual-studio unit-testing vs-unit-testing-framework

我想做的是:

  1. 创建一系列单元测试。
  2. 创建各种不同的模拟初始化/组合,输入变量等。
  3. 根据一些参数,针对一组此类初始化运行每个给定的单元测试。
  4. 我将如何做这样的事情?

    是否已经有任何框架来处理这个问题(即,在更改初始化时多次运行给定的测试)?你能否提出任何可以用来做这件事的设计或想法?

    我知道单元测试框架的工作原理。我自己使用NUnit和Rhino模拟。

    下面显示的是我需要的一个例子。

    [Test Initialize]
    Setup( <-possible parameter-> )
    
    [Test Method]
    TestA()
    

    现在我希望TestA()多次运行。每次Test initialize都会选择另一个初始化组合。

    更多说明

    让我们假设测试需要变量A,B,C。它们中的每一个都是非常复杂的对象,最终结果是可以形成大量的组合。所以我希望以某种方式我可以创建一个测试初始化​​,可以迭代这样的组合列表,所以它会初始化它们,运行TESTA,返回列表中的下一个初始化,再次运行TESTA等等,直到列表用完了。接下来,它为TESTB选择另一个列表,然后再次执行此过程。

    至少我希望有一些能力能够运行给定的TEST功能n次。其余我知道我可以在可能的情况下建立

2 个答案:

答案 0 :(得分:8)

在nUnit中,您可以将[TestCase]属性用于简单类型:

[Test]
[TestCase("a", "b")]
[TestCase("c", "b")]
[TestCase("a", "d")]
public void TestMethod(string param1, string param2){
   // run your test with those parameters
}

或者您可以对复杂类型使用TestCaseSource方法:

[Test]
[TestCaseSource("GetTestCases")]
public void TestMethod(MyObject1 param1, MyObject2 param2){
   // run your test with those parameters
}

private IEnumerable GetTestCases(){
   yield return new TestCaseData( new MyObject1("first test args"), 
                                  new MyObject2("first test args"))
                        .SetName("SomeMeaningfulNameForThisTestCase" );
   yield return new TestCaseData( new MyObject1("2nd test args"), 
                                  new MyObject2("2nd test args"))
                        .SetName("SomeMeaningfulNameForThisTestCase2" );

}

您可以使用DataSource在MS-Test中执行类似操作: http://codeclimber.net.nz/archive/2008/01/18/How-to-simulate-RowTest-with-MS-Test.aspx

答案 1 :(得分:3)

通过创建包含所有测试函数的抽象基类,然后使用多个类继承该基类,每个类都有自己的设置函数,您可以在不需要任何特定于框架的插件的情况下执行此操作。

public abstract class MyTests
{
    [Test]
    public void TestOne()
    {
        ...
    }

    [Test]
    public void TestTwo()
    {
        ...
    }
}
[TestFixture]
public class FirstSetup : MyTests
{
    [Setup]
    public void Setup()
    {
        ...
    }
}

[TestFixture]
public class SecondSetup : MyTests
{
    [Setup]
    public void Setup()
    {
        ...
    }
}

我已经用其他语言完成了这项工作,但不确定各种C#框架将如何处理它。