每个 [TestCase] 的 NUnit 自定义属性

问题描述 投票:0回答:1

在我的 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。

nunit custom-attributes testcase
1个回答
0
投票
如您所知,

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); }
    
© www.soinside.com 2019 - 2024. All rights reserved.