3

我将我们所有的系统测试链接到测试用例和我们的需求。每个需求都有一个 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...)

但是,这会中断,因为 Property 是一个键值对。系统不允许我拥有多个具有相同密钥的属性。

我想要这样做的原因是,如果模块更改触及这些要求,则能够在我们的系统中测试特定要求。

与其在每个构建中运行超过 1,000 次系统测试,这将允许我们根据对代码所做的更改来确定要测试的内容。

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

想法?

4

2 回答 2

2

您是否考虑过派生自的自定义属性属性NUnit.Framework.Property

通过将语言设置为C# 程序并添加对(版本 2.4.8)的引用的LINQPad 4 “查询”来判断,类似以下内容似乎对您有用:nunit.framework.dll

// 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);
}
于 2014-03-05T03:11:24.473 回答
0

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

  1. Category 在 TE 中始终显示为“Category [xxxxxxx]”,其中 xxxxx 是您发送的任何字符串,如果您不指定任何字符串,它将是从 CategoryAttribute 派生的类的名称。

  2. 如果你想使用类别,你应该,正如查理在谷歌帖子上所说,每个要求使用一个条目。如果将字符串 Requirement 添加到 value 中,它看起来会很不错,但大多数遵循上面 (1) 中的规则,它可能是这样的:

类别[要求:FR12345]

代码:

public class RequirementAttribute : CategoryAttribute
{
    public RequirementAttribute(string s)
        : base("Requirement:" + s)
    { }
}
  1. 如果你希望它显示为:Requirement[FR12345],那么你必须使用一个属性,但你不能有多个键,所以每次测试只有一个这样的键。

代码:

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()
   { }

(如果您想要一个没有“新”的语法,前面的答案会显示带有参数的语法。)

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

5. 将需求编号添加到键中,但将值留空。它看起来像:

要求-FR12345

这样,您也可以跳过前缀,并将每个需求作为其自己的类别在 TE 中。

代码:

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

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

于 2014-05-27T21:20:58.240 回答