Optimizeit Code Coverage概览
本文通过介绍Optimizeit Code Coverage的一些主要特征来使你对它有个简要的了解。如果想要知道更多的信息,请查看Optimizeit Code Coverage用户手册。也可以从Optimizeit Code Coverage中单击菜单info|help来查看所有的使用文档。
使用中有何问题,请随时与Borland Technical Support联系。
测试一个java程序
Optimizeit Code Coverage是从运行程序的虚拟机中收集程序的覆盖信息的。
首先要运行一个java程序,您需要安装一个java虚拟机。Optimizeit Code Coverage默认安装配置JDK 1.4 or 1.4.1。如果你想使用另外的虚拟机,可以查看Optimizeit Code Coverage用户手册的如何增加新的虚拟机部分。
启动应用程序
Optimizeit Profiler可用来测试任何类型的java程序,包括标准的应用程序、应用小程序、servlets、jsp,ejb等。
本文中的演示是以一个银行帐户程序为测试对象,此程序包含在Code Coverage的quicktour目录下。Banking.java是主类,它被用来创建和处理用户所要求的不同类型的事务。一般每个用户有四个银行帐户:
§ 结算帐户(C)(checking account)
§ 储蓄帐户(P)(primary savings account)
§ 助学贷款返还帐户(S)(student loan repayment savings account)
§ 汽车贷款返还帐户(L)(car loan repayment account)
银行帐户有如下共同的属性:
§ 帐户号(account number )
§ 持有者姓名(owner's name )
§ 余额(current balance )
核算帐户没有利息,没有最低余额,不会产生利息。对储蓄帐户来说,当存入款项时发生利息,但是要求帐户的余额大于500美元。储蓄帐户也用来防止结算帐户中发生透支的情况。如果从核算帐户的提取的金额大于当前的余额,那么就会自动地从基本储蓄帐户转到核算帐户。基本储蓄帐户每次处理的交易额要求不小于15美元。
假设我们已经使用JUint来测试了Banking.java:
§ BankAccountTest1提供了通过Banking类来实现事务的处理的测试。通过Code Coverage来运行这个测试,可以查看到通过BankAccountTest1的测试对Banking.java类的覆盖率。我们测试的目标是100%地覆盖Banking类。Code Coverage提供了Banking.java类的类名和方法信息,这样你就可以从源代码中找出多少代码没有被BankAccountTest1执行。
§ BankAccountTest2用来证明能够通过Code Coverage覆盖Banking类的100%的代码。
以下测试是通过JUnit TestRunner运行的。你可以从www.junit.org 下载最新版本的JUnit。整个测试过程完全通过Code Coverage来完成的。
下载JUnit并解压到本地磁盘。
打开Optimizeit Code Coverage。
如果是第一次打开,Optimizeit会自动打开编辑设置窗口,如果已经打开了Optimizeit,可以从菜单File下选择New,也会弹出该窗口。
在程序类型框中,选择Application。
在Program main class or Jar file框中输入junit.swingui.TestRunner。
单击浏览按钮选择程序的工作目录,请选择JUnit的安装目录。
Code Coverage自动返回到编辑设置窗口。在Class Path下面单击Change。
在Class Path Chooser中, 打开到JUnit安装根目录并且选择junit.jar文件。单击向下按钮把junit.jar加入到类路径中。
再打开到Optimizeit Code Coverage quicktour目录并选择\doc\code_coverage\quicktour目录。单击向下按钮把它加入到类路径中。
单击OK返回到编辑设置窗口。
在源代码路径窗口下单击change按钮。
在Source Path Chooser窗口中,打开到Optimizeit Code Coverage quicktour目录并且选中\doc\code_coverage\quicktour目录,然后单击向下按钮加入到源代码路径中。
单击OK返回到编辑设置窗口。这样你就可以在测试过程中不用进行其它配置就可以看到源代码了。此时Optimizeit返回的编辑设置窗口如下:
可以选择过滤标签在过滤窗口中选择要分析覆盖率的类。默认的设置是排除了所有的Java核心代码类。并且确认已经排除了所有的Junit类。默认的排除列表中应该包含了junit.*.
单击Virtual Machines标签,可以选择不同的JDK。
单击Start Now按钮。
Edit Settings窗口自动关闭, Optimizeit Code Coverage自动加载JUnit TestRunner应用程序。
查看类代码覆盖率
本部分介绍通过不同的方法来查看类测试的代码覆盖率。
在Junit中,不选中Reload Classes Every Run。
单击Test class name输入框右面的省略号按钮。在弹出的Test Selector窗口中,选择BankAccountTest1,然后单击OK。
单击Run按钮来执行BankAccountTest1。你将看到按钮下方绿色的滚动条,证明通过了所有的测试。
在程序运行之后, Optimizeit Code Coverage会实时显示虚拟机中所有已经加载的类,并且显示他们各自代码的覆盖情况。
黄色的横条表示了每个类的覆盖率。可以使用两种方式来查看这个信息。例如,从工具栏上单击检测按钮 打开检测窗口。
选中Show Line Coverage。这样表中将增加两列内容。如下所示:
Missed lines列表示所选的类中有未被执行的行数和类的总行数。例如图中Banking类有217行代码,有20行代码没有被执行,代码覆盖率为90.78%。
单击检测按钮选中Show All Accessible Classes。这样将会在窗口中显示出没有加载到虚拟机中的类。你可以在窗口中看到新增了一行,classname为斜体显示的BankAccountTest2 ,代码覆盖列显示“CLASS NOT LOADED”。
单击工具栏中的标记按钮 来重置Diff列。Missed Lines Diff列也会被重置了(Missed Lines Diff列的数字被重置为代码的总行数,表示所有行都未覆盖到)。使用标记可以方面地理解当你执行程序中的一个操作时使用了哪个类。可以在未进行某个操作前先单击标记按钮做一标记,然后继续进行操作,它会自动产生新的代码覆盖情况记录,来和标记的记录进行比较。
查看方法的覆盖率
我们的目标同样是要达到覆盖Banking类100%的代码。从Class Coverage窗口中我们可以看到即使JUnit的测试结果中显示100%成功但是仍然只覆盖了Banking类90.78%的代码。为了分析的更加清楚,我们使用方法覆盖视图来查看代码覆盖情况:
在类覆盖表中,选中Banking类,然后单击工具栏上的Show Method Coverage 按钮或者直接双击该行。Optimizeit Code Coverage就会打开到方法覆盖率窗口:
窗口的上方显示了Banking类中的所有的方法列表和他们的执行覆盖情况,被调用次数和未被执行的代码行数、总行数。窗口下方显示了类的源代码。
单击方法列表中的parseArguments方法行。源代码窗口自动滚动到该方法的代码行,你可以看到有些行中call列对应的值为0,这表明改行从未被调用。Call列中没有数字的行,比如注释行,都不会在在类文件中生成字节。
单击工具栏上的检测按钮打开检测窗口,选中Show Method Signatures。这样就可看到Banking类中所有类的特征。
在检测窗口中选中Show Difference。 Optimizeit会增加新列:
Invocation # Diff列表示自从上次标记以后该方法执行的次数。
多出了Missed Lines Diff列。
源码框中Calls列后也多出了一列(Diff),其值表示标记以后该行代码被执行的次数。
显示出了parseArguments的覆盖率是95.45%。如果能够在该方法中找到calls值为0的行,这就对应于Banking处理一个无效的事务。
另外一个没有达到100%覆盖的是Transfer方法,只达到了95.45%。在代码列表中没有以黄色底显示的代码为未被执行的代码。对应的业务操作是试图从助学贷款中取出大于当前余额的资金。
在方法覆盖表中,找到PrintDescription方法,图中显示该方法实际并没有被调用。
单击检测按钮并且选中Highlight Since Mark选项。这样就会从所有的已经被执行的代码中黄色底就会消除,因为自从上次做过标记以后没有再执行Banking类中的代码。
单击检测按钮并且选中Real Time选项。这样Optimizeit就会即使显示覆盖信息。在方法覆盖表中选中方法PrintDescription方法。代码窗口就会自动滚动到该方法。这个方法中所有行的调用次数都为0,是由于迄今为止该方法一直未被调用。
在JUnit中选择BankAccountTest2并单击运行。
在Optimizeit Code Coverage中你就会看到各种方法的调用次数在改变。例如,parseArguments方法的调用次数变多了。
在代码窗口中PrintDescription 方法的所有行都以黄色底显示。从该表中我们可以看出parseArguments 方法和Transfer方法的覆盖率达到了100%。选中Transfer方法并且从检测器中取消选中Highlight Since Mark 项。这样源代码表中先前测试中没有黄底色显示的代码现在也以黄底色显示了:
单击工具栏上类覆盖按钮或者从菜单中选择File|Class切换到类覆盖视图。类覆盖视图中Banking类的覆盖率已经达到了100%。
查看测试结果
Optimizeit Code Coverage提供了几种不同的方式来查看测试结果,你可以从当前的类覆盖视图或方法覆盖中输出数据到HTML文件。也可以输出同时包含以上两类信息到HTML文件中。
1. 在程序运行过程中,选择Banking类后单击Show Method Coverage 按钮转到方法覆盖窗口。
单击菜单File|Export,打开输出窗口。
在Export下拉框中选择Method and Source Code Coverage。
在Filename框中单击Browse按钮选择你要存放报告的位置。
在Filename框末尾输入报告名。
在Comments框中输入注释信息。
单击OK,Optimizeit会把结果输出到定义的HTML文件中并且自动打开:
如果想要生成被测程序的报告,单击工具栏上Generate Report 按钮。打开的窗口如下:
选择存放结果的目录并且输入文件名。选中options中列示的所有选项,单击Write Report按钮。Optimizeit会自动生成报告到指定的目录并在文件名后自动加上日期和时间信息并自动打开:
单击Stop Java Program 停止测试。
单击菜单File|Save保存当前的设置.
保存(并合并)测试结果
Code Coverage不仅可以在使用过程中实时查看覆盖信息,而且也提供了保存和关联测试结果的功能。在这一部分,我们来创建一个运行时信息的快照,然后通过合并来获得一个完整的程序测试结果:
从菜单File|Open选择先前保存的方案或者从菜单File|Open Recent中选择刚才保存的设置。
单击Start Now开始运行Junit。
现在在JUnit中运行BankAccountTest1。 需要注意的是Junit窗口中的Reload Classes选项不要选中。
单击Show Class Coverage 按钮切换到类覆盖窗口。
从菜单中选择File|Generate Snapshot,打开Generate Snapshot窗口:
选择一个目录并在name框中输入快照的名字,然后单击Write Snapshot按钮。
单击工具栏上的Mark按钮标记当前的类。
返回到JUnit中,从Test selectotr中选择 BankAccountTest2然后单击run。
返回到Optimizeit Class Coverage中,可以看到BankAccountTest2的测试执行后窗口中Banking类的百分比覆盖信息变成了100%,把这些信息另存为一个快照。
打开DOS窗口,把Optimizeit安装目录设置为当前目录,这个目录中有一个名为snapmerge的可执行程序。
在DOS命令行中输入:snapmerge mergefile.snp snapshot1.snp snapshot2.snp
这里mergefile.snp是合并之后的快照,snapshotx.snp是要合并在一起的快照名。注意命令行中文件名应包含.snp后缀。
返回到Code Coverage并且单击stop停止虚拟机。在虚拟机停止后Code Coverage会打开一个快照。
单击菜单File|Open snapshot,打开合并的快照。
Code Coverage显示如下:
你可以把多个快照文件合并在一起。这是很有用的。例如,如果是由不同的人员来测试一个程序不同的功能,那么每个人的测试结果合并到同一个快照文件中就会组合成该产品一个完整的覆盖测试结果。
本文到此为止。如果你项了解更多有关Code Coverage操作和功能的信息,请查看Optimizeit Code Coverage用户手册。
翻译:
[email protected] 2004-11-8
如果您对本文或白盒测试感兴趣,请登录http://groups.yahoo.com/group/WhiteBoxTestCN/,加入会员,即可下载到本文完整的内容(格式为呆图片的word文档),在这里还有其他一些白盒测试工具的介绍与相关讨论。