在NUnit中,如何添加使用其他测试的所有参数运行的测试?

在NUnit中,如何添加使用其他测试的所有参数运行的测试?,nunit,nunit-3.0,Nunit,Nunit 3.0,我有一个参数化测试,单元测试某种逻辑。NUnit TestCaseAttribute捕获了几个测试用例 现在我希望使用完全相同的参数来测试稍微不同的逻辑 我意识到我可以通过一个不同的属性——TestCaseSourceAttribute传递参数,并将同一个源用于多个单元测试 但是我想知道是否可以同时使用TestCaseAttribute(我在这个特定的测试中发现它更方便)和将参数重新用于另一个测试 我的解决方案包括反思: [TestCase(Impl.SqlErrorCode.Partially

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

实际答案非常简短。重用参数的NUnit方法是TestCaseSourceAttribute.:-

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

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

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

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

不幸的是,对于完整的解决方案,您必须复制或考虑两个属性之间的其他差异,这都是由于C对属性参数的限制。依我看,这不值得。创建TestCaseData项的静态数组并将其用于这两种方法非常简单。如果你使你的方法可行,那么它唯一的优点就是它的聪明-