如何测试从文件和路径读取(使用junit)?

时间:2013-01-25 17:22:17

标签: java testing file-io junit path

我需要使用JUnit框架执行测试覆盖。

我读过JUnit - Tutorial但我无法将这些知识与我的例子联系起来。

我理解如何单独测试文件中的方法读取,但不知道如何完全测试一些路径和askUserPathAndWord。我怎样才能做好测试?

package task;
import java.io.*;

class SearchPhrase {
    public void walk(String path, String whatFind) throws IOException {
        File root = new File(path);
        File[] list = root.listFiles();
        for (File titleName : list) {
            if (titleName.isDirectory()) {
                walk(titleName.getAbsolutePath(), whatFind);
            } else {
                if (read(titleName.getAbsolutePath()).contains(whatFind)) {
                    System.out.println("File:" + titleName.getAbsolutePath());
                }
            }
        }
    }

    // Read file as one line
    public static String read(String fileName) {
        StringBuilder strBuider = new StringBuilder();
        try {
            BufferedReader in = new BufferedReader(new FileReader(new File(
                    fileName)));
            String strInput;
            while ((strInput = in.readLine()) != null) {
                strBuider.append(strInput);
                strBuider.append("\n");
            }

            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return strBuider.toString();
    }

    public void askUserPathAndWord() {
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(System.in));
        String path, whatFind;
        try {
            System.out.println("Please, enter a Path and Word"
                    + "(which you want to find):");
            System.out.println("Please enter a Path:");
            path = bufferedReader.readLine();
            System.out.println("Please enter a Word:");
            whatFind = bufferedReader.readLine();

            if (path != null && whatFind != null) {
                walk(path, whatFind);
                System.out.println("Thank you!");
            } else {
                System.out.println("You did not enter anything");
            }
        } catch (IOException | RuntimeException e) {
            System.out.println("Wrong input!");
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
            SearchPhrase example = new SearchPhrase();
            example.askUserPathAndWord();
    }
}

下一步问题:

  • 我们如何完全测试集成依赖关系并检查路径?
  • 哪一点应该有好的,可以理解的junit测试?
  • 在这种情况下我们是否需要使用失败测试?
  • 我们可以涵盖哪个最高百分比计划?
  • 我们应该测试私有和受保护的方法吗(通常)?

1 个答案:

答案 0 :(得分:5)

我建议保持简单开头。在我看来,从根本上讲,编写单元测试的目的只是为了确保你的代码完成它的目的。

我认为您的read方法是一个很好的起点。看起来read方法的目的是将文件名作为输入并返回包含文件内容的字符串。

因此,要编写一个证明它有效的测试,首先在文件中创建一个名为“testFile”的文件,其中包含一些虚拟文本,例如“my test”。

然后,编写一个单元测试,如:

@Test
public void read() {

    String testFileName = "/path/to/test/file/testFile";
    String expected = "my test";
    SearchPhrase searchPhrase = new SearchPhrase();
    String result = searchPhrase.read(testFileName);
    assertEquals(expected, result);

}

这只是为了让你开始。一旦掌握了它,就可以进行改进,例如更新测试文件的路径,使其不是硬编码的。理想情况下,测试应该能够从任何地方运行。

作为一个很好的额外奖励,编写单元测试可以让您考虑以更加可重用和易于理解的方式组织您的包,类和方法(除了其他好处之外)。

例如,您的walk方法很难测试,因为它是当前编写的。因此,请尝试考虑如何使其更容易测试。也许它可以返回代表搜索结果的字符串列表?如果您进行了更改并在包含testFile的目录中搜索字符串“test”,那么您知道应该在列表中获得一个结果,因此请使用以下内容对其进行测试:

assertNotNull(searchPhrase.walk());
assertEquals(1, searchPhrase.walk().size());

由于您刚刚开始,我建议不要担心您的测试涵盖的程序百分比。

在编写测试时,它可以帮助我思考是否有其他人使用我的代码,他们会如何表现?然后我尝试编写演示预期行为的测试。

希望有所帮助!