2017-06-28 31 views
0

我有一个单元测试某个逻辑的参数化测试。有几个测试用例由NUnit TestCaseAttribute捕获。在NUnit中如何添加一个测试与另一个测试的所有参数一起运行?

现在我想利用完全相同的参数来测试一个稍微不同的逻辑。

我意识到我可以通过不同的属性传递参数 - 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. 
} 

它有一些问题,但。

所以,我的问题是这样的 - 是否有NUnit方式来运行测试方法Y与测试方法X的参数,其中后者使用TestCaseAttribute来提供参数?

我使用nunit 3.7.1

回答

1

实际答案很短。 NUnit重用参数的方式是TestCaseSourceAttribute。 :-)

我想我会解释为什么你的解决方案无法正常工作。

在NUnit 3+中,TestCaseTestCaseSource等属性不仅仅是数据的容器。它们实现了NUnit调用的接口,以使属性在特定的测试上运行。

您的代码正在处理TestCaseAttribute就好像它不过是参数的数据存储一样。但是这个属性实际上做了一些事情,其中​​一些与TestCaseSourceAttribute不一样。

从你的代码中,我可以看到你自己想出了一部分。您的第一个方法依赖于将double转换为decimal的属性,而第二个方法将该参数作为double。这种差异当然是由于你不能有一个属性的小数参数。

不幸的是,对于一个完整的解决方案,您将不得不复制或考虑两个属性之间的其他差异,这些全都归因于C#在属性参数上的限制。国际海事组织,这是不值得的。创建TestCaseData项的静态数组并将它们用于这两种方法是很简单的。如果你让自己的方法有效(这是可能的),那么它的聪明才是有利的。 :-)

相关问题