「java获取代码覆盖率」java代码覆盖率测试工具
本篇文章给大家谈谈java获取代码覆盖率,以及java代码覆盖率测试工具对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
五个方法让你做更好的java单元测试?
单元测试是我们在软件开发过程中经常用到的一种软件测试的方法,而今天我们就一起来了解一下,一个好的单元测试都是如何来编辑完成的。
1.使用框架来用于单元测试
Java提供了若干用于单元测试的框架。TestNG和JUnit是流行的测试框架。JUnit和TestNG的一些重要功能:
易于设置和运行。
支持注释。
允许忽略或分组并一起执行某些测试。
支持参数化测试,即通过在运行时指定不同的值来运行单元测试。
通过与构建工具,如Ant,Maven和Gradle集成来支持自动化的测试执行。
EasyMock是一个模拟框架,是单元测试框架,如JUnit和TestNG的补充。EasyMock本身不是一个完整的框架。它只是添加了创建模拟对象以便于测试的能力。例如,我们想要测试的一个方法可以调用从数据库获取数据的DAO类。在这种情况下,EasyMock可用于创建返回硬编码数据的MockDAO。这使我们能够轻松地测试我们意向的方法,而不必担心数据库访问。
2.谨慎使用测试驱动开发!
测试驱动开发(TDD)是一个软件开发过程,在这过程中,在开始任何编码之前,我们基于需求来编写测试。由于还没有编码,测试初会失败。然后写入小量的代码以通过测试。然后重构代码,直到被优化。
目标是编写覆盖所有需求的测试,而不是一开始就写代码,却可能甚至都不能满足需求。TDD是伟大的,因为它导致简单的模块化代码,且易于维护。总体开发速度加快,容易发现缺陷。此外,单元测试被创建作为TDD方法的副产品。
然而,TDD可能不适合所有的情况。在设计复杂的项目中,专注于简单的设计以便于通过测试用例,而不提前思考可能会导致巨大的代码更改。此外,TDD方法难以用于与遗留系统,GUI应用程序或与数据库一起工作的应用程序交互的系统。另外,测试需要随着代码的改变而更新。
因此,在决定采用TDD方法之前,应考虑上述因素,并应根据项目的性质采取措施。
3.测量代码覆盖率
代码覆盖率衡量(以百分比表示)了在运行单元测试时执行的代码量。通常,高覆盖率的代码包含未检测到的错误的几率要低,因为其更多的源代码在测试过程中被执行。云南电脑培训发现测量代码覆盖率的一些佳做法包括:
使用代码覆盖工具,如Clover,Corbetura,JaCoCo或Sonar。使用工具可以提高测试质量,因为这些工具可以指出未经测试的代码区域,让你能够开发开发额外的测试来覆盖这些领域。
如何:获取代码覆盖率数据
可以按逐行代码甚或逐个代码块的形式衡量测试的有效性。可以通过配置测试运行以产生代码覆盖率数据来做到这一点。得到的数据显示在“代码覆盖率结果”窗口和源代码文件中。
当对项目(通常为二进制文件)进行了检测,并在测试运行期间将其加载到了内存中时,就会收集代码覆盖率数据。获取代码覆盖率数据过程介绍了如何选择要检测的文件。
注意默认情况下,在运行单元测试时测量代码覆盖率。因此,在运行单元测试时,只有在已关闭代码覆盖率数据收集功能,或者当您希望对其他项目进行检测以收集它们的代码覆盖率数据时,才需要执行获取代码覆盖率数据中的步骤。测试运行完成后,即可查看代码覆盖率数据;有关更多信息,请参见查看代码覆盖率数据。
还可以合并多组代码覆盖率数据,如如何:合并代码覆盖率数据中所述。有关与合并代码覆盖率数据有关的各种情况的信息,请参见使用合并的代码覆盖率数据。如对程序集进行检测和重新签名中所述,必须对经过检测的具有强名称的程序集进行重新签名。指定密钥文件即可启用重新签名。有关更多信息,请参见重新签名程序集。
必须显式地对项目进行检测,只有这样,才能在您运行单元测试之外的其他测试时获取代码覆盖率数据。例如,某个运行手动测试的测试人员可能会启动一个特殊的程序。如果这个程序的二进制文件经过了检测,则将收集代码覆盖率数据。有关更多信息,请参见手动测试概述。
获取代码覆盖率数据获取代码覆盖率数据创建代码测试。这些测试既可以是单元测试,也可以是其他测试类型(它们执行您已为其设置了符号并且已为其选择了要检测的适当二进制文件的代码)。有关如何创建单元测试的信息,请参见
如何:生成单元测试。
打开将用于单元测试的测试运行配置。
有关更多信息,请参见如何:指定测试运行配置。单击“代码覆盖率”。在“选择要检测的项目”下,选择解决方案的
DLL、可执行文件或目录。例如,如果解决方案的名称为
ClassLibrary1,则选择名为
ClassLibrary1.dll、路径为
Solution
Directory\ClassLibrary1\bin\Debug
的程序集所对应的复选框。注意也可以选择包含测试项目文件的
DLL。这将为测试项目中的方法(而不仅仅是生产代码中的方法)生成代码覆盖率数据。
单击“应用”,再单击“关闭”。运行一个或多个测试。
有关更多信息,请参见如何:运行选定的测试。在运行测试时,会收集代码覆盖率数据。有关查看数据的更多信息,请参见查看代码覆盖率数据。
注意运行VSPerfMon.exe
可以与代码覆盖率数据的集合进行交互。有关更多信息,请参见
Team
Edition
for
Testers
疑难解答中的“代码覆盖率数据和
VSPerfMon.exe”部分。无法为运行在
64
位进程中的应用程序收集代码覆盖率数据。因此,如果您在测试此类应用程序时请求了代码覆盖率数据,则测试引擎会在要检测的程序集的可移植可执行
(PE)
标头中设置“32BIT”标志。测试运行完成后,程序集会恢复到其原始状态。重新签名程序集重新签名程序集打开将用于单元测试的测试运行配置。
有关更多信息,请参见如何:指定测试运行配置。单击“代码覆盖率”。单击“用于重新签名的密钥文件”文本框旁边的省略号
(…)。将显示“选择一个密钥文件”对话框。选择一个密钥文件,然后单击“打开”。在测试运行配置编辑器中,单击“应用”,再单击“关闭”。
如果您要测试多个已签名的程序集,Visual
Studio
会尝试重新签名使用您指定的密钥文件签名的所有具有强名称的程序集。有关更多信息,请参见对程序集进行检测和重新签名中的“重新签名程序集”。
查看代码覆盖率数据先决条件:已经运行已生成代码覆盖率数据的测试,如获取代码覆盖率数据中所述。
查看代码覆盖率数据在“测试结果”工具栏上,单击“代码覆盖率结果”。或者,也可以单击“测试”菜单上的“窗口”,然后单击“代码覆盖率结果”。
将打开“代码覆盖率结果”窗口。
在“代码覆盖率结果”窗口中,“层次结构”列显示一个节点,其中包含有在上一次测试运行中获取的所有代码覆盖率数据。如果发生了错误,则在此位置(而非根节点中)显示错误信息。如果显示有节点,请将其展开。注意默认情况下,该测试运行节点采用
用户名@计算机名
日期
时间
的格式命名。可以在“选项”对话框的“常规”页上更改默认命名方案。有关更多信息,请参见如何:指定测试运行配置。依次展开程序集、命名空间和成品代码中某个类的节点。
类中的各行表示类的方法。此表中的列显示了各个方法、类和整个命名空间的覆盖率统计数据。
双击类中的一个方法所对应的行。
将打开源代码文件并转到您选择的方法。在此文件中,可以看到代码突出显示效果。通过滚动,可以看到此文件中其他方法的覆盖率。要更改代码行的突出显示颜色,请参见更改代码覆盖率数据的显示。注意可以单击“测试工具”工具栏上的按钮以切换文件中代码覆盖率的显示,以及导航到文件中前面的或后面的代码行。
(可选)如果选中了测试项目的
DLL
所对应的复选框,则可以打开包含单元测试的源代码文件,以查看执行了哪些测试方法。
更改代码覆盖率数据的显示默认情况下,将使用特定的颜色来指示代码是否被已运行的测试覆盖了。用浅蓝色突出显示的代码行已在测试运行中执行过,而用红褐色突出显示的代码行则还没有执行过。在用米色突出显示的代码行内,有些代码已执行过,有些代码则还没有。
更改代码覆盖率数据的显示单击“工具”,然后单击“选项”。将显示“选项”对话框。
展开“环境”。单击“字体和颜色”。
在“显示其设置”下,选择“文本编辑器”。在“显示项”下,选择要更改其显示颜色的代码覆盖率区域。可用的选项有“覆盖率未涉及的区域”、“覆盖率部分涉及的区域”和“覆盖率涉及的区域”。更改此代码覆盖率区域的设置。可以更改前景色和背景色、字体、字号和文本的粗体设置。(可选)更改其他代码覆盖率区域的设置。
完成上述操作后,单击“确定”。
java web怎么用emma进行代码覆盖率测试
使用 emma 2.1 (emma-stable-2.1.5320-lib) 1. 新建 /home/q/java/emmalib 目录, 将emma.jar 与 emma_ant.jar 放入 2. 复制 /server/bin/mobileserver/runServer.sh 到 runServer_emma.sh 修改启动语句。
使用 emma 2.1 (emma-stable-2.1.5320-lib)
1. 新建 /home/q/java/emmalib 目录, 将emma.jar 与 emma_ant.jar 放入
2. 复制 /server/bin/mobileserver/runServer.sh 到 runServer_emma.sh
修改启动语句
nohup java -Xmx1800M -Xms800m -Xbootclasspath/p:/home/q/java/emmalib/emma.jar -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider -XX:+AggressiveOpts -XX:+UseParallelGC -server -classpath "$jarFile" com.qunar.common.mobileArc.MobileServer conf/TaLog.property conf/TripServer.property $LOG_HOME/error.log 21
复制 /server/bin/mobileserver/stopServer.sh 到 stopServer_emma.sh
添加覆盖率导出命令
插入 emma 统计代码
使用root账号
1. 备份mobileserver.jar
cp /server/TripAssistant/mobile-server.jar $MOB_JAR_BAK/mobile-server.jar.{$timestamp}
2. 执行插入命令
java -cp /home/q/java/emmalib/emma.jar emma instr -m overwrite -cp mobile-server.jar -out coverage.em
输出如下:
EMMA: processing instrumentation path ...
EMMA: instrumentation path processed in 3117 ms
EMMA: [1000 class(es) instrumented, 126 resource(s) copied]
EMMA: metadata merged into [/server/TripAssistant/coverage.em]
3. 运行mobileserver runServer_emma.sh
sudo sh /server/bin/mobileserver/stopServer.sh sudo sh /server/bin/mobileserver/runServer_emma.sh
在 /server/mobileserverlog/error.log中可见:
EMMA: collecting runtime coverage data ...
EMMA: runtime controller started on port [47653]
emma control 进程已启动
[root@l-wap4.beta.cn1.qunar.com /server/mobileserverlog]# netstat -na | grep 47653
tcp 0 0 0.0.0.0:47653 0.0.0.0:* LISTEN 20926/java
4. 执行 覆盖率文件导出命令
java -cp /home/q/java/emmalib/emma.jar emma ctl -connect localhost:47653 -command coverage.get,coverage.ec
可见输出:
EMMA: processing control command sequence ...
EMMA: executing [coverage.get (coverage.ec,true,true)] ...
EMMA: coverage.get: local copy of coverage data merged into [/server/TripAssistant/coverage.ec]
EMMA: coverage.get: command completed in 79 ms
EMMA: control command sequence complete
并且当前目录生成文件 coverage.ec
5. 生成报告
java -cp /home/q/java/emmalib/emma.jar emma report -r html -in coverage.em,coverage.ec
指定源代码生产覆盖率报告(需先上传源码)
java -cp /home/q/java/emmalib/emma.jar emma report -r html -in /server/TripAssistant/coverage.em,/server/TripAssistant/coverage.ec -Dreport.html.out.file=mycoverage/coverage.html -sp /home/liang.zhou/mob_code_dir/mobs_trunk/src/main/java
emma 方式启动 mobserver
==================================
1. 判断mobserver.jar size, 大于5M 为已插入过, 小于5M为未插入(需要执行插入)
2. 执行插入
3. 启动
4. 检查启动状态
47653 端口打开
mobileserver 进程打开
emma 方式停止 mobserver
==================================
1. 检查47653端口打开状态, 检查coverage.em是否存在
2. 导出覆盖率文件 coverage.ec, 备份coverage.em (加上时间戳)
3. 导出覆盖率HTML report (加上对应时间戳)
4. kill mobserver 进程
ls -lt mobile-server.jar
判断 $? == 0
判断mobile-server.jar size是否大于 5M
#!/bin/bash
function stop_mob_server(){
#!/bin/bash
function stop_mob_server(){
pid=`ps aux | grep MobileServer | grep -v grep | awk '
Unknown macro: {print $2}
'`
` kill -9 $
Unknown macro: {pid}
`
sleep 1
echo "Stop mobileserver success."
}
#判断 emma ctl 是否启动
port_check_result=`netstat -na | grep 47653 | awk '
Unknown macro: {print $1}
'`
if [ -z $
Unknown macro: {port_check_result}
]; then
echo "Emma ctl port 47653 is not LISTEN. Coverage.ec export operation aborted."
else
#emma ctl 为启动状态,导出 coverage.ec, 并备份至 /home/q/mobsrv_cov
if []
fi
java获取代码覆盖率的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java代码覆盖率测试工具、java获取代码覆盖率的信息别忘了在本站进行查找喔。