2

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

我阅读了JUnit - 教程,但我无法将这些知识与我的示例绑定。

我了解如何单独测试从文件中读取的方法,但不知道如何通过测试某些路径和 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测试?
  • 在这种情况下我们需要使用失败测试吗?
  • 我们可以覆盖哪个最大百分比计划?
  • 我们应该(通常)测试私有方法和受保护方法吗?
4

1 回答 1

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());

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

在编写测试时,它可以帮助我思考如果其他人使用我的代码,他们会如何期望它的行为?然后我尝试编写测试来展示预期的行为。

希望有帮助!

于 2013-01-25T17:48:11.250 回答