分离多个分类测试
本文关键字:测试 分类 分离 | 更新日期: 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"){
(...)
}
}
同样,尽管这应该是可能的,但我不建议这样做;它看起来很不寻常,也不太干净。当你决定做什么时,你肯定应该考虑哪种解决方案会让你的测试最清晰。