﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Dorian's Blog-随笔分类-Java Article</title><link>http://www.blogjava.net/dorian/category/4220.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 03 Mar 2007 09:14:51 GMT</lastBuildDate><pubDate>Sat, 03 Mar 2007 09:14:51 GMT</pubDate><ttl>60</ttl><item><title>EMMA－OpenSource 的 Java code coverage 工具</title><link>http://www.blogjava.net/dorian/archive/2005/10/27/17066.html</link><dc:creator>Dorian's Blog</dc:creator><author>Dorian's Blog</author><pubDate>Thu, 27 Oct 2005 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/dorian/archive/2005/10/27/17066.html</guid><wfw:comment>http://www.blogjava.net/dorian/comments/17066.html</wfw:comment><comments>http://www.blogjava.net/dorian/archive/2005/10/27/17066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dorian/comments/commentRss/17066.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dorian/services/trackbacks/17066.html</trackback:ping><description><![CDATA[很久以前听到过code coverage这个词。但总是在我脑海中一闪而过，Ignore掉的。<BR>最近看到有一个opensource 的 EMMA，所以就Down下来玩玩。<BR>看了它的Quick Start发现可以配合JUnit之类的测试工具执行GUI程序。<BR>把它自带的程序试了一下，它会产生记录显示刚才的操作执行了多少多少部分的代码。<BR>觉得蛮好玩的，就自己试了一下： 
<P>环境： EMMA v2.0，build4127<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OS Windows 2003 server<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDK v1.4.2<BR></P>
<DIV><SPAN style="COLOR: #008080"><BR></SPAN></DIV>
<P>EMMA提供两种使用模式，一个是指令模式（command mode）另外一个是使用Ant。</P>
<P>将下载下来的JAR（emma.jar&amp;emma_ant.jar）复制到你classpath所在的JRE目录<BR>&nbsp;ex.E:\Program\J2SDK\jre\lib\ext<BR>然后在命令行下输入Java emmarun，会看到它的使用方法和如何配参数。如果没看到，那<BR>说明没有把刚才两个Jar包放在classpath中。</P>
<P>随后写一个Hello world程序<BR><BR></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">1</SPAN><IMG id=Codehighlighter1_24_222_Open_Image onclick="this.style.display='none'; Codehighlighter1_24_222_Open_Text.style.display='none'; Codehighlighter1_24_222_Closed_Image.style.display='inline'; Codehighlighter1_24_222_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_24_222_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_24_222_Closed_Text.style.display='none'; Codehighlighter1_24_222_Open_Image.style.display='inline'; Codehighlighter1_24_222_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;HelloWorld&nbsp;</SPAN><SPAN id=Codehighlighter1_24_222_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_24_222_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">2</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_50_99_Open_Image onclick="this.style.display='none'; Codehighlighter1_50_99_Open_Text.style.display='none'; Codehighlighter1_50_99_Closed_Image.style.display='inline'; Codehighlighter1_50_99_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_50_99_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_50_99_Closed_Text.style.display='none'; Codehighlighter1_50_99_Open_Image.style.display='inline'; Codehighlighter1_50_99_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;HelloWorld()&nbsp;</SPAN><SPAN id=Codehighlighter1_50_99_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_50_99_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">3</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Constructor</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">5</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_144_220_Open_Image onclick="this.style.display='none'; Codehighlighter1_144_220_Open_Text.style.display='none'; Codehighlighter1_144_220_Closed_Image.style.display='inline'; Codehighlighter1_144_220_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_144_220_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_144_220_Closed_Text.style.display='none'; Codehighlighter1_144_220_Open_Image.style.display='inline'; Codehighlighter1_144_220_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</SPAN><SPAN id=Codehighlighter1_144_220_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_144_220_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;HelloWorld();<BR></SPAN><SPAN style="COLOR: #008080">7</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello&nbsp;World!</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">8</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">9</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV>
<P>编译HelloWorld.java<BR>&nbsp;javac -d classes -g HelloWorld.java<BR>运行HelloWorld<BR>&nbsp;java -cp classes HelloWorld<BR>现在加入EMMA<BR>&nbsp;java emmarun -cp classes HelloWorld<BR>可看到类似如下输出：<BR>Constructor<BR>Hello World!<BR>EMMA: writing [txt] report to [F:\我的文档\EMMA\coverage.txt] ...<BR>你可以看一下执行后在你目录中的coverage。txt文件<BR>内容类似如下：<BR>[EMMA v2.0.4217 report, generated Thu Oct 28 09:09:45 CST 2004]<BR>-------------------------------------------------------------------------------<BR>OVERALL COVERAGE SUMMARY:</P>
<P>[class, %]&nbsp;[method, %]&nbsp;[block, %]&nbsp;[line, %]&nbsp;[name]<BR>100% (1/1)&nbsp;100% (2/2)&nbsp;100% (14/14)&nbsp;100% (6/6)&nbsp;all classes</P>
<P>OVERALL STATS SUMMARY:</P>
<P>total packages:&nbsp;1<BR>total classes:&nbsp;1<BR>total methods:&nbsp;2<BR>total executable files:&nbsp;1<BR>total executable lines:&nbsp;6</P>
<P>COVERAGE BREAKDOWN BY PACKAGE:</P>
<P>[class, %]&nbsp;[method, %]&nbsp;[block, %]&nbsp;[line, %]&nbsp;[name]<BR>100% (1/1)&nbsp;100% (2/2)&nbsp;100% (14/14)&nbsp;100% (6/6)&nbsp;default package<BR>-------------------------------------------------------------------------------</P>
<P>这些数据蛮难看懂的，不过EMMA提供三种输出格式 txt,html,xml</P>
<P>接下来看看可以加入原代码的一份html报表。</P>
<P>这样来执行：<BR>&nbsp;java emmarun -r html -sp . -cp classes HelloWorld<BR>&nbsp;//-sp 代表源文件的所在地，我的源文件在当前目录，故用 "."<BR>执行后你就可以看到EMMA生成了一个叫coverage的目录。在里面的许多html就是带源文件的一份报表。如下所示：</P>
<P><A href="/images/blogjava_net/dorian/4207/o_o_1.jpg" target=_blank><IMG height=87 alt=t_o_1.jpg src="http://www.blogjava.net/images/blogjava_net/dorian/4207/t_o_1.jpg" width=120 border=0></A></P>
<P><A href="/images/blogjava_net/dorian/4207/o_o_2.jpg" target=_blank><IMG height=91 alt=t_o_2.jpg src="http://www.blogjava.net/images/blogjava_net/dorian/4207/t_o_2.jpg" width=120 border=0></A></P>
<P><BR>这份东西还是蛮详细的，可以看到那些东西或者说那些状况没有考虑到的。<BR>至于ant的实现以后要用时在说吧！毕竟这东西好玩归好玩，暂时还用不上。^_^</P><img src ="http://www.blogjava.net/dorian/aggbug/17066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dorian/" target="_blank">Dorian's Blog</a> 2005-10-27 16:32 <a href="http://www.blogjava.net/dorian/archive/2005/10/27/17066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>