在NUnit中如何添加一个与另一个测试的所有参数一起运行的测试?

时间:2017-06-28 20:47:47

标签: nunit nunit-3.0

我有一个参数化测试单元测试某个逻辑。 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.
}

虽然有一些问题。

所以,我的问题是 - 有一种NUnit方法用测试方法X的参数运行测试方法Y,后者使用TestCaseAttribute来提供参数吗?

我使用nunit 3.7.1

1 个答案:

答案 0 :(得分:1)

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

我想我会解释为什么你的解决方案不起作用。

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

您的代码正在将TestCaseAttribute视为仅仅是参数的数据存储。但该属性实际上做了一些事情,其中​​一些与TestCaseSourceAttribute的做法不同。

从您的代码中,我可以看到您自己想出了部分内容。您的第一个方法依赖于将double转换为十进制的属性,而您的第二个方法将参数作为double。这种差异当然是因为您不能为属性提供小数参数。

不幸的是,对于完整的解决方案,您必须复制或考虑两个属性之间的其他差异,这些都归因于C#对属性参数的限制。 IMO,它不值得。创建TestCaseData项的静态数组并将它们用于两种方法都是微不足道的。如果你让你的方法有效(这是可能的),那么它的唯一优势就在于它的聪明才智。 : - )