是否值得尝试对控制台应用程序的主要方法进行单元测试?
主要方法是目前唯一没有测试覆盖率的代码。
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);
}
答案 0 :(得分:2)
你在测试什么,真的吗?这是您在决定测试某些代码时必须问自己的问题。
在理想的世界中,拥有100%的代码和分支覆盖率是很好的,并且能够确保代码在重写时起作用是一个巨大的好处。但是,应该从不单独使用代码覆盖率 作为测试覆盖率的合适“快乐”指标。
在这种情况下,你必须仔细观察你真正想要检查的内容。鉴于你正在做很多事情,并且你必须在这里嘲笑几乎所有东西,你可以做的现实事情是测试机械过程,“这个对象是否用这些参数调用这个方法?”坦率地说,这不是一个好的考验。
我建议你完全测试Demo#scan
而不是整个main
,因为:
scan
是一种需要Demo
新实例的方法,该实例不易注入main
。是的,我知道你可以使用PowerMockito来实现这一目标,但嘲笑新产品对我来说是一种测试气味。args
没有收到正确数量的参数args
传入的路径无效或格式错误答案 1 :(得分:0)
main
方法仍然是代码,可能包含错误并导致意外的应用程序行为。因此,测试main
方法可能与测试其他方法一样有意义。
不幸的是,main
方法是一种static
方法,它可以在没有其他框架的情况下进行单元测试。最好你的main方法应该包含一个方法调用,然后你不必担心是否应该测试它。
无论如何,在我看来,以下测试可以从您的main
方法中获得。
当然,可以理解的是,测试结果非常明显,我只需要看一下代码就可以说它有效或者程序会失败。另一方面,如果不熟练的其他开发人员更改您的代码或某些需求更改,并且您将有其他参数可供处理。会不会那么容易?
最后,在纯TDD流程中,您已经定义了类似的测试用例,在您编写main
方法之前必须对其进行覆盖。