消除测试驱动开发中的重复

dev*_*ium 3 c# java testing tdd unit-testing

我正在开发一个小型解析器类 TDD 风格。这是我的测试:

    ...

    [TestMethod]
    public void Can_parse_a_float() {
        InitializeScanner("float a");
        Token expectedToken = new Token("float", "a");

        Assert.AreEqual(expectedToken, scanner.NextToken());
    }

    [TestMethod]
    public void Can_parse_an_int() {
        InitializeScanner("int a");
        Token expectedToken = new Token("int", "a");

        Assert.AreEqual(expectedToken, scanner.NextToken());            
    }

    [TestMethod]
    public void Can_parse_multiple_tokens() {
        InitializeScanner("int a float b");

        Token firstExpectedToken = new Token("int", "a");
        Token secondExpectedToken = new Token("float", "b");

        Assert.AreEqual(firstExpectedToken, scanner.NextToken());
        Assert.AreEqual(secondExpectedToken, scanner.NextToken());
    }
Run Code Online (Sandbox Code Playgroud)

困扰我的是最后一个测试正在执行Can_parse_a_float()Can_parse_an_int(). 一方面,它正在执行这两种方法都没有的东西:从源代码字符串中,我可以获得多个标记。另一方面,曾经Can_parse_a_float()Can_parse_an_int()失败,Can_parse_multiple_tokens()也会失败。

我觉得这里有 4 个目标:

  • 我希望我的测试表明我Parser解析了整数
  • 我希望我的测试表明我的Parser解析是浮动的
  • 我希望我的测试表明我Parser可以连续解析多个整数/浮点数
  • 我希望我的测试也能很好地作为文档机制(!)

我向任何分享他关于如何更好地处理这种情况的意见的人提供 cookie。谢谢!

tva*_*son 5

所以,我的问题是——当你编写通过前两个测试的代码时,你是否做了最简单的事情,或者你是否提前工作,知道第三个要求(测试)?如果您编写了最简单的代码并且它通过了第三次测试而没有编写新代码,那么该测试就没有必要了。如果您必须修改代码,则需要第三个测试并用于定义代码。是的,他们现在三个都在执行相同的代码行,但是既然您已经编写了第三个测试,这些行(应该)就不同了。我认为这没有问题。