第一个测试的目的不是在边界条件上费力,也不是为了查看解决了什么问题。第一个测试是一个发烟试验,目的是为了对于什么可能是错误的给您一个清晰的概念。即使最基本的测试也不能揭示出构造系统、运行时环境、已安装的软件以及对每件事情进行本质上的破坏的其他主要问题中存在的问题。我的第一个测试用例确实能够准确地发现 jEdit 代码基础的这样一个问题:在我的类路径中没有包含所有可能的目录。
我并没有开始测试类路径配置,但是我寻找到的问题也是重要的,因为它可能导致代码基础很难调试。类似这种的全面测试涉及到应用程序的很多方面。很多不同的东西能够中断并且导致测试失败。就这种意义上说,并不是非常统一。在 test-first 编程中,这不是一个问题;但是当测试遗留代码时,您没有时间或者预算为每个单独的方法或者分支编写独立的测试。您必须在编写每个测试时尽量地覆盖尽可能多的方法和分支。使用一些测试来测试大部分代码比根本不进行测试要好。
对 main() 方法进行故障诊断
测试 main() 方法并不作用于所有的应用程序。例如,库中不包含 main() 方法。一些确实具有 main() 方法的应用程序可能也不希望这个方法被不止一次的调用。如果您这样做的话,静态初始化软件会非常混乱。它们可能不去清除一些对象和类,因为它们假定当程序存在时,虚拟机也存在,所有对象和类都将被自动清除。如果事实如此,您可能需要更深层地观察您的应用程序,寻找第一个测试点。
但是,不要走的过深。对于相对于 test-last 开发来说的 test-first 开发,尤其是对于遗留代码来说,您可能会遇到一个问题是,经常存在未公开的依赖关系和先决条件。一些方法假定其他对象存在并且在它们运行前已经创建了。例如,大多数菜单栏不会脱离它们的父窗体单独起作用。
实际上,如果您试着不止一次地调用 main() 方法,jEdit 就会变得非常混乱。我希望能一次也不调用它。但是,很多其他代码依赖于 jEdit.initSystemProperties() 方法已经被调用,并且这个方法是私有的。执行它的惟一方法就是调用 main()。我采用的解决方法是,只有当 main() 方法一次也没被调用过的时候才调用它,如下所示:
private static boolean hasMain = false;
protected void setUp() {
if (!hasMain) {
jEdit.main(new String[0]);
hasMain = true;
}
View view = jEdit.getFirstView();
while (view == null) {
// First window may take a little while to appear
view = jEdit.getFirstView();
}
menubar = view.getJMenuBar();
}
文章来源于领测软件测试网 https://www.ltesting.net/