2012-11-21 262 views
6

我想要做的是这样的:Visual Studio C#单元测试 - 使用不同的/多个测试初始化​​运行单元测试,多次运行相同的单元测试?

  1. 创建一堆单元测试。
  2. 创建模拟初始化,输入变量等各种不同的排列/组合
  3. 运行每个给定的单元测试,针对基于一些参数的一组这样的初始化。

我该如何去做这样的事情?

是否有任何框架来处理这个问题(即,在更改初始化的同时多次运行给定的测试)?你能提出任何设计或想法,我可以做些什么来做到这一点?

我知道单元测试框架的作品。我自己使用NUnit和Rhino mock。

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

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

[Test Method] 
TestA() 

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

更多澄清

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

至少希望某些能力能够运行给定的测试函数n次。其余的我知道我可以建立一旦这是可能的

+5

有很多框架可用...请在提问前做一些搜索 – emartel

+2

你明白我在问什么吗? 我知道有很多框架,我使用它们中的两个或三个,我需要的是给定单元测试在初始化函数变化时反复运行。 –

回答

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#框架将如何处理它。

+0

嗯在测试初始化​​组合的数量将阻止我使用这种方法,他们可以完全字面上指数或我希望的方式是,他们会从可能的初始化列表中选择.. 我' m –

+0

那么是的,这种方法可能不适合你。 –

+0

另一方面,我不得不为3种不同的设置(3种不同的序列化器)运行相同的测试,这正是我所需要的。谢谢! –

7

在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"); 

} 

你可以在MS类似的东西 - 使用数据源的测试: http://codeclimber.net.nz/archive/2008/01/18/How-to-simulate-RowTest-with-MS-Test.aspx

+0

现在这看起来很有希望,我会试试:) –

相关问题