以 testAdd1() 为例,该方法测试了 -2147483648 与 -1000 的和,并将预期结果设置为 2147482648。因此开发人员只需要判断实际输出是否为 Jtest 的预设结果。若预设正确,可通过点击 Verify outcome 可验证预期输出结果;若预设错误,可点击 Change Expected Value 更改预期结果。
图 14. 验证预期结果(查看大图)
● 回归测试
当 Jtest 第一次运行单元测试时,它会创建一个关于当前被测试类及测试参数的快照。当一个被测试类修改了,可以重新运行测试用例来检查是否出现错误。
当需要对 Eval.java 类进行执行回归测试时,用户可以打开 Jtest Example.jtest 工程,重新运行 EvalTest。假设我们将 Eval.java 类 startsWith 方法中的 73 行处的“i1 + i2”改为“i1 + i2 + i2”,再次运行测试用例,在回归测试结果中可以发现,Jtest 报告了新错误“Review Assertion Failures”。
图 15. 查看回归测试结果
这个错误表明 Jtest 探测到被测类在此次测试与上一次测试之间一段时间内被修改过,开发测试人员可根据需求判断是否保持该更新。
Jtest 其他特性
检查内存泄漏
执行单元测试时,Jtest 会自动检测内存泄漏。如果测试结束时内存仍然没有被释放,Jtest 将会报告内存泄漏错误。
在菜单栏中选择 Jtest->Test Configurations,打开 User Defined,选择当前使用的测试方案配置,如“Example Configuration”,在右侧面板上的 Execution->Options 选项卡中激活 detect memory leaks 选项,点击 Apply。
查看测试覆盖信息
Jtest 能够实时跟踪测试覆盖率,随后在覆盖率窗口中图形化显示当前被执行测试的代码的覆盖率信息。
选择 Jtest->Test Configurations,打开 User Defined,选择当前使用的测试方案配置,如“Example Configuration”,在右侧面板上的 Execution->Options 选项卡中激活 Report executable line coverage 选项,并根据具体需求选择其子选项,点击 Apply。
开发或测试人员可以在代码编辑器中打开被测类文件,当代码对应的编辑器左侧为绿色,则表示该行代码已经被覆盖;红色则表示该行代码尚未被覆盖;无色则表示该行代码不能被执行。图 16 中 Eval.java 类中的 return false 语句不能被覆盖。同时,Coverage 窗口也显示了被测类及其方法的覆盖率统计,图中对于 Eval.java 的测试覆盖率达到了 88%。
图 16. 查看测试覆盖率
总结
本文分别从工作原理,主要功能和具体使用几个方面介绍了一款优秀的 Java 代码优化和测试工具 Jtest。Jtest 通过单元测试和代码规范检查,以自动化的方式,实现了代码基本错误的预防和优化。使用 Jtest 能够帮助软件开发和测试人员有效减少软件开发和维护的时间成本,提高软件的质量。