分开多个分类测试

时间:2015-11-20 10:31:51

标签: c# unit-testing nunit

我有很多测试用例,根据他们的类别,他们的工作方式不同 例如:

[Test]
[Category("Category1")
[Category("Category2")
private void DoSomething1()
{
    if(((System.Collections.ArrayList)
        TestContext.CurrentContext.Test.Properties["_CATEGORIES"]).Contains("Category2")
    {
        //Doing something specific by Category2
    }

    if(((System.Collections.ArrayList)
        TestContext.CurrentContext.Test.Properties["_CATEGORIES"]).Contains("Category1")
    {
        //Doing something specific by Category1
    }            
}

问题在于,当我通过选择Category2从NUnit开始测试过程时,DoSomething1应该只运行Category2特定情况。代码重复不是一种选择。

我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

在我看来,好像你应该将它作为两个或更多不同的测试运行,正如@Chase在评论中提到的那样。

当我在你的问题中看到你的测试时,它立刻让我觉得这似乎很复杂/不清楚。您似乎正试图反对NUnit和单元测试如何工作,并且打算工作。

根据我的经验,一个好的单元测试是我几乎不需要全神贯注地去理解它的作用的单元测试。上面的例子本身可能不是很复杂,但用这种方式做事似乎不太常见,它可能会混淆未来的读者,这是你在单元测试中真正想要避免的;因为它的目的是验证主代码的正确性,所以测试本身应该尽可能简单,以便将测试中出错的几率降低到绝对最小值。

从您的代码中看,简单地复制测试似乎是合乎逻辑的,而是使用两个单独的类似测试。

PS:如果绝对想要在多个测试中使用通用逻辑,那么有以下选项,这些选项应该限制NUnit的运行 - 但是很难从你的NUnit中看到有限的例子是否在你的特定情况下有意义:

[Test]
[Category("Category1")
private void DoSomethingForCat1()
{
    TestSomeStuff("category1");
}

[Test]
[Category("Category2")
private void DoSomethingForCat2()
{
    TestSomeStuff("category2");
}


private void TestSomeStuff(string category)
{
    if(category == "Category1"){
        (...)
    }
    else if(category == "Category2"){
        (...)
    }
}

同样,虽然这应该是可能的,但我不推荐它;它似乎很不寻常,也不是很干净。当你决定做什么时,你一定要考虑哪种解决方案能让你的测试最清晰。

相关问题