分离多个分类测试

Separate multiple categorized tests

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

[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 和单元测试的一般工作方式,并且打算工作。

根据我的经验,一个好的单元测试是我几乎不需要思考就能理解它的作用的单元测试。上面的例子本身可能不是很复杂,但这样做似乎不寻常,并且可能会让未来的读者感到困惑,这是你在单元测试中真正想要避免的事情;因为它的目的是验证你的主要代码的正确性,所以测试本身应该尽可能简单,以将测试中出现错误的可能性降到绝对最低。

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


PS:如果您绝对想要对多个测试使用通用逻辑,则有如下选项,它们应该限制 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"){
        (...)
    }
}

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