如何正确地进行测试驱动开发?

swa*_*ntu 5 java tdd

我读过关于TDD的文章,我在我的新项目中尝试过.

TDD周期

据我所知,在TDD中,它就像是黑盒测试,即它重要的是什么而不是如何.因此,我在许多帖子上阅读了它之后总结并停止测试私有方法,因为它不是正确的方法.

但是,由于这些原因,我没有这样做.

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

/*
My program reads a textual paragraph from file and saves it to my custom paragraph object; 
*/
Run Code Online (Sandbox Code Playgroud)

因此,我采用这种方法来创建RED案例.

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

我写了以下代码:

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
    }


}
Run Code Online (Sandbox Code Playgroud)

现在问题是我事先知道我将使用countwordscreateCustomParagraph作为私有方法.

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

  1. 将它们创建为公共并遵循tdd循环.

  2. 让他们私密.

  3. 删除它们的测试(因为这些方法现在是私有的,无法进行测试).我认为这是非常麻烦和不正确的方式来做tdd.

我对此感到困惑.每个人都说只有在你写完一个失败的测试后才编写代码,但是如果我知道我要编写一个私有方法,那么我将如何做呢?

如果我在某处错了,我请求你纠正我.如果可能,还给出一些真实的例子......

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

注意:这不是一个重复的问题.对于实时情况我没有很好的答案.在我看到的所有例子中,它们只显示一个具有默认或公共访问说明符的类,因此它们实际上并没有显示在实时项目中如何工作.

小智 4

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