如何以正确的方式进行测试驱动开发?

How to do Test Driven Development right way?

我已经阅读了有关 TDD 的内容,并在我的新项目中进行了尝试。

我知道在 TDD 中它就像黑盒测试,即重要的是 what 而不是 how。所以, 在阅读了许多帖子后,我总结并停止测试私有方法,因为它是不正确的方法。

但是,由于这些原因,我没有做到。

我将通过示例向您展示: 我有一个读取文本段落的程序,所以我在我的测试方法中写了这样的东西(对于 tdd step1)。

/*
My program reads a textual paragraph from file and saves it to my custom paragraph object; 
*/

因此,我使用此方法来创建 RED 案例。

public void paragraphMustNotBeNullTest(){
File f = new File("some path")
 ParagraphReader reader= new ParagraphReader();
 reader.read();
assertNotNull("my custom paragraph is null",reader.getCustomParagraph());
}

我写了下面的代码:

package com.olabs.reader;

import java.io.FileInputStream;
import java.io.InputStream;

import com.olabs.models.OlabsParagraph;

public class Para {


    private String paragraphText = null;
    private Paragraph oParagraph = null;

    public Paragraph getCustomParagraph() {
        return oParagraph;
    }
    public void setoParagraph(Paragraph oParagraph) {
        this.oParagraph = oParagraph;
    }

    public void read() {
        InputStream is = new FileInputStream("abc......");
//      ..
        String text = is.read(); // assume I got text read from file.
        this.paragraphText = text;
    }


    private void createCustomParagraph()
    {
        Paragraph p = new Paragraph();
        p.setText(paragraphText);
        p.setId(1);
        p.setType("Story");
        ...........
    }

    private void countWords()
    {
        // counting words in paragraph logic
    }


}

现在的问题是我事先知道我将使用 countingwordscreateCustomParagraph 作为私有方法。

所以,在那种情况下我应该选择:

  1. 将它们创建为 public 并遵循 tdd 循环。

  2. 将它们设为私有。

  3. 删除它们的测试(因为这些方法现在是私有的,测试无法访问)。 我认为这是执行 tdd 的非常麻烦且不正确的方法。

我很困惑 this.Everyone 说只有在你写了一个失败的测试后才写代码,但是如果我知道我要写一个 私有方法 那么如何我会这样做吗?

如果我有什么地方不对,请您指正。另外,如果可能的话,请举一些真实的例子...

此外,由于访问说明符问题或重构,我担心大部分时间我会编辑测试或删除它们...

注意:这是不是重复问题。对于实时 situations.In 我所见过的所有示例,我都没有很好的答案,它们只显示一个带有默认或 public 访问说明符的 class,所以它们确实没有显示具体情况在实时项目中工作。

根据我的个人经验,您正在测试 class 以及应用程序其余部分与 class 的接口。 您的 TDD 测试用例应该针对 class 的 public 方法编写。重点是测试当受到刺激时,class 输出所需的结果以通过您的测试标准。内部私有方法将作为 public 接口测试的一部分进行测试,但目标是验证 public 可访问接口是否正常工作。 你说你提前知道私有方法将被使用,但是如果有人在不改变外部行为的情况下重构 class 中的事情是如何完成的,你仍然可以使用你现有的测试并验证重构有没有破坏以前的工作方法。

如果方法是您正在构建的主要内容的实现细节,应该保持私有,这并不意味着没有办法为它编写测试。您可以将该功能作为另一个 class 的一部分,它可以是 public,编写直接运行它的测试,然后从主要事物私下调用它。这样您就可以测试私有方法,不会删除任何测试,并且当使用它的东西可能无法访问您想要测试的所有内容时,您不必间接地进行扭曲测试。现在,您不再使用隐藏了一些粗糙代码的私有方法,而是拥有经过良好测试的构建块,可以在其他地方重用。

很好的问题。我也问过很多次。一般来说,答案说你必须考虑在实现主要功能之前进行的单元测试,比如 frames。这些框架严格定义了功能。

因此,在您要实现某些特定的 类 之前,您甚至可能不知道私有方法。但是因为你有一组 RED 测试,你必须做的一件事就是让它们变绿。不管你将如何做(public 或私有方法)。

第一个目标是编写最少的代码行,单元测试应该涵盖。我在博客上更深入地介绍了 TDD topic