NUnit - 同名的多个属性?链接到要求

时间:2014-03-05 02:22:02

标签: testing nunit visual-studio-2013 system-testing

我将所有系统测试链接到测试用例和我们的要求。每个要求都有一个ID。每个测试用例/系统测试都会测试各种要求。每个代码模块都链接到多个要求。

我正在努力寻找将每个系统测试与其驾驶要求联系起来的最佳方式。

我希望做类似的事情:

    [NUnit.Framework.Property("Release", "6.0.0")]
    [NUnit.Framework.Property("Requirement", "FR50082")]
    [NUnit.Framework.Property("Requirement", "FR50084")]
    [NUnit.Framework.Property("Requirement", "FR50085")]
    [TestCase(....)]
    public void TestSomething(string a, string b...)

然而,由于属性是键值对,因此会破坏。系统不允许我使用相同的键具有多个属性。

我想要这样做的原因是,如果模块发生变化,可以测试我们系统中的特定要求。

不是在每个构建上运行超过1,000个系统测试,而是允许我们根据对代码所做的更改来定位要测试的内容。

一些系统测试运行时间超过5分钟(企业医疗保健系统),因此“只运行所有这些”并不是一个可行的解决方案。我们这样做,但只是在通过我们的环境推广之前。

思想?

2 个答案:

答案 0 :(得分:2)

您是否考虑过来自NUnit.Framework.Property的{​​{3}}?

类似下面的内容似乎可能对您的custom property attribute“查询”进行判断,语言设置为 C#Program 并引用nunit.framework.dll(版本2.4) .8)补充说:

// main method to exercise a our PoC test case
void Main()
{
    TestSomething("a", "b");
}

// our PoC custom property attribute
[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
public class RequirementsAttribute : NUnit.Framework.PropertyAttribute
{
    public RequirementsAttribute(string[] requirements)
        : base(requirements)
    {
    }
}

// a test case using our custom property attribute to relate it to multiple requirements
[Requirements(new string[] { "FR50082", "FR50084" })]
[TestCase("PoCTest")]
public void TestSomething(string a, string b)
{
    // blah, blah, blah

    Assert.AreNotEqual(a, b);
}

答案 1 :(得分:0)

出于某种原因,我无法将谷歌讨论帖的链接添加到上面的评论中,所以我也在这里添加了帖子。 (链接为https://groups.google.com/forum/#!topic/nunit-discuss/ndV3VTPndck

  1. 类别总是在TE中显示为"类别[xxxxxxx]",其中xxxxx是您发送的任何字符串,如果您没有指定任何字符串,它将是从CategoryAttribute派生的类的名称。

  2. 如果您想使用类别,您应该像查理在Google帖子中所说的那样,根据要求使用一个条目。如果你将字符串Requirement添加到该值,它看起来会很好,但大多数都遵循上面(1)中的规则,它可能是这样的:

  3. 类别[条件:FR12345]

    代码:

    public class RequirementAttribute : CategoryAttribute
    {
        public RequirementAttribute(string s)
            : base("Requirement:" + s)
        { }
    }
    
    1. 如果你想要它显示如下:要求[FR12345],那么你必须使用一个属性,但你不能有多个密钥,所以每个测试只有一个。
    2. 代码:

      public class RequirementAttribute : PropertyAttribute
      {
          public RequirementAttribute(string s)
              : base(s)
          {}
      }
      

      4:如果您希望每次测试都有多个要求,并且仍然有类似(3)中显示的内容,则必须使密钥唯一。它不需要看起来太糟糕。在下面的代码中,我刚刚添加了一个计数器。 它将显示为:

      要求-1 [FR12345]

      要求-2 [FR23456]

      代码:

       public class RequirementAttribute : PropertyAttribute
          {
             public RequirementAttribute(string[] array)
             {
                 int i = 0;
                 foreach (var s in array)
                 {
                     Properties.Add("Requirement-" + i, s);
                     i++;
                 }
             }
          }
      

      你就像使用它一样:

       [Requirement(new[] { "1234", "2345" })]
         [Test]
         public void Test()
         { }
      

      (如果你想要一个没有" new"的语法,前面的答案会显示带有param的语法。)

      选项4不按要求编号分组,而是按计数器分组。如果要按要求编号分组,可以使用选项5:

      5。 将需求编号添加到密钥,但将值保留为空。 它看起来像:

      要求-FR12345

      通过这种方式,您还可以跳过前缀并将每个要求作为TE中自己的类别。

      代码:

      public class RequirementAttribute : PropertyAttribute
      {
          public RequirementAttribute(string[] array)
          {
              foreach (var s in array)
              {
                  Properties.Add("Requirement-" +  s,"");
              }
          }
      }
      

      而且,您当然也可以完全跳过前缀。