C#测试依赖项

时间:2013-12-12 21:50:58

标签: c# integration-testing

我非常清楚并同意测试不应相互依赖的观点。

然而,在这种情况下,我认为这将是有益的。

情况是被测系统需要遵循一步一步的过程(没有经过前面的步骤就无法跳到一个步骤)。 在理想的世界中,我们会让开发人员添加一个API以允许我们这样做,但是考虑到这些限制,这将无法完成。

目前正在进行的测试都是端到端的,有时难以分析失败的测试。

我的问题是:我是否有一种干净的方法可以将这些端到端测试分解为较小的测试,并对它们施加一些依赖?

我知道TestNG可以使用@DependOn表示法执行此操作,C#是否有类似的概念?

3 个答案:

答案 0 :(得分:1)

从描述测试的方式来看:

  1. 开发人员开发代码的方式存在缺陷,因为测试步骤3说,必须首先调用步骤1和2,而不是能够隔离步骤3.如果问题与开发人员设计的方式有关系统,建议他们解决它。
  2. 您正在执行集成测试,并希望测试调用多个步骤的结果。在这种情况下,您不想使用单元测试工具,您需要集成测试工具。 See this answer to another question就这些工具及其陷阱提供建议。

答案 1 :(得分:0)

这里有几个概念可能有用:

这里的基本思想是将正在执行的场景与您正在进行的断言(即您正在测试的内容)分开。这实际上只是BDD,所以使用BDD Framework来帮助你可能是有意义的,尽管没有必要。使用NUnit,您可以编写类似这样的内容

[TestFixture]
public class ExampleTests
{
    [SetUp]
    public void ExecuteScenario()
    {
        GrabBucket();
        AddApple();
        AddOrange();
        AddBanana();
    }

    [Test]
    public void ThereShouldBeOneApple()
    {
        Assert.AreEqual(1, Count("Apple"));
    }

    [Test]
    public void ThereShouldBeOneOrange()
    {
        Assert.AreEqual(1, "Orange");
    }

    [Test]
    public void ThereShouldBeOneBanana()
    {
        Assert.AreEqual(1, "Banana");
    }

    [Test]
    public void ThereShouldBeNoPomegranates()
    {
        Assert.AreEqual(0, "Pomegranate");
    }

    private void GrabBucket() { /* do stuff */ }
    private void AddApple() { /* do stuff */ }
    private void AddOrange() { /* do stuff */ }
    private void AddBanana() { /* do stuff */ }

    private int Count(string fruitType)
    {
        // Query the application state
        return 0;
    }
}

我意识到这并没有回答你提出的问题 - 这并没有将更大的集成测试分解成更小的单元 - 但它可以帮助你解决依赖问题;在这里,所有相关测试都取决于单个场景的执行,而不是之前执行的测试。

答案 2 :(得分:0)

我同意迄今为止的几乎所有评论,我最终选择的解决方案是使用nUnit作为框架,使用category属性来排序,而不是最干净或最'SOLID'的解决方案。试验。