- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在大量使用 NUnit TestCase
属性。因为我的一些测试用 20 多个 TestCase
属性注释,定义了 20 多个测试用例。但是,我想测试所有 20 个测试用例,并用一个额外的值表示,可以是 1 或 0。这对我来说意味着不同 测试用例。这很容易用 ValuesAttribute
实现:
我现在的状态:
[TestCase(10, "Hello", false)] // 1
[TestCase(33, "Bye", true)] // 2
// imagine 20+ testcase here)]
[TestCase(55, "CUL8R", true)] // 20+
public void MyTest(int number, string text, bool result)
我想做类似的事情(我做不到:)
[TestCase(10, "Hello", false)] // 1
[TestCase(33, "Bye", true)] // 2
// imagine 20+ testcase here)]
[TestCase(55, "CUL8R", true)] // 20+
public void MyTest([Values(0,1)] int anyName, int number, string text, bool result)
我为什么要这样做?因为这 40+ 种组合意味着不同的测试用例。不幸的是,NUnit 不允许同时使用 [TestCase
] 和 [Values
] 属性,测试运行器希望完全与它列出的参数数量相同在 TestCaseAttribute
中。 (我能理解架构师,但还是……)我唯一能弄清楚的是:
[TestCase(1, 10, "Hello", false] // 1
[TestCase(1, 33, "Bye", true] // 2
// imagine 20+ testcase here]
[TestCase(1, 55, "CUL8R", true] // 20
[TestCase(0, 10, "Hello", false] // 21
[TestCase(0, 33, "Bye", true] // 22
// imagine 20+ testcase here]
[TestCase(0, 55, "CUL8R", true] // 40
public void MyTest(int anyName, int number, string text, bool result)
所以我最终被迫犯了复制和粘贴的罪过,我复制了 TestCases,现在我有 40+。必须有某种方式......如果不仅是(0,1)值的范围而且是0,1,2,3怎么办。我们将以 80 多个复制的测试用例结束?
我错过了什么?
提前致谢
最佳答案
这对我来说是第一页搜索结果,尽管它已经过时了,但我想要比现有解决方案更轻便的东西。
对测试用例使用另一个 ValuesAttribute
或 ValueSourceAttribute
允许组合,但诀窍是在使用它们时将一组链接值作为单个案例获取 - 每个都会影响只有一个命名参数。
属性需要编译时常量输入。这允许您创建一个文字数组,但如果您的值是不同类型的,则您必须将该数组设置为通用基类型,例如 object
。您还必须按索引访问项目。我喜欢简短、明显的单元测试;解析数组使测试看起来很忙和困惑。
一个简洁的解决方案是将 ValueSource
属性与提供元组的静态方法一起使用。此方法可以紧接在测试方法之前,并且只比使用 TestCase
属性更冗长一点。使用问题中的代码:
public static (int, string, bool)[] Mytest_TestCases()
{
return new[] {
(10, "Hello", false),
(33, "Bye", true),
(55, "CUL8R", true)
};
}
[Test]
public void Mytest(
[Values(0,1)] int anyName,
[ValueSource(nameof(Mytest_TestCases))] (int number, string text, bool result) testCase)
ValueSource
之后的参数是一个名为 testCase
的元组,其内容的命名与原始测试用例参数相匹配。要在测试中引用这些值,请在其前面加上元组的名称(例如 testCase.result
而不仅仅是 result
)。
如此处所写,将运行六个测试 - 每个可能的 anyName
和 testCase
组合一个。
我不介意像本例中的简单数据的元组,但我更进一步定义了一个非常简单的类来代替元组。用法基本相同,只是您不在参数中命名成员。
public class Mytest_TestCase
{
public Mytest_TestCase(int number, string text, bool result)
{
Number = number;
Text = text;
Result = result;
}
public int Number;
public string Text;
public bool Result;
}
public static Mytest_TestCase[] Mytest_TestCases()
{
return new[] {
new Mytest_TestCase(10, "Hello", false),
new Mytest_TestCase(33, "Bye", true),
new Mytest_TestCase(55, "CUL8R", true)
};
}
[Test]
public void Mytest(
[Values(0,1)] int anyName,
[ValueSource(nameof(Mytest_TestCases))] Mytest_TestCase testCase)
测试用例类定义可以移到测试类的底部,或移到单独的文件中。就个人而言,我更喜欢将两者都放在测试类的底部 - 如果您想在测试旁边查看定义,您可以随时查看定义。
关于c# - 有没有办法将 NUnit TestCaseAttribute 与 ValuesAttribute 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23974792/
我想做这样的事情 [Test] public void Test([Values(new DateTime(2010, 12, 01), new Da
我正在大量使用 NUnit TestCase 属性。因为我的一些测试用 20 多个 TestCase 属性注释,定义了 20 多个测试用例。但是,我想测试所有 20 个测试用例,并用一个额外的值表示,
我是一名优秀的程序员,十分优秀!