单元测试工具Jprobe简明使用手册软件产品部马金钱一、概述JprobeSuite是Sitraka公司研制的一组针对Java的单元测试工具,帮助解决Java代码的缺陷以实现Java的最大效能,共包括MemoryDebugger、Profiler、Threadalyzer、Coverage等四个独立工具,其中Threadalyzer和Coverage被称作程序校正(Correctness)工具,Threadalyzer通过找出程序中的死锁和空值以检验线程的正确性,Coverage用来报告程序的测试覆盖率和未测试覆盖,MemoryDebugger和Profiler被称作程序性能工具,MemoryDebugger帮助发现因不足参数管理和对象的过度分配而引起的内存泄漏,Profiler通过统计程序各部分的运行时间帮助找出程序的性能瓶颈。Jprobe的每个工具都可支持两种类型的应用:独立应用(StandaloneApplication)和基于应用服务器的应用(UsingApplicationServer)。因四个工具的参数配置等步骤相同,以下首先就以Coverage为重点详解介绍Jprobe的安装、参数配置、建立新应用等过程,然后再分别以图示介绍各工具的不同运行结果。二、主要功能1、分析本地运行的J2EE应用和J2SE应用;2、分析远程机器上运行的J2EE应用和J2SE应用;3、通过使用过滤器聚焦你的代码;4、监控被收集的数据(JprobeCoverage除外);5、保存数据到快照文件;6、以高级图形用户界面回顾快照文件;7、在源代码中标识问题的方法或行;8、把快照文件同基线进行比较(只针对JprobeProfiler和JprobeMemoryDebugger);9、通过触发能自动进行分析(JprobeThreadalyzer除外);10、通过创建和运行自动化脚本能规则地校验代码;三、安装可以进行JprobeSuite的安装,也可以单独安装某一单一工具,安装过程同一般软件的安装过程类似,只是在安装最后的注册过程较为繁琐,它实行严格的许可证管理,注册前,须向Sitraka公司发送你本机的一些认证信息,Sitraka公司再通过email寄给你许可证文件进行注册。登陆网站,可下载注册一个10天的试用版。具体的安装和注册场景不在此详述,安装完成后,在开始菜单中如图1所示:图1四、应用前提Jprobe只是用于做单元测试,而不能进行程序的编译和调试,因此,使用Jprobe做单个程序应用或基于服务器应用测试之前,一定要保证程序已进行编译并能成功运行。五、独立应用(StandaloneApplication)使用以下以一个小Java程序myquery.Java为例,演示如何用JprobeCoverage测试独立应用程序中方法和代码的覆盖率,该程序功能是向数据库表中查询,源代码如下:importjava.sql.*;importjavax.sql.DataSource;importjavax.naming.*;importjava.lang.*;importjava.util.*;publicclassmyquery{publicstaticvoidquerydata()throwsException{Connectionconn=null;Statementstmt=null;ResultSetrs=null;Stringuri=jdbc:hsqldb:hsql://localhost;inti=0;try{try{Class.forName(org.hsqldb.jdbcDriver).newInstance();}catch(java.lang.ClassNotFoundExceptione){System.err.print(ClassNotFoundException:);}try{conn=DriverManager.getConnection(uri,sa,);}catch(SQLExceptione){System.out.println(e.getMessage().toString());}stmt=conn.createStatement();Stringsql=select*fromwf_taskwherestate=1;try{rs=stmt.executeQuery(sql);}catch(SQLExceptione){System.out.println(e.getMessage().toString());}while(rs.next()){i++;System.out.println(rs.getString(1)++rs.getString(task_id));}System.out.println(total+i+record!);System.out.println(QuerySucessful!!);}catch(Exceptione){System.out.println(e.getMessage().toString());}finally{rs.close();stmt.close();conn.close();}}publicstaticvoidmain(Stringarg[])throwsException{myqueryhello=newmyquery();hello.querydata();}}1、启动Coverage点击图1中的JprobeCoverage,运行后出现图2图22、设置运行参数(Preferences)点击Edit中的Preferences,进入图3图3根据个人喜好及需要可点击每个页签进行设置。3、建立新应用设置(Settings)点击Session中的NewSettings…图4在ProgramSettings组中有两个选择StandaloneApplication和UsingApplicationServer,分别用于不使用应用服务器的独立应用和使用应用服务器的应用,此处选择StandaloneApplication,并选择编译后的Class文件,此时若程序中所需的jar包没有被包含在系统的classpath中,还必须在这儿点击“More…”按钮,添加所需的jar包到%classpath%前,之后点击Run可直接运行或点击OK保存。4、运行应用设置可在建立新应用设置后点击RUN直接运行,也可在工具栏中点击“运行”快捷按钮运行图5运行后会产生一个快照文件(snapshot),所有结果信息都保存在这个快照文件中,按“保存”快捷按钮可进行保存,同时还出现两个新的结果窗口,分别为JprobeExecutionConsole和CoverageBrowser窗口,通过Console窗口可看到程序执行结果,通过Browser窗口可得知程序执行后的方法和代码的覆盖率,分别如图6和图7示:图6图7通过图7,我们可清晰的看到整体和各个方法的覆盖率情况,其中包含有每个方法的代码总行数,执行的代码总行数及所占百分比等信息,当然我们也可以通过参数设置,显示出未执行代码的相关信息。假如此时我们想查看程序中到底是哪些代码被执行了,哪些代码未被执行,只需双击方法名即可,如图8示:图8其中被执行的代码标注为蓝色,并在语句前置上被执行的次数,未被执行的代码标注为红色,这样开发人员便能一目了然。5、查看方法列表(MethodList)在图7窗口中,点击右键,出现图9的窗口图9点击OpenInMethodList图10图中简明地列出了各个方法的覆盖率情况,当然,也可以通过更改Display中的选项设置,产生不同的显示效果。6、产生结果报告图11点击图11中的GenerateReport…,出现生成报告窗口图12生成的报告可以是HTML、TEXT或XML格式,报告的内容可以很简单,也可以很详细,输入要产生的报告文件名并进行选项设置后(此处选择HTML方式),按“GenerateFile”按钮后,即生成了一个HTML文件,如图13示:图137、对多个快照文件合并(Merge)在单元测试中,我们可能设计了好几个测试例,而每个测试例执行的代码路径不同,结果及覆盖率也会不同,Coverage中的合并功能可方便地将多个快照文件进行合并,自动剔除重复部分,产生一个含有总覆盖率的窗口。步骤如下:首先在下图窗口中点击Merge…或直接按工具栏中的快捷按钮“Merge”图14图15出现合并快照文件(MergeSnapshots)窗口图16输入合并后的快照文件名,并选择要合并的快照文件后,点击OK图17上图中显示了合并后的覆盖率情况,因本例中的两个快照文件相同,所以合并后的覆盖率未有变化。六、基于应用服务器应用(UsingApplicationServer)使用Jprobe支持多种应用服务器的应用,其中包括常见的ApacheTomcat,BEAWebLogic,IBMWebSphere等,并具体细化到每个版本。在这里我们以BEAWebLogic7.0为例,来具体演示如何做EJB的代码覆盖率测试。另外为方便、实用起见,我们假定服务器和客户机是同一台机器。仍借鉴上面的小程序,只是这次把他改造成EJB应用,生成一个Test1.jar部署到Wlebogic上,其中Test1.jar中包含有三个java程序,分别为Query1.java,Query1Home.java,Query1Bean.jar。另外我又单独做了一个客户端程序(可理解为测试驱动程序)Query1TestClient1.Java,用以调用EJB。通过借用JprobeCoverage,我们可以方便地测试出Query1Bean.Java中的代码和方法的执行覆盖率。1、启动Coverage同“四、独立应用(StandaloneApplication)使用”中的启动,此处略;2、设置运行参数(Preferences)同“四、独立应用(StandaloneApplication)使用”中的设置运行参数,此处略;3、应用服务器集成(ApplicationServerIntegration)点击ToolsApplicationServerIntegration…图18先在“SelectanApplicationServer”中选择应用服务器类型,此处选择BEAWebLogic7.0,按Create按钮,在右边各栏位中依次输入ID号,应用服务器server所在目录,启动脚本,java.exe的位置,注意在JavaOptions中默认是“-server-Xmx200m-Xmx200m”,应去除-server,以免无法启动myserver,输入完毕后,按Save保存,再按Close关闭。4、建立新应用设置(Settings)点击SessionNewSettings…图19ProgramSettings组中选择UsingApplicationServer,此处ApplicationServer中选择BEAWebLogic7.0,IntegrationID选择刚建立的BEA1。在DataCollectionFilters中一定要选择被测试的EJB包文件。在RuntimesSettings组中,“ViewRuntimeData:”后先选择Remotely,后输入格式为workstation:port的字符串,注意workstation为客户机的主机名,后面的端口号是客户机和服务器之间的约定端口,一定不要与应用服务器JNDI中用到的端口号(如7001)相同,否则启动应用服务器时会发生冲突。在快照文件目录(SnapshotDirectory:)后应选择一个存放快照文件的路径,之后,按OK保存。5、更改Jprobe的classpath我们知道,在启动应用服务器,部属EJB时都要借助classpath,虽然我们在系统环境变量中设置了classpath,但由于Jprobe并未使用系统的classpath,而是使用自己的classpath,难免会有不一致的地方,比如