本文详细介绍了在 Rational Application Developer(RAD)V7
以及 V7.5 中如何实现 Java 代码覆盖率测试和报表的生成,并提供了 GUI 和 Command
Line 两种方式。本文能够在读者需要使用 RAD 建立 Java 代码覆盖率测试解决方案时提供足够的帮助,同时为希望深入了解
RAD 功能的读者提供了代码覆盖率方面的详细资料。
覆盖率是用来度量测试完整性的一个手段。软件的覆盖率总体上分为逻辑覆盖(代码覆盖率和结构化覆盖)和功能覆盖。通过覆盖率数据,可以知道测试得是否充分,测试得弱点在哪些方面,进而可以指导我们设计能够增加覆盖率的测试用例。
代码覆盖率是一种用来度量已执行的软件测试水平的方法。收集覆盖度量数据的过程很简单:监测您的代码,并对所监测的版本运行测试。这样就可以生成相关数据,展示已执行哪些代码以及未执行哪些代码。覆盖测试是对单元测试的完美补充:单元测试可以显示出是否代码按预期执行,而代码覆盖率可以表明还需要对哪些代码进行测试。
IBM® Rational® Application Developer(RAD),构建在用于构造和集成软件开发工具的可扩展平台
Eclipse 上,提供了非常强大的构架、开发、测试、分析及部署软件解决方案的能力。
它不仅为设计开发人员提供了一个丰富的建模、架构设计和集成开发环境,同时也为开发测试人员定位运行时问题,提高代码质量提供了数据分析,比如内存泄漏分析,性能瓶颈分析以及代码覆盖率分析。
IBM Rational Agent Controller(RAC)起源于数据收集引擎,是一个守护进程,让客户机应用可以启动并管理本地或远程的应用程序,并为其他应用程序提供有关正在运行的程序的一些信息。它是和
Rational 开发工具(Rational Application Developer、Rational
Web Developer 或 Rational Software Architect)一起安装的组件。安装以后它成为你的
PC 中运行的一个服务,管理代理以及代理产生的数据。在安装 Agent Controller 之后,就可以使用以下的工具了:
1. 性能剖析工具,用来对程序进行剖析。(在要剖析的程序所在的系统上安装 Agent Controller。)
2. 日志记录工具,用来导出远程日志文件(在要导出日志文件的远程系统上安装并启动 Agent Controller。)
3. 运行测试用例所需要的组件测试工具。(在运行测试用例的系统上安装 Agent Controller。)
4. 可以进行代码插入、覆盖和内存泄漏分析的一些运行时分析工具。比如:显示那些行和方法被执行了?哪些代码在我当前写的测试例中没有被调用?
5. 用于 WebSphere® Application Server 上的远程应用程序测试的工具。
关于代码覆盖率分析的方式和过程,RAD7.0 和 RAD7.5 这两个主流版本,有很大差别,建议读者选择适合自己需要的版本。
- RAD7.0 的代码覆盖率是 profiling 功能的一部分(依赖于 Agent Controller),而
RAD7.5 把代码覆盖率从 profiling 功能中独立了出来。
- RAD7.0 支持代码中方法级别的覆盖,而 RAD7.5 支持到行级代码覆盖率。
下面将通过示例的方式,一步步地介绍如何实现代码覆盖率分析。由于 RAD7.0 和 RAD7.5 的实现过程差异很大,本文会分别介绍这两个版本。
准备知识
RAD 中的 Profiling 功能可以收集到 java 程序运行时的各种数据,本文仅讨论代码覆盖率方面的
Profiling 功能。Java 程序运行时,用户的一系列操作在
JVM 层面可以观察到代码的执行路径,比如哪个 class 被调用了,哪个 method 被调用了,调用顺序是什么,调用了几次等。
RAD 中的 Profiling 功能来自于 Eclipse 的 TPTP plugins,如果您使用
Eclipse 作为 IDE,可以登录 Eclipse 网站下载安装。
RAD 使用 Rational Agent Controller(RAC) 来收集各项 profiling
数据,Rational Agent Controller 分为两种,一种是 integrated agent
controller,一种是 standalone agent controller。在一台机器上,同时只能有一个
agent controller 起作用,因此在安装 RAD 的机器上就不必再安装 agent controller
了。
RAD7.0 中收集代码覆盖率数据的方式概览
RAD7.0 中只能获取到 method 级别的代码覆盖率数据。根据待分析的 java application
所处位置和所需软件的不同,本文把 RAD7.0 的 profiling 分析划分为四种方式。
首先概要介绍四种方式在什么情况下使用,
方式一,java application 是在 RAD 中创建的一个 java project。
环境:一台机器,该台机器上仅安装 RAD7.0。RAD 使用 integrated agent controller
来收集 profiling 数据,收集结束之后在“Profiling and Logging”视图中展示。
图 1. 测试 RAD 中的 Java project
方式二,java application 和 RAD 在同一台机器,但是它不是 RAD
中的一个 Java project。
环境:一台机器,该台机器上仅安装 RAD7.0。RAD 使用 integrated agent controller
来收集 profiling 数据,收集结束之后在“Profiling and Logging”视图中展示。
图 2. 测试非 RAD 中的 Java project
方式三,java application 和 RAD 在不同机器上。
环境:两台机器,机器 A 上仅安装 RAD7.0,机器 B 上仅安装 Rational Agent Controller。
RAD 连接机器 B 上的 standalone agent controller 来收集 profiling
数据,收集结束之后在“Profiling and Logging”视图中展示。
图 3. 测试远程机器上的 Java project
方式四,java application 和 RAC 在同一台机器上,无 RAD。
环境:一台机器,该台机器上仅安装 Rational Agent Controller。用户添加 profiling
运行参数,在 command line 启动 java application。RAC 即可收集 profiling
数据,收集到的数据存储到磁盘文件中。
图 4. 仅使用 RAC 进行测试
RAD7.0 中收集代码覆盖率数据的详细过程
上面简单介绍了四种方式的 profiling 分析,接下来详细介绍这四种方式的操作过程。
接下来以一个 JDK 提供的例子程序作为分析对象,介绍 RAD7.0/RAC7.0 中如何通过 profiling
进行代码覆盖率分析。
所用的 JDK 例子为 Notepad,包含了两个源代码文件。在 RAD7. 0 中建立一个项目,叫
Notepad,然后把 JDK 提供的源代码 java 文件拷贝到 src 中,并把 resource
目录拷贝到项目文件夹下,就完成了项目的建立。尝试编译运行一下,如果没有问题,就可以进行下面的步骤了。
方式一,对 RAD 中的 java project 做 profiling 分析,这种方式下只能针对
RAD 中的 java project。
首先打开 RAD 的”Profile…”菜单:
图 5. RAD Profile 菜单
(查看大图)
然后在”Java Application”类别下创建一个新的 configuration,在这个 configuration
中指定我们需要做 Profiling 的 Project 以及 Main Class
图 6. RAD Profile 界面
(查看大图)
接着在 Monitor 标签中选择需要收集的数据,这里我们选择”Method 代码覆盖率”,也就是 method
级别的代码覆盖率数据。
图 7. RAD Profile 中代码覆盖率选项
(查看大图)
然后点击”Profile”按钮,RAD 就会启动前面指定的 Java application,我们在启动的
Application 中做一些操作:
图 8. 测试例程
(查看大图)
对启动的 Application 中做的一系列操作,通过 Profiling 记录了以下信息:哪个 class
被调用了,哪个 method 被调用了,调用了几次等。操作结束之后关闭 Application,那么 Profiling
的操作也就结束了,这时候 RAD 会把记录下来的代码覆盖率数据以 report 方式展示出来:
图 9. 测试结果
(查看大图)
方式二,对本机上的一个 java application 做 profiling 分析,这种方式下 java
application 只需能够在命令行启动即可,不需要在 RAD 中创建 java project。
首先打开 RAD 的“Profile…”菜单,在“External Java Application”类别下创建一个新的
configuration,在这个 configuration 中指定连接方式为”Local Direct
Connection”。
图 10. 建立远程 Profile
指定我们需要做 Profiling 的 java application 以及 Main Class:
图 11. 建立远程 Profile(2)
接着在 Monitor 标签中选择需要收集的数据,这里我们选择“Method 代码覆盖率”,也就是 method
级别的代码覆盖率数据。
图 12. 启用代码覆盖率选项
然后点击“Profile”按钮,RAD 就会启动前面指定的 Java application,我们在启动的
Application 中做一些操作:
图 13. 测试例程
(查看大图)
上述操作调用了哪个 class,调用了哪个 method,调用了几次等数据都会被一一记录下来。操作结束之后关闭
Application,RAD 会把记录下来的代码覆盖率数据以 report 方式展示出来:
图 14. 测试结果
(查看大图)
方式三,对远程机器上的一个 java application 做 profiling 分析,这种方式更加灵活,RAD
能够通过 RAC 启动远程的 java application,并且收集运行数据,生成代码覆盖率报告。
首先打开 RAD 的“Profile…”菜单,在“External Java Application”类别下创建一个新的
configuration,在这个 configuration 中添加一个到远程 agent controller
所在机器的连接。
图 15. 添加远程链接
然后测试一下到远程机器的连接是否可以工作:
图 16. 测试远程链接
指定我们需要做 Profiling 的 java application 以及 Main Class:
图 17. 指定测试对象
接着在 Monitor 标签中选择需要收集的数据,这里我们选择“Method 代码覆盖率”,也就是 method
级别的代码覆盖率数据。
图 18. 启用代码覆盖选项
然后点击“Profile”按钮,RAD 通过 agent controller 启动远程机器上的 Java
application,我们在启动的 Application 中做一些操作:
图 19. 测试例程
其间,哪个 class 被调用了,哪个 method 被调用了,调用了几次等数据会被 profiling
记录下来。操作结束之后关闭 Application,那么 Profiling 的操作也就结束了,RAD
将从远程机器上收集下来的代码覆盖率数据以 report 方式展示出来:
图 20. 测试结果
(查看大图)
方式四,机器上只安装了 RAC7.0,没有安装 RAD。通过添加 profiling 运行参数,在 command
line 启动 java application。RAC 即可收集 profiling 数据,收集到的数据存储到磁盘文件中。
例子程序 Notepad 的启动方法命令是:
java -XrunpiAgent:server=standalone,filters=filter.txt,file=MyCoverage.trcxml
-jar Notepad.jar
可以看到,和普通的运行 java application 程序的命令相比,多了一个参数:
-XrunpiAgent:server=standalone,filters=filter.txt,file=MyCoverage.trcxml
这个参数中有三个选项:
Server=standalone,表明这个 RAC 是独立运行的,和 RAD 没有交互。
Filters=filter.txt,指定一个 filter 文件,定义需要 / 不需要收集什么样的数据。
File=MyCoverage.trcxml,采集到的代码覆盖率数据放在这个文件里。
上面提到的第二个选项“Filters=filter.txt”需要说明一下,这个文件是一个文本文件,每一行有三个字段,以空格隔开(package/class
method mode)。下面是一个例子,读者一看就明白了:
com.ibm* * EXCLUDE
com.sun* * EXCLUDE
COM.ibm* * EXCLUDE
java* * EXCLUDE
org* * EXCLUDE
sun* * EXCLUDE
上面提到的第三个选项也需要说明一下,RAC 获取到的代码覆盖数据就存储在这个文件里。它是一个 xml
文件,用户可以自己写程序解析这个文件,也可以使用 RAD 打开它并查看代码覆盖情况(在 RAD 的“Profiling
and Logging”视图中导入即可)。
RAD7.5 中几乎完美的支持了 java 程序的“行级”代码覆盖率。不但可以在 IDE 中方便的设置和展示测试结果,同时也很好的支持了在
command line 环境下的 do instrument,生成测试 log 以及生成结果报告。后者为行级代码覆盖率的测试和生成报告的全自动化提供了可能。
在安装 RAD7.5 时,行级代码覆盖率功能会作为一个组件包含在可选组件列表中,默认安装时是选中的。
IDE 中进行行级代码覆盖率测试
在这里,本文同样以 JDK 自带的 Notepad 为例,讲述如何在 RAD7.5 中进行行级代码覆盖率测试。
启用代码覆盖率功能
在项目的属性页中,代码覆盖率是一个独立的项,默认是不启用的。选中“Enable 代码覆盖率”,就启用了代码覆盖率。下面的参数是对代码覆盖率进行标注的设置,如果没有达到设定的代码覆盖率,相应的对象会被标注为红色,反之则会被标注为绿色。再下面是过滤器的设置,这个根据具体的项目可以设定哪些源代码文件会进行测试或者哪些会被排除在外。
图 21. 启用代码覆盖率测试功能
(查看大图)
在确定选择之后,RAD 弹出对话框,为了启用代码覆盖率,要重新 build 整个项目,在这里请选择 Yes。否则代码覆盖率还是没有被启用,直到下一次重新
build 项目。
图 22. 重新 build 项目
在项目被重新 build 后,项目中会增加一项 Referenced Libraries,这个 RLC.jar
就是完成行级代码覆盖率功能的文件。
图 23. 代码覆盖率功能文件
测试及生成结果
下面就开始进行代码覆盖率测试。先运行项目,弹出了 Notepad 的界面,在这里我们只做一次打开文件的操作,来看看打开文件的操作覆盖了哪些代码。
图 24. 测试例程
点击 Open 之后关闭整个 Notepad 窗口,结束项目的运行。然后来到 RAD7.5 中打开 Notepad
项目的 src 目录,这时 package 和源代码文件以及每一个可以打开的节点都被标上了颜色,后面还有一个百分比数字。颜色就表示这次对该对象,代码覆盖率是否达到了之前设定的值。数字就是行级代码覆盖率。
图 25. RAD 显示测试结果
(查看大图)
在图中,我们也可以看到在代码显示窗口,有绿色和红色的标识来显示哪些代码行被覆盖了而哪些没有被覆盖到。
生成报告
很多情况下对代码覆盖率的测试不只是在 IDE 中观察,而需要输出报告。RAD7.5 提供了完整的报告生成功能。
选择菜单 Run->Code Coverage->Generate Report,列出了可以生成报告的项目和测试状态。用户可以选择输出
Eclipse 或者 HTML 报告格式,也可以选择报告存储的地点。
图 26. 报告生成界面
下面是一个 Eclipse 格式的报告的例子,在图中,我们可以清楚的看到总行数,覆盖到的行数以及百分比。双击某个想要查看的项目就会打开对应的源代码视图。
图 27. Eclipse 格式报告
这里是一个 HTML 报告的例子,HTML 格式的报告无法做到包含所有的源代码,但优点是可以直接在测试报告的网站中使用,或者直接发布给所有关心测试结果的人查看。
图 28. HTML 格式报告
(查看大图)
图 29. HTML 格式报告 (2)
(查看大图)
Command Line
环境中进行行级代码覆盖率测试
在 IDE 环境中很多细节都由 RAD 处理了,用户之需要选择一些选项就可以了,可是对于需要在 Command
Line 环境下进行测试和生成报告的用户来说,就需要了解更多的细节。
启用代码覆盖
对于一个普通的 java 项目 jar 包,首先需要对它做 instrument。这个过程与在 IDE 中对某个项目启用代码覆盖,并且重新构建是一样的。只不过代码覆盖需要的内容被直接插入到了
jar 包中。我们用没有 enable 代码覆盖率的 Notepad 项目输出 Notepad.jar
作为下面的例子。(在输出 jar 文件时,RAD7.5 还提供了一个直接输出做过 instrument
的 jar 文件的选择。)
要做 instrument,首先需要在系统中设置 ECLIPSE_HOME 和 JAVA_HOME 环境变量。如果没有这两个变量,工具会从
RAD 安装目录下查找。为了避免以后的麻烦,还是设置上更为稳妥。两个变量的内容顾名思义,就不用多解释了。
然后寻找到 instrument.bat 文件。该文件应该被存储在 RAD7.5 安装时设定的 Shared
目录中。如果机器上还安装过其他的 Rational 产品,该目录有可能与 RAD7.5 不在同一个父目录下。比如用户安装过
RFT7.0 在 C:\ibm 目录,那么该 Shared 目录就是 c:\ibm\SDP70Shared。在作者的机器上,instrument.bat
位于
C:\IBM\SDP70Shared\plugins\com.ibm.rational.llc.engine_1.0.0.v20080821_1200\Scripts
目录下。为了使用方便你可以选择把这个路径加入到系统 Path 环境变量中。
按照 RAD7.5 的帮助文档,我们就可以来对 Notepad.jar 做 instrument 了。可实际上还有一个路径需要添加才可以。在
Rational 产品的 Shared 目录中查找 ort.eclipse.hyades.probekit
的最新版本,然后找到里面包含的 ProbeInstrumenter.exe 所在的目录,添加到系统 Path
环境变量中。在作者的机器上,该路径是:
C:\IBM\SDP70Shared\plugins\org.eclipse.hyades.probekit_4.2.400.v200809010100\os\win32\x86
我们先把 Notepad.jar 放到 c:\source 目录下,并建立好 c:\output 目录作为输出目录,然后按照下面的格式即可对
Notepad.jar 进行 instrument 操作:
Instrument –in c:\source\Notepad.jar –output c:\output
如果成功的话,就会在 c:\output 下面生成一个 Notepad.jar,这个 jar 文件就可以用来做代码覆盖率测试了。
代码覆盖测试
把 Notepad 的 resource 目录拷贝到 c:\output 目录。这时如果尝试运行 Notepad.jar,会产生某些
class 无法找到得错误。这是因为注入到 Notepad.jar 中的代码覆盖率内容需要几个 jar
文件的支持。下面是我运行做过 instrument 之后的 Notepad.jar 文件的命令:
Java -Dcoverage.out.file=C:\coverage_data.coveragedata
-classpath d:\work\javades\Notepad.jar;
C:\IBM\SDP70Shared\plugins\org.eclipse.hyades.probekit_4.2.400.v200809010100\probekit.jar;
C:\IBM\SDP70Shared\plugins\com.ibm.rational.llc.engine_1.0.0.v20080821_1200\RLC.jar
Notepad
其中 Dcoverage.out.file 参数指定的就是代码覆盖测试的结果文件。在 classpath
中指定的两个 jar 文件也是必须的。
如同前面介绍的在 IDE 中做代码测试的过程,在 Notepad 的界面中进行需要的操作,然后退出。
这时检查 c:\coverage_data.coveragedata 文件,已经被产生并且有了内容。该文件是一个
XML 文件,记录了详细的行级代码覆盖内容,用户可以根据文件的内容自行生成测试报告。
当然更为方便的做法还是利用 RAD7.5 来生成报告。
生成报告
在 RAD7.5 的 IDE 中选中 Notepad 项目,然后选择菜单 File->Import,选择
Code Coverage->Code Coverage Data File,选择 Data File
is located on the file system。选择刚才生成的 c:\coverage_data.coveragedata,选择导入的文件夹和项目。如果该项目没有
enable 代码覆盖的话,会有一个对话框询问,选择 yes。该文件就被导入到 Notepad 项目中。
选择 Run->Code Coverage->Generate Report,可以看到在可以生成报告的列表中多了一项
coverage_data,选择它生成的报告就是刚才导入的 coverage_data.coveragedata
数据文件中的内容。
这个生成报告的过程也可以通过 Ant 来完成。首先需要下载 BIRT Runtime Report Engine,这个工具可以在http://download.eclipse.org/birt/downloads下面下载到。然后指定
LLC_COMMON_PLUGIN, LLC_REPORT_PLUGIN 和 BIRT_HOME 三个参数到各自的内容。在作者的机器上,设置内容为:
LLC_COMMON_PLUGIN= C:\IBM\SDP70Shared\plugins\com.ibm.rational.llc.engin_1.0.0.v20080821_1200
LLC_REPORT_PLUGIN= C:\IBM\SDP70Shared\plugins\com.ibm.rational.llc.report.birt_1.0.0.v20080818_1950
BIRT_HOME=c:\birt-runtime-2_5_0
在 Ant 中设置的例子为:
<path id="lib.path"> <pathelement
location="${env.LLC_COMMON_PLUGIN}"/> <pathelement
location="${env.LLC_REPORT_PLUGIN}"/> <fileset
dir="${env.BIRT_HOME}/lib" includes="*.jar"/>
</path>
然后定义一个新的 task:
<taskdef name="code-coverage-report" classname="com.ibm.rational.llc.report.birt.adapters.ant.ReportGenerationTask"
classpathref="lib.path"/>
用下面的内容定义报告的参数:
<code-coverage-report outputDir="c:\report"
coverageDataFile="c:\coverage_data.coveragedata"
baseLineFiles=""> <filters> <filter
type="" value=""/> </filters>
</code-coverage-report>
使用这种方法只能生成 HTML 格式的 report,不过对于 command line 环境来说,这就足够了,eclipse
格式的报告并无意义。
RSA 是一个用于创新和协作的整合平台。它是行业最佳、全面的工具集合,为用户的通信和协作提供便利,可以帮助用户创新和加速交付软件开发项目。
RSA 所能提供比 RAD 更多的新特性有:
- 利用各种不同领域中最新的建模和图形编辑技术,这些领域包括 UML™ 2、Java、XSD、Web、技术基础设施等等。
- 创建和利用用户自己的领域特定建模语言 (DSML),以表示您独特的业务问题和解决方案领域。
- 确保用户的软件解决方案始终正确地部署——使用智能工具进行部署定义和验证。
- 全面支持更简单的、全新的编程模型,包括 Web2.0、J2EE 5、EJB3.0、JPA。
- 采用可追溯的平台,更高效地管理用户的开发风险和项目,帮助用户分析从需求到设计再到实现的影响。
- 通过已包含的和定制的转换功能,以及已有的创作工具,启动开发流程并自动化单调的任务。
- 包含 IBM Rational Application Developer,能够提供完整的设计和开发体验。
- 架构分析工具可用于审核和管理用户的 java 和面向服务应用程序的结构。
- 面向并行开发和架构重构的灵活的模型管理,使用户能够分离、组合、比较和合并模型和模型片段。
- 与 IBM Rational 软件交付平台无缝整合的协作平台,这些软件交付平台包括 IBM Rational
Team Concert、IBM Rational Asset Manager、IBM Rational
Requirements Management and Change Management 解决方案。
因为在 RSA 中包含了完整的 RAD,所以在 RSA7.0 和 RSA7.5 中可以使用与 RAD
完全相同的方式实现代码覆盖率测试。代码覆盖率涉及到的菜单位置在 RSA 中也和在 RAD 中相同。使用
RSA 的用户使用本文提供的方案可以实现和 RAD 一样的代码覆盖率分析功能。
如前所述,RAD7.0 和 7.5 两个版本上以不同的方式支持了代码覆盖分析,用户可以根据自己的需要进行选择。
RAD7.0 的用户可以很方便地针对本机以及远程机器上的 java 程序进行代码覆盖分析,分析报告可自动生成。同时它也支持
Command Line 方式收集代码分析数据并存储到文件,这种方式比较容易和用户已有的自动化功能测试结合进行代码覆盖分析。
RAD7.5 提供了完整灵活的 IDE 及 Command Line 环境进行代码覆盖率分析的支持。开发人员可以很方便的对自己编写的单元测试或者临时的手工测试进行代码覆盖率的查看,以提高代码质量。同时对于无人值守的全自动单元测试和功能测试来说,RAD7.5
也提供了强大的支持,可以在与自动化测试工具结合后,实现自动做 instrument,自动生成报告的流程。并且做过
instrument 的 jar 文件或 class 文件基本不会影响程序运行的速度,这样对正常测试的影响就被减到了最小。
代码覆盖率在实际应用中常与自动测试相结合以达到最好的效果。自动测试过程中的代码覆盖率分析,以最小的测试代价,最精确的分析,来获得当前的测试完成情况,为测试人员提高了良好的分析报告,以便测试人员改进和新增新的测试用例。大大提高了回归测试的测试效率与质量。
学习
获得产品和技术
讨论
|