6

今天我第一次使用 TDD。我正在使用 nUnit。

我有一种方法,我可以插入多个不同的输入并检查结果是否有效。

我读到一个测试中的多个断言不是问题,我真的不想为每个输入编写新的测试。

具有多个断言的示例:

    [TestFixture]
public class TestClass
{

    public Program test;

    [SetUp]
    public void Init()
    {
        test = new Program();

    }
    [Test]
    public void Parse_SimpleValues_Calculated()
    {
        Assert.AreEqual(25, test.ParseCalculationString("5*5"));
        Assert.AreEqual(125, test.ParseCalculationString("5*5*5"));
        Assert.AreEqual(10, test.ParseCalculationString("5+5"));
        Assert.AreEqual(15, test.ParseCalculationString("5+5+5"));
        Assert.AreEqual(50, test.ParseCalculationString("5*5+5*5"));
        Assert.AreEqual(3, test.ParseCalculationString("5-1*2"));
        Assert.AreEqual(7, test.ParseCalculationString("7+1-1"));
    }
}

但是当某些事情失败时,很难阅读哪个断言失败了,我的意思是如果你有很多,你必须遍历所有并找到正确的断言。

如果断言失败,是否有任何优雅的方式来显示我们设置了什么输入,而不是结果和预期结果?

谢谢你。

4

1 回答 1

10

我的意思是,如果你有很多,那么你必须经历所有。

不,您不知道-您只需查看堆栈跟踪。如果您在 IDE 中运行测试,我发现这很容易确定哪条线失败了。

也就是说,有一种(显着)更好的方法 - 使用TestCaseAttribute. 例如:

[Test]
[TestCase("5*5", 25)]
[TestCase("5*5*5", 125)]
[TestCase("5+5", 10)]
// etc
public void Parse_SimpleValues_Calculated(string input, int expectedOutput)
{
    Assert.AreEqual(expectedOutput, test.ParseCalculationString(input));
}

现在,您的单元测试运行程序将分别向您展示每个测试用例,您将能够看到哪个测试用例失败了。此外,它会运行所有的测试,即使早期的测试失败了——所以你不会最终修复一个,却发现下一个意外失败。

TestCaseSourceAttribute某些情况下,您还想单独指定一组输入 - 例如跨多个测试使用。

于 2013-08-18T18:15:30.963 回答