在我的 UI 测试中,我创建了自定义属性 [TestCaseId] 以在测试中使用:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class TestCaseIdAttribute : PropertyAttribute
{
public TestCaseIdAttribute(int testCaseId)
: base(testCaseId.ToString()) { }
}
我在这里使用:
(我在 [TearDown] 中使用它来将 Azure 测试标记为自动化,但这里不相关)
[TestCaseId(123456)]
[Test]
public void TestScenario_1()
{
Assert.That(true);
}
这按预期工作,我通过以下方式访问 TestCaseId:
_testContext.Test.Properties["TestCaseId"].First();
来检索值。
当我使用 [TestCase] 属性而不是 [Test] 时,如下所示:
[TestCaseId(123456)]
[TestCase(1, 2)]
public void TestScenario_1(int arg0, int arg1)
{
Assert.That(arg0 != arg1);
}
我通过以下方式访问:
_testContext.Test.Method.MethodInfo.CustomAttributes.FirstOrDefault(a => a.AttributeType.Name == "TestCaseIdAttribute").ConstructorArguments[0].Value;
但是,我不知道如何读取每个 [TestCase] 具有不同自定义属性 [TestCaseId] 的 TestCaseId,如下所示:
[TestCaseId(123456)]
[TestCase(1, 2)]
[TestCaseId(666666)]
[TestCase(9, 8)]
public void TestScenario_1(int arg0, int arg1)
{
Assert.That(arg0 != arg1);
}
知道如何将 [TestCaseId] 属性与每个 [TestCase] 相匹配吗?
我尝试将
_testContext.Test.Method.MethodInfo.CustomAttributes
中的对象与我的 TestName 相匹配,但其中不包含任何测试名称。
最好以与 [Test] 相同的方式为 [TestCase] 分配一个属性。 我使用 NUnit 4。
Test
属性会在您的装置中生成单个测试用例。
TestCase
属性在测试套件内生成多个测试用例,也嵌套在测试装置内。这就是为什么在使用
TestCase
时必须使用不同的表达式来检索我们的测试用例 id。NUnit 理解这一点,但 .NET 和 C# 不理解。 .NET 只知道有一个属性,但它对测试用例等一无所知。它只能将自定义属性放置在它理解的构造上。因此,每个属性都适用于代码中的下一个元素,该元素允许接受属性。
在最后一个示例中,有两个
TestCase
和两个
TestCaseId
属性,下一个可以采用属性的元素是方法。所有四个属性都适用于该方法。您可以按照您喜欢的任何顺序对四个属性重新排序,结果将是相同的,因为该顺序对 .NET 没有任何意义。当 NUnit 在方法上找到
TestCaseAttribute
时,它知道要做什么:使用该属性上指定的值和属性创建一个测试用例。当它在方法上找到
PropertyAttribute
时,它只是分配该属性。它没有从 .NET 收到任何信息来告诉它您打算将该属性应用于特定的测试用例。到目前为止,有很多关于它为什么不起作用的信息。那么如何才能让它发挥作用呢?不幸的是,
TestCaseAttribute
没有提供在测试用例上设置属性的方法。您可以(错误)使用其他字段(例如“描述”)来实现此目的,但我不建议这样做。这是我将改用
TestCaseSourceAttribute
的地方,它提供了许多超出
TestCaseAttribute
支持的功能。你的最后一个例子可能会变成......
static TestCaseData[] Scenario_1_Cases
{
new TestCaseData(1, 2) {Properties = { { "TestCaseId", "123456"} } };
new TestCaseData(9, 8) {Properties = { { "TestCaseId", "666666"} } };
}
[TestCaseSource(nameof(Scenario_1_Cases)]
public void TestScenario_1(int arg0, int arg1
{
Assert.That(arg0 != arg1);
}