【问题标题】:NUnit - Can't retrieve a category propertyNUnit - 无法检索类别属性
【发布时间】:2017-06-01 14:31:17
【问题描述】:

请记住,我是新手程序员,对 C# 非常陌生

我正在尝试在测试中使用“类别”属性,但每当我尝试以任何方式检索它时,我都没有运气。它要么失败,要么返回空白。我想我没有正确阅读它,但我找不到任何信息。

我的测试是这样的:

[TestCase(TestName = "Testing Purposes Only")]
[Category("TESTING")]
public void testingPurposesOnly()
{
    //Some testing code
}

目前,我想做的只是能够引用当前测试的类别值。我这样做是这样的:

LogMsg(TestContext.CurrentTest.Test.Property["Category"]);

我已经意识到这将返回一个类别的“列表”?就像我说的我是新手!

我想要做的就是访问我在测试标头中设置的类别,这样我就可以将它作为字符串传递给其他东西。最好的方法是什么?

提前致谢!

【问题讨论】:

    标签: c# automation nunit


    【解决方案1】:

    测试中的 CategoryAttributes 创建 Category 属性。他们中的任何一个都会为您提供测试中的类别列表。

    但是,从字里行间看,我猜您想要导致测试运行的类别。很抱歉,但你不能得到那个。

    1. 由于某个类别,该测试可能未被选中运行。也许它是按名称选择的,或者只是作为运行所有测试的一部分运行。

    2. 测试可能是由类别的逻辑组合选择的,也可能是名称、属性等其他内容。

    3. 所有这一切都是跑步者的事。坦率地说,您的测试与它无关。 NUnit 框架知道在运行测试时指定了哪些类别或其他过滤器,并将它们包含在 XML 报告中。它不会为您提供诸如“选择此特定测试是因为...”之类的信息

    4. 我的猜测是您正在尝试创建某种日志或报告。 NUnit 体系结构的意图是您将该代码放入一个单独的程序中,该程序读取结果文件或放入一个引擎扩展中。测试本身甚至不知道是哪个 runner 执行了它,更不用说为什么了。

    由于您是新手,我建议您先使用普通的 NUnit 一段时间,然后再尝试扩展它。 :-)

    【讨论】:

    • 您好查理,非常感谢您的反馈。当然,您完全正确,我正在尝试获取测试的类别,以便将其发送到外部报告工具(范围报告),以便该工具对结果进行分类。我可以在我的所有测试中设置一个单独的变量来做到这一点我只是希望使用类别,以便所有以前编写的测试都可以自动适应。不过感谢您提供的信息,为我节省了很多时间!
    【解决方案2】:

    代替

    [TestCase(TestName = "Testing Purposes Only")]
    [Category("TESTING")]
    public void testingPurposesOnly()
    {
        //Some testing code
    }
    

    使用如下类别:

    [TestCase(TestName = "Testing Purposes Only", Category = "TESTING")]
    public void testingPurposesOnly()
    {
        //Some testing code
    }
    

    在此之后,您可以使用与以下相同的代码访问类别:

    var categories = TestContext.CurrentContext.Test?.Properties["Category"];
    

    【讨论】:

      【解决方案3】:

      也许您可以直接使用反射提取属性:

      public class TestClass
      {
        [Category("TESTING")]
        public void TestMethod()
        {
          var method = typeof(TestClass).GetRuntimeMethod(nameof(TestClass.TestMethod)), new Type[]{});
          var attribute = method.GetCustomAttribute<Category>();
        }   
      }
      

      【讨论】:

      • 感谢您的回复。我想我将不得不做更多的阅读才能完全理解它。提取看起来如此简单的东西似乎是一种复杂的方法?例如,对于测试名称,它很简单: var name = TestContext.CurrentTest.Test.Name;我希望提取类别同样简单?就像我说的,新手
      • 据我所知,似乎没有办法获得运行测试的确切类别。您只能检索可用类别的集合。所以这只是从方法中获取属性的示例反射。也许不是正确的解决方案,但它可能会奏效。
      【解决方案4】:

      var categories = TestContext.CurrentContext.Test?.Properties["Category"];

      在测试方法中获取类别值的另一种方法是:

       var myAttribute = this.GetType().GetMethod("AddYourMethodName").GetCustomAttributes(true).OfType<CategoryAttribute>().FirstOrDefault();
              Console.WriteLine(myAttribute.Name);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2021-07-02
        • 2019-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多