我应该对主要方法进行单元测试吗?

时间:2017-02-19 04:11:43

标签: java unit-testing

是否值得尝试对控制台应用程序的主要方法进行单元测试?

主要方法是目前唯一没有测试覆盖率的代码。

public static void main(String[] args) {
    if (args.length != 2) {
        System.out.println("Pass the root directory and the directory to scan.");
        System.exit(1);
    }
    Path root = Paths.get(args[0]);
    Path scan = Paths.get(args[1]);
    Demo demo = new Demo();
    String output = demo.scan(root, scan);
    System.out.println(output);
}

2 个答案:

答案 0 :(得分:2)

你在测试什么,真的吗?这是您在决定测试某些代码时必须问自己的问题。

在理想的世界中,拥有100%的代码和分支覆盖率是很好的,并且能够确保代码在重写时起作用是一个巨大的好处。但是,应该从不单独使用代码覆盖率 作为测试覆盖率的合适“快乐”指标。

在这种情况下,你必须仔细观察你真正想要检查的内容。鉴于你正在做很多事情,并且你必须在这里嘲笑几乎所有东西,你可以做的现实事情是测试机械过程,“这个对象是否用这些参数调用这个方法?”坦率地说,这不是一个好的考验。

我建议你完全测试Demo#scan而不是整个main,因为:

  • scan是一种需要Demo新实例的方法,该实例不易注入main。是的,我知道你可以使用PowerMockito来实现这一目标,但嘲笑新产品对我来说是一种测试气味。
  • 如果其中任何一个属实,您的应用程序将无法运行
    • args没有收到正确数量的参数
    • 通过args传入的路径无效或格式错误
  • 如果你确实按照测试的方式进行了测试,你就会开始意识到你真的在测试很多库代码并确保库代码有效。这有一些的优点,但在这种情况下,果汁不值得挤压。

答案 1 :(得分:0)

main方法仍然是代码,可能包含错误并导致意外的应用程序行为。因此,测试main方法可能与测试其他方法一样有意义。

不幸的是,main方法是一种static方法,它可以在没有其他框架的情况下进行单元测试。最好你的main方法应该包含一个方法调用,然后你不必担心是否应该测试它。

无论如何,在我看来,以下测试可以从您的main方法中获得。

  • 如果未提供路径和/或扫描目录,程序是否会终止?
  • 结果是否打印到控制台?

当然,可以理解的是,测试结果非常明显,我只需要看一下代码就可以说它有效或者程序会失败。另一方面,如果不熟练的其他开发人员更改您的代码或某些需求更改,并且您将有其他参数可供处理。会不会那么容易?

最后,在纯TDD流程中,您已经定义了类似的测试用例,在您编写main方法之前必须对其进行覆盖。