分享:关于Unit Test中无法生成覆盖率报告问题的解决

Hi All

下面是对目前使用 Emma 无法生成覆盖率报告的问题的一些总结:

*          问题症状 :运行 ant 脚本,在计算 Client 的覆盖率的时候停住(并没有运行完,也没有结束),没有生成覆盖率报告文件

*          研究之路 :由于这个问题没有报错信息(只是停在那里),一开始以为是 ANT_OPTS 不够,故在运行的 bat 文件中设置 set ANT_OPTS=-Xms512M -Xmx1024M 无效果。

于是尝试缩小问题的范围,简化程序的运行,只运行 ant 中的 EMMA target 逐步缩小运行的类的数量,结合对比之前没有出现这样的问题的情况, 最后问题聚集到:含有 getFunctions(); 的类都会出现这个问题,于是基本找到了问题原因。

*          继续研究发现 :一些 Java 的窗口程序,比如 JFrame ,都有可能导致 Report 不能生成,故推出: EMMA 生成覆盖率的逻辑不同于 JUnit 运行,在一些窗口程序中 EMMA 是不能成功生成 Report 的,更具体的原因仍然不明。

于是审视生成 Functions 的过程,有一些 Java Swing 和一些窗口事件的逻辑,这些逻辑导致了 EMMA 不能生成 Report ,而这些逻辑对于 Unit Test 没有任何价值,而生成 Functions 的过程真正需要的是 Server 对象, 于是想,如果程序不跑这些逻辑, EMMA 就可以成功生成 Report 了。于是尝试传递一个空的 context FunctionsImpl 的构造方法,而当 Functions 被我们调用之后,它会生成一个继承自 PnutFunctionsEx 的类的对象,比如 createAccount 类对象,这些对象完成调用的逻辑大都是获取 server ,获取 server 上的 manager ,然后使用 manager 完成一些操作,而 getServer 方法在父类 PnutFunctionsEx 中,于是我们考虑使用 ASM 动态修改 PnutFunctionsEx getServer 方法,不让它做一些 Java Swing 或是窗口事件的操作,让它直接返回我们测试类 BaseTest 中的 server ,这样,我们的 EMMA coverage Report 就可以生成了。

*          解决方案 :使用 ASM 动态修改 PnutFunctionsEx getServer 方法,不让它做一些 Java Swing 或是窗口事件的操作(这些操作都是不能生成 report 的罪魁祸首),让它直接返回我们测试类 BaseTest 中的 server 即可

*          总结 :不断的把问题简化,缩小问题的范围是解决问题有效方法,理性的思考和判断,灵活的尝试都有助于问题的解决。

Regards,

Rex Wu

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值