分离多个分类测试

本文关键字:测试 分类 分离 | 更新日期: 2023-09-27 18:22:46

我有很多测试用例,它们的工作方式应该不同,这取决于它们的类别
示例:

[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特定的情况。代码重复不是一种选择。

我怎么能那样做?

分离多个分类测试

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

当我看到你的问题中所写的测试时,我立刻想到这似乎很复杂/不清楚。您似乎试图反对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"){
        (...)
    }
}

同样,尽管这应该是可能的,但我不建议这样做;它看起来很不寻常,也不太干净。当你决定做什么时,你肯定应该考虑哪种解决方案会让你的测试最清晰。