我有一个参数化测试,该测试测试了某个逻辑。Nunit TestCaseAttribute
捕获了几个测试用例。
现在,我希望利用完全相同的参数来测试略有不同的逻辑。
我意识到我可以通过其他属性-TestCaseSourceAttribute
传递参数,并将相同的源用于多个单位测试。
但是我想知道是否可以使用TestCaseAttribute
(在此特定测试中我发现更方便(并重用参数进行另一个测试?
我的解决方案涉及反射:
[TestCase(Impl.SqlErrorCode.PartiallyDocumentedColumn, 1978.14, "MyTable", ChangeTypeCode.AddTable, "dbo.MyAuxTable:MyTableId")]
[TestCase(Impl.SqlErrorCode.UndocumentedColumn, 1978.15, "MyAuxTable", ChangeTypeCode.AddTable, "dbo.MyAuxTable:MyAuxTableId")]
[TestCase(Impl.SqlErrorCode.UndocumentedColumn, 1978.16, "MyTable", ChangeTypeCode.AddTable, "dbo.MyTable:MyAuxTableId")]
[TestCase(Impl.SqlErrorCode.NonExistingColumnInComments, 1969.19, "MyTable", ChangeTypeCode.None, "dbo.MyTable:Remarks")]
public async Task AddTableWithBadComments(Impl.SqlErrorCode expectedSqlErrorCode, decimal step, string tableName, int sqlErrorState, string expectedObjectName)
{
// ...
}
private static IEnumerable GetParametersOfAnotherTest(string testName)
{
var testCaseAttrs = typeof(IntegrationTests).GetMethod(testName).GetCustomAttributes<TestCaseAttribute>();
return testCaseAttrs.Select(a => a.Arguments);
}
[TestCaseSource(nameof(GetParametersOfAnotherTest), new object[] { nameof(AddTableWithBadComments) })]
public async Task AddTableWithBadCommentsNoVerify(Impl.SqlErrorCode expectedSqlErrorCode, double _step, string tableName, int sqlErrorState, string expectedObjectName)
{
// A different logic, but with the same parameters.
}
它有一些问题。
那么,我的问题是 - 是否有一种使用测试方法x的参数运行测试方法y的方法,其中后者使用 TestCaseAttribute
提供参数?
我使用nunit 3.7.1
实际答案很短。重用参数的Nunit方法是TestCaseSourceAttribute
。: - (
我想我会解释您的解决方案为什么不起作用。
在Nunit 3 中,诸如TestCase
和TestCaseSource
之类的属性不仅是数据容器。他们实现了Nunit调用的接口,以便将特定测试的属性运行。
您的代码正在处理TestCaseAttribute
,就好像它只是一个数据存储的参数一样。但是该属性实际上有些事情,其中一些与TestCaseSourceAttribute
不同。
从您的代码中,我可以看到您自己弄清楚了一部分。您的第一个方法依赖于属性将双重转换为十进制,而第二个方法将参数视为双重。当然,这种差异是因为您不能对属性有小数的论点。
不幸的是,要进行完整的解决方案,您必须重复或为两个属性之间的其他差异提供津贴,这都是由于属性参数上的限制C#c#位置。IMO,这是不值得的。创建一个静态的测试castedata项目并将其用于两种方法是微不足道的。如果您使方法起作用(这是可能的(,那么唯一的优势将是它的聪明。: - (