﻿<?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-emu in blogjava-文章分类-测试技术</title><link>http://www.blogjava.net/emu/category/1380.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 11:25:05 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 11:25:05 GMT</pubDate><ttl>60</ttl><item><title>写了一个简单的host管理器</title><link>http://www.blogjava.net/emu/articles/56873.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Wed, 05 Jul 2006 15:57:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/56873.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/56873.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/56873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/56873.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/56873.html</trackback:ping><description><![CDATA[点<a href="/Files/emu/HostManager.zip">这里</a>下载。<img src ="http://www.blogjava.net/emu/aggbug/56873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2006-07-05 23:57 <a href="http://www.blogjava.net/emu/articles/56873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StrutsTestCase 试用手记  </title><link>http://www.blogjava.net/emu/articles/4775.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Wed, 18 May 2005 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/4775.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/4775.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/4775.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/4775.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/4775.html</trackback:ping><description><![CDATA[<TABLE style="BORDER-COLLAPSE: collapse" width="100%" border=0>
<TBODY>
<TR>
<TD class=BlogArticleTitle></TD></TR>
<TR>
<TD class=BlogArticleContent>
<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 width="100%" border=0>
<TBODY>
<TR>
<TD style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-word"><PRE><P><DIV class=post><DIV class=postTitle align=center><A href="http://blog.csdn.net/emu/archive/2005/01/22/263856.aspx"><U><FONT color=#800080>原文连接</FONT></U></A></DIV><DIV class=postTitle align=center>&nbsp;</DIV><DIV class=postTitle>junit不能测struts的action，httpunit也只能测servlet。用struts作项目的时候无法方便的对action层做单元测试一直是我的心头大恨。现在好了，我们有了StrutsTestCase。按照网上的介绍，StrutsTestCase用起来应该是非常简单的，只要下了jar包回来引用到工程里面就可以了。实际上可能也差不多－－如果你运气不象我这么臭的话。</DIV><DIV class=postText><P><BR>在sourceforge上随便挑其中一个镜象的下载地址：<BR><A href="http://aleron.dl.sourceforge.net/sourceforge/strutstestcase/strutstest213-1.2_2.4.zip"><U><FONT color=#0000ff>http://aleron.dl.sourceforge.net/sourceforge/strutstestcase/strutstest213-1.2_2.4.zip</FONT></U></A></P><P>flashget回来，放到jbuilder的userhome里面，找一个struts action创建test case，创建的时候吧test case的基类改为 MockStrutsTestCase，测试的方法一个都不用选（因为我们是要针对action的具体每一个逻辑分支测试而不是具体的某一个方法）。创建成功后添加一个测试：</P><P>&nbsp; public void testSuccessfulRefresh()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; setRequestPathInfo("/RefreshSystemData");<BR>&nbsp;&nbsp;&nbsp; actionPerform();<BR>&nbsp;&nbsp;&nbsp; verifyForward("success");<BR>&nbsp; }</P><P>嘿嘿，我精心挑了一个没有参数的action来实验。</P><P>一切看起来很顺利。run test，噩梦开始了：</P><P>java.lang.NullPointerException<BR>&nbsp;at servletunit.struts.MockStrutsTestCase.getActionServlet(MockStrutsTestCase.java:331)<BR>&nbsp;at servletunit.struts.MockStrutsTestCase.tearDown(MockStrutsTestCase.java:130)<BR>&nbsp;at hospital.tongren.oa.system.action.TestRefreshSystemDataAction.tearDown(TestRefreshSystemDataAction.java:34)<BR>...(Click for full stack trace)...</P><P>还好我没有开音箱，不然又是一大炮轰出来。</P><P>看来要调试了，先去同一个地方下了StrutsTestCase原码回来<BR>&nbsp;<A href="http://aleron.dl.sourceforge.net/sourceforge/strutstestcase/strutstest-213-src.zip"><U><FONT color=#0000ff>http://aleron.dl.sourceforge.net/sourceforge/strutstestcase/strutstest-213-src.zip</FONT></U></A></P><P>加进userhome里面的source。debug进去，跟到org.apache.struts.action.ActionServlet里面，出错的地方是：</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream input =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getServletContext().getResourceAsStream("/WEB-INF/web.xml");</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digester.parse(input);</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<BR>....</P><P>input 为空指针。不知道为什么ServletContextSimulator在模拟ServletContext的时候没能够正确的找到webmodule的位置。上网搜了好一会儿文档，在 <A href="http://strutstestcase.sourceforge.net/api/servletunit/struts/MockStrutsTestCase.html"><U><FONT color=#0000ff>http://strutstestcase.sourceforge.net/api/servletunit/struts/MockStrutsTestCase.html</FONT></U></A> 中发现了这样一段：</P><P>NOTE: By default, the Struts ActionServlet will look for the file WEB-INF/struts-config.xml, so you must place the directory that contains WEB-INF in your CLASSPATH. ...</P><P>先照它说的试试把webmodule路径放进classpath中，没有用。<BR>往下看，发现了这个好东东：setContextDirectory。在startup中加一句：</P><P>this.setContextDirectory(new File("E:\\projectPath\\webModulePath\\"));</P><P>终于把那个空指针给过了。但是报一个新的异常：</P><P>junit.framework.AssertionFailedError: received error 400 : Invalid path /RefreshSystemData was requested</P><P>&nbsp;at servletunit.HttpServletResponseSimulator.sendError(HttpServletResponseSimulator.java:463)</P><P>&nbsp;at org.apache.struts.action.RequestProcessor.processMapping(RequestProcessor.java:684)</P><P>&nbsp;at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:242)</P><P>&nbsp;at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)</P><P>&nbsp;at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)</P><P>&nbsp;at servletunit.struts.MockStrutsTestCase.actionPerform(MockStrutsTestCase.java:394)</P><P>&nbsp;at hospital.tongren.oa.system.action.TestRefreshSystemDataAction.testSuccessfulRefresh(TestRefreshSystemDataAction.java:51)</P><P>...(Click for full stack trace)...</P><P><BR>找不到strutsconfig里面配置的path。strutsconfig是在web.xml里面配置的，应该还是web.xml没找到造成的，那么就指定strutsconfig文件的位置咯：<BR>&nbsp;&nbsp;&nbsp; setConfigFile("E:\\......\\struts-config.xml");</P><P>终于可以运行起来了。</P><P>随后发现，如果&nbsp; setServletConfigFile("E:\\....\\WEB-INF\\web.xml");的话MockStrutsTestCase也能够根据web.xml中的配置找到strutsconfig文件。</P><P>最后把上面用到的绝对地址E:\\...全部改为相对地址：<BR>&nbsp;&nbsp;&nbsp; setContextDirectory(new File("modulePath\\"));<BR>&nbsp;&nbsp;&nbsp; setServletConfigFile("modulePath\\WEB-INF\\web.xml");<BR>&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; this.setConfigFile("modulePath\\WEB-INF\\config\\system\\struts-config.xml"); </P><P>血吐完了，继续郁闷，为什么别人都不用配置的这么麻烦呢？到底我做错了什么，还是jbuilder的错？</P><P>CactusStrutsTestCase也没配起，好像要加个什么包吧，再看看先。</P><BR>[<A href="javascript:StorePage()"><U><FONT color=#0000ff>点击此处收藏本文</FONT></U></A>] </DIV><DIV class=postFoot>发表于 2005年01月22日 4:04 PM </DIV></DIV><LINK href="http://blog.csdn.net/emu/Services/Pingback.aspx" rel=pingback><!--<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><rdf:Descriptionrdf:about="http://blog.csdn.net/emu/archive/2005/01/22/263856.aspx"dc:identifier="http://blog.csdn.net/emu/archive/2005/01/22/263856.aspx"dc:title="StrutsTestCase 试用手记"trackback:ping="http://blog.csdn.net/emu/services/trackbacks/263856.aspx" /></rdf:RDF>--><BR><DIV id=comments><H3></H3><DIV class=post><DIV class=postTitle><A href="http://blog.csdn.net/emu/" target=_blank><U><FONT color=#800080>emu</FONT></U></A>&nbsp;发表于<SPAN>2005-01-22 8:00 PM</SPAN>&nbsp;&nbsp;</DIV><DIV class=postText>http://jakarta.apache.org/cactus/getting_started.html 中有详细的说明。感觉确实复杂了一点。现在进展是： <BR><BR>org.apache.cactus.util.ChainedRuntimeException: Failed to get the test results at [http://localhost:8083/TongRenOA/ServletRedirector] <BR><BR>at org.apache.cactus.internal.client.connector.http.DefaultHttpClient.doTest_aroundBody0(DefaultHttpClient.java:92) <BR><BR>at org.apache.cactus.internal.client.connector.http.DefaultHttpClient.doTest_aroundBody1$advice(DefaultHttpClient.java:206) <BR><BR>at org.apache.cactus.internal.client.connector.http.DefaultHttpClient.doTest(DefaultHttpClient.java) <BR><BR>at org.apache.cactus.internal.client.connector.http.HttpProtocolHandler.runWebTest(HttpProtocolHandler.java:159) <BR><BR>at org.apache.cactus.internal.client.connector.http.HttpProtocolHandler.runTest_aroundBody0(HttpProtocolHandler.java:80) <BR><BR>at org.apache.cactus.internal.client.connector.http.HttpProtocolHandler.runTest_aroundBody1$advice(HttpProtocolHandler.java:206) <BR><BR>at org.apache.cactus.internal.client.connector.http.HttpProtocolHandler.runTest(HttpProtocolHandler.java) <BR><BR>at org.apache.cactus.internal.client.ClientTestCaseCaller.runTest(ClientTestCaseCaller.java:144) <BR><BR>at org.apache.cactus.internal.AbstractCactusTestCase.runBareClient(AbstractCactusTestCase.java:215) <BR><BR>at org.apache.cactus.internal.AbstractCactusTestCase.runBare(AbstractCactusTestCase.java:133) <BR><BR>...(Click for full stack trace)... <BR><BR>下班先。</DIV></DIV></DIV><PRE><P></P></PRE><P></P></PRE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/emu/aggbug/4775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2005-05-18 16:19 <a href="http://www.blogjava.net/emu/articles/4775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Bugzilla 2.19.2 试用手记 </title><link>http://www.blogjava.net/emu/articles/4757.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Wed, 18 May 2005 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/4757.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/4757.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/4757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/4757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/4757.html</trackback:ping><description><![CDATA[<TABLE style="BORDER-COLLAPSE: collapse" width="95%" border=0>
<TBODY>
<TR>
<TD class=BlogArticleTitle><SPAN id=BlogBody_BlogArticleView_lbTitle>Bugzilla 2.19.2 试用手记 </SPAN></TD></TR>
<TR>
<TD class=BlogArticleContent>
<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 width="100%" border=0>
<TBODY>
<TR>
<TD style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-word"><SPAN id=BlogBody_BlogArticleView_lbContent><PRE><P><DIV class=postTitle><A href="http://blog.csdn.net/emu/archive/2005/03/29/333430.aspx"><U><FONT color=#800080>原文链接</FONT></U></A> </DIV><DIV class=postText><P align=center>Bugzilla 2.19.2 试用手记</P><P>bugzilla 2.19试用版已经发布很久了。但是我们还是继续一直在使用2.18，一是不知道2.19版是否稳定，二是2.18版的已经有wfifi的汉化模板可以用。但是现在公司开始在评估是否购买jira了。于是粗略比较了一下jira和bugzilla。</P><P>初看了一下jira，和bugzilla各有特色，比较突出的感觉到的有：<BR>1 jira号称是个IMS（issue management system），也就是说，它不但可以管理bug，还可以管理其他种类的issue比如task，而且自己可以创建新类型的issue。相比之下bugzilla却是个DMS（defect management system），它的眼中一切都是bug。虽然最终可以实现的功能没有大的差别，但是却从概念上让人感觉到他们之间的差异。<BR>2 jira支持subscribe，也就是订阅指定的bug信息，bugzilla到2.18版还没有发现这样的功能。<BR>3 bugzilla支持生成chart，jira似乎没有这个功能。<BR>4 bugzilla现在已经有汉化包，jira支持的大概8种左右的语言里面，没有发现中文。不过作为一个外企，我们不需要一个界面汉化的DMS<BR>5 jira的企业版据说还可以自己定义issue的处理流程，不过好像要改源码呵呵。<BR>6 jira的权限系统做得比bugzilla细致。<BR>7 jira要花money</P><P align=left>为了更加公平的比较bugzilla和jira，上网吓了最新的bugzilla2.19.2版，比其2.19.1版没有多实现多少特性，但是据说改了些bug。与2.18版比起来，最突出的是增加了一个类似jira的subscribe的功能，叫Whining。此外提供了用户名下拉框，以后可以不用敲assignee了（其实我早就自己实现了相同的功能，我的QA其实没怎么敲过assignee），生成报表使用的条件可以反转。还有写环境变量和报表参数之类的特性看起来和我关系不大。不过第一个note没看明白：</P><P align=center><BR><STRONG>A higher level of categorization (departments, locations, etc...) is now available for bug reports</STRONG></P><STRONG></STRONG><P align=left><BR>这应该是说做report的时候提供了更高级的分类的意思吧？但是与之关联的bug里面却说：</P><P align=left><BR><STRONG>It would be nice if one could group products into categories(departments, groups, organization, etc.)...</STRONG></P><P align=left><BR>这应该是说创建product的时候可以分类的意思。</P><P>因为原来服务器上已经安装过bugzilla2.18，安装2.19的时候容易的多了。在apache的发布目录下新建了一个newbugzilla目录，把下载的包解压到里面去。然后进而命令行状态下，perl checksetup.pl，验证了一下使用的包全部争取安装，并且生成了localconfig文件。打开localconfig，把$db_pass填上，重新perl checksetup.pl。安装脚本开始升级数据库（新版本的bugzilla需要用到一些新的表或者在旧表里面加些新的字段），顺利通过。</P><P>打开浏览器访问newbugzilla，除了没有中文界面之外一切如常，进去看assignee还是文本框，Whining功能也找不着，奇怪了。<BR>进入目录里面搜相关的文件，在根目录下发现了whine.pl。既然没有链接，就直接敲地址访问它试试？从ie输入它的地址，出来一个错误页面：no permission。<BR>原来新的功能要关联到新的group才有权使用。进用户关联把所有的角色都先加给自己先。回到主页刷新一下，果然，处来了一个whining链接，点开一看，爽！</P><P>用户名下拉框的问题，在2.19.1版的release notes上面关联到一个bug。过去看这个bug的说明和附件，说是要加一段代码在\template\en\default\global下面，叫userselect.html.tmpl。在本地一找，这个文件已经有了，可是为什么用户没有变成下拉列表呢？打开userselect.html.tmpl一看：<BR><STRONG>[% IF Param("usemenuforusers") %]</STRONG><BR>......<BR>原来要读到<STRONG>usemenuforusers</STRONG>这个参数为真的时候才显示为下拉框的。进parameter里面，找到usemenuforusers这一项，改为true，回到创建bug页面，用户框果然变成下拉框了。</P><P>再找找<STRONG>A higher level of categorization</STRONG> 在哪里？找了半天没找到categories之类的东西，不过在parameter里面发现了一个新东西：<STRONG>useclassification</STRONG>。把这个参数打开（on）之后，菜单多了一项 Classifications ，大概就是指的这个东西了。在Classifications 中可以建立产品分类，然后再在产品分类中建立产品，或者把旧的产品关联到创建的分类中（没有关联的产品全部属于Unclassified类）。这样在创建bug的时候就要先选分类，再选产品，再选组件。对产品线比较复杂的单位，这样的功能还是有点讨好的。<BR></P><BR></DIV><PRE><P></P></PRE><P></P></PRE></SPAN></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/emu/aggbug/4757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2005-05-18 14:18 <a href="http://www.blogjava.net/emu/articles/4757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在apache下发布了bugzilla</title><link>http://www.blogjava.net/emu/articles/4756.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Wed, 18 May 2005 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/4756.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/4756.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/4756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/4756.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/4756.html</trackback:ping><description><![CDATA[<TABLE style="BORDER-COLLAPSE: collapse" width="95%" border=0>
<TBODY>
<TR>
<TD class=BlogArticleTitle><SPAN id=BlogBody_BlogArticleView_lbTitle></SPAN></TD></TR>
<TR>
<TD class=BlogArticleContent>
<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 width="100%" border=0>
<TBODY>
<TR>
<TD style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-word"><SPAN id=BlogBody_BlogArticleView_lbContent><PRE><P><DIV class=post><DIV class=postTitle><A href="http://blog.csdn.net/emu/archive/2005/03/15/320326.aspx"><U><FONT color=#800080>在apache下发布了bugzilla</FONT></U></A> </DIV><DIV class=postText><P>终于要到一台新的项目服务器，把旧的东西一一挪到新服务器上来。在挪bugzilla的时候遇到一些问题。原来的服务器上面装的是2.18rc2版，使用的汉化模版却是2.18rc3版的，在老服务器上工作良好，但是在新服务器上中文版的模版无论如何都无法在IIS上发布出来，始终报告一个访问拒绝错误。去下了2.18rc3版的bugzilla过来，仍是相同的问题。本来就看着IIS很不爽了，试了几次不成功，换apache试试，结果和IIS抢端口了，干脆就把IIS给卸了。</P><P>跟着<A href="http://www.bugzilla.org/docs/win32install.html"><U><FONT color=#0000ff>http://www.bugzilla.org/docs/win32install.html</FONT></U></A>&nbsp;一步一步来。做到最后发布的时候没有看到发布成功的首页，却看到了一个错误页面。进Program Files\Apache Group\Apache2\logs下面看error.log：</P><P>[Tue Mar 15 18:55:04 2005] [notice] Child 4488: Starting 250 worker threads.<BR>[Tue Mar 15 18:55:10 2005] [error] [client 127.0.0.1] (OS 3)系统找不到指定的路径。&nbsp; : couldn't create child process: 720003: index.cgi<BR>[Tue Mar 15 18:55:10 2005] [error] [client 127.0.0.1] (OS 3)系统找不到指定的路径。&nbsp; : couldn't spawn child process: C:/bugzilla-2.18/index.cgi<BR>[Tue Mar 15 18:59:05 2005] [notice] Parent: Received shutdown signal -- Shutting down the server.<BR>[Tue Mar 15 18:59:05 2005] [notice] Child 4488: Exit event signaled. Child process is ending.<BR>[Tue Mar 15 18:59:06 2005] [notice] Child 4488: Released the start mutex<BR></P><P>couldn't create child process —— 原来是无法创建子过程。看来是没有找到perl.exe。在这个问题上，安装指南说：</P><P>In order for <B>ScriptInterpreterSource Registry-Strict</B> to work, you also need to add an entry to the Registry so Apache will use Perl to execute .cgi files. </P><P>Create a key <B>HKEY_CLASSES_ROOT\.cgi\Shell\ExecCGI\Command</B> with the default value of the full path of perl.exe with a -T parameter. For example <B>C:\Perl\bin\perl.exe -T</B> </P><P>Create a key <STRONG>HKEY_CLASSES_ROOT\.cgi\Shell\ExecCGI\Command</STRONG>嘛，所以我就创建了HKEY_CLASSES_ROOT\.cgi\Shell\ExecCGI项然后在下面加了一个Command的key。不过既然出错了，不妨试试另一种理解，创建一个HKEY_CLASSES_ROOT\.cgi\Shell\ExecCGI\Command项，再在下面的默认key上给了一个C:\Perl\bin\perl.exe -T 。重起apache。果然就ok了。应该这段文档的描述是有问题的。</P><P>最后上<A href="http://www.glob.com.au/sendmail/"><U><FONT color=#0000ff>http://www.glob.com.au/sendmail/</FONT></U></A>&nbsp;下载了sendmail，解压到C:\usr\lib下，在sendmail.ini里面修改smtp_server、default_domain、auth_username、auth_password（后面两项默认的被用分号注释掉，如果使用的smtp需要身份验证的话就去掉分号并填上正确的用户名密码），把服务器防火墙的25端口打开。试试改个bug，邮件就发出去了，大功告成。</P><P></P><BR>[<A href="javascript:StorePage()"><U><FONT color=#0000ff>点击此处收藏本文</FONT></U></A>] </DIV><DIV class=postFoot>发表于 2005年03月15日 7:44 PM </DIV></DIV><LINK href="http://blog.csdn.net/emu/Services/Pingback.aspx" rel=pingback><!--<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><rdf:Descriptionrdf:about="http://blog.csdn.net/emu/archive/2005/03/15/320326.aspx"dc:identifier="http://blog.csdn.net/emu/archive/2005/03/15/320326.aspx"dc:title="在apache下发布了bugzilla"trackback:ping="http://blog.csdn.net/emu/services/trackbacks/320326.aspx" /></rdf:RDF>--><BR><DIV id=comments><H3></H3><DIV class=post><DIV class=postTitle><A href="http://blog.csdn.net/emu" target=_blank><U><FONT color=#800080>emu</FONT></U></A>&nbsp;发表于<SPAN>2005-04-06 5:18 PM</SPAN>&nbsp;&nbsp;</DIV><DIV class=postText>今天在http://landfill.bugzilla.org/ppm 上发现了二月和三月各有一个文件更新： <BR><BR>MIME-tools.ppd 03-Feb-2005 20:36 532 <BR>MailTools.ppd 31-Mar-2005 21:28 400 <BR><BR>应该是新版本的bugzilla正准备使用内置的邮件支持了吧。不过2.19的checksetup.pl还没有提示安装这两个包，不知如何使用。 <BR><BR>此外，搞定了bugzilla运行在mysql 的 4.1以上版本时的身份验证问题。 <BR>在http://www.bugzilla.org/docs/win32install.html 上提及以下事实： <BR>I've experienced a few issues with MySQL 4.1.x, so i recommend you install 4.0.x. When I have some time I'll investigate the issues (relating to database creation and authentication). <BR><BR>于是跟着提示找到了 http://dev.mysql.com/doc/mysql/en/old-client.html <BR>这里有相信的解释和两个解决方法。一是： <BR>mysql&gt; SET PASSWORD FOR <BR>-&gt; 'some_user'@'some_host' = OLD_PASSWORD('newpwd'); <BR><BR>我试过了，不知为何更新不成功。 <BR>二是： <BR>mysql&gt; UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd') <BR>-&gt; WHERE Host = 'some_host' AND User = 'some_user'; <BR>mysql&gt; FLUSH PRIVILEGES; <BR>这样checksetup.pl就能够正确的连接到mysql了。 <BR></DIV></DIV></DIV><PRE><P></P></PRE><P></P></PRE></SPAN></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/emu/aggbug/4756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2005-05-18 14:17 <a href="http://www.blogjava.net/emu/articles/4756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用junitperf做并发测试带来的问题  </title><link>http://www.blogjava.net/emu/articles/4755.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Wed, 18 May 2005 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/4755.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/4755.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/4755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/4755.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/4755.html</trackback:ping><description><![CDATA[<TABLE style="BORDER-COLLAPSE: collapse" width="95%" border=0>
<TBODY>
<TR>
<TD class=BlogArticleTitle><SPAN id=BlogBody_BlogArticleView_lbTitle></SPAN></TD></TR>
<TR>
<TD class=BlogArticleContent>
<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 width="100%" border=0>
<TBODY>
<TR>
<TD style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-word"><SPAN id=BlogBody_BlogArticleView_lbContent><PRE><PRE><DIV class=postTitle><A href="http://blog.csdn.net/emu/archive/2005/04/26/363405.aspx"><U><FONT color=#800080>用junitperf做并发测试带来的问题</FONT></U></A> </DIV><DIV class=postText><P align=center><FONT size=5>关于junitperf的一点介绍</FONT></P><P><A href="http://www.clarkware.com/software/JUnitPerf.html"><U><FONT color=#800080>junitperf</FONT></U></A>&nbsp;是个很小巧的java性能测试框架，可以在<A href="http://sourceforge.net/project/showfiles.php?group_id=15278"><U><FONT color=#0000ff>http://sourceforge.net/project/showfiles.php?group_id=15278</FONT></U></A>&nbsp;上下载到。可以很容易的把它结合junit一起测试，比如在测试套件里面加这么几行：</P><P>import com.clarkware.junitperf.TimedTest;<BR>import com.clarkware.junitperf.LoadTest;<BR>.......</P><P>&nbsp;&nbsp;&nbsp; int testTimes = 10;<BR>&nbsp;&nbsp;&nbsp; int users = 5;</P><P>&nbsp;&nbsp;&nbsp; suite.addTest(new TestUserDAO("test1AddUser")); //基本功能测试，同时初始化环境<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; suite.addTest(new TimedTest(new TestUserDAO("test1AddUser"), 1000)); //基本性能测试:方法应在1秒内完成</P><P>&nbsp;&nbsp;&nbsp; suite.addTest(new LoadTest(new TestUserDAO("test1AddUser"), users)); // 并发测试</P><P>&nbsp; suite.addTest(new LoadTest(new TestUserDAO("test1AddUser"),users,testTimes)); //并发负载测试</P><P>&nbsp; suite.addTest(new TimedTest(new LoadTest(new TestUserDAO("test1AddUser"),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; users,testTimes), 35000)); //并发性能测试<BR></P><P>如果只需要反复做一个测试而不需要并发测试，可以</P><P>suite.addTest(new LoadTest(new TestUserDAO("test1AddUser"),1,testTimes)); </P><P>当然也可以不用junitperf，junit.extensions.RepeatedTest就是设计来干这个的：</P><P>suite.addTest(new RepeatedTest(new TestUserDAO("test1AddUser"), testTimes)); //重复测试<BR></P><P align=center><FONT size=5><BR>用junitperf做并发测试带来的问题<BR></FONT></P><P align=left></P><P align=left><FONT size=2></FONT></P><FONT size=2><BR>做并发测试的时候junitperf有一个问题。注意看这一行：</FONT> <P></P><P align=left><FONT size=2>new LoadTest(new TestUserDAO("test1AddUser"), users)</FONT></P><P align=left><FONT size=2>我们只传递了一个TestUserDAO实例给LoadTest，却要求它开启users个线程来测试，这样这users个线程就会只针对同一个TestUserDAO实例进行测试。这个时候，我们在TestUserDAO里面就不能存放任何状态数据了。比如以前我很喜欢这么做：</FONT></P><P align=left><FONT size=2>public class TestUserDAO extends TestCase{<BR>&nbsp;private int lastId;<BR>&nbsp;protected void setUp() throws Exception{<BR>&nbsp;&nbsp;super.setUp();<BR>&nbsp;&nbsp;//构造一个测试用的数据<BR>&nbsp;&nbsp;User user = new User("张三");<BR>&nbsp;&nbsp;//向数据库插入一条记录<BR>&nbsp;&nbsp;userDAO.addUser(user);<BR>&nbsp;&nbsp;lastId = user.getId();//刚刚插入的记录在数据库中产生的ID;<BR>&nbsp;}</FONT></P><P align=left><FONT size=2>&nbsp;public void testUpdateUser() throws DaoException{<BR>&nbsp;&nbsp;//针对setup中插入的数据进行update操作<BR>&nbsp;&nbsp;user = userDAO.getUserById(lastId);<BR>&nbsp;&nbsp;user.setName("李四");<BR>&nbsp;&nbsp;userDAO.updateUser(user);<BR>&nbsp;}<BR>&nbsp;protected void tearDown() throws Exception{<BR>&nbsp;&nbsp;//删除测试数据<BR>&nbsp;&nbsp;userDAO.deleteUserById(lastId);<BR>&nbsp;&nbsp;super.tearDown();<BR>&nbsp;}<BR></FONT><FONT size=2>这样我是通过一个int变量lastId在各个方法之间传递被测试的数据的。如果用junitperf来测试，lastId变量就会被后来的线程覆盖，导致测试失败。<BR></FONT></P><P align=center><FONT size=5><BR>解决方法<BR></FONT></P><P align=left><FONT size=2><BR>在com.clarkware.junitperf.TestFactory的文档中对这个问题做了说明：</FONT></P><P align=left><FONT size=2>This factory class should be used in cases when a stateful test&nbsp;is intended to be decorated by a &lt;code&gt;LoadTest&lt;/code&gt;.&nbsp; A stateful&nbsp;test is defined as any test that defines test-specific state in&nbsp;its &lt;code&gt;setUp()&lt;/code&gt; method.</FONT></P><P align=left>TestFactory的使用方法是这样：</P><P align=left>import com.clarkware.junitperf.TestFactory;</P><P align=left>......</P><P align=left>&nbsp;&nbsp;&nbsp;&nbsp; suite.addTest(new LoadTest(new TestFactory(TestUserDAO.class), users,testTimes)); //并发负载测试<BR></P><P align=left>但是这样只能观察整个测试类的表现。如果我们要单个的测试测试类中的一个测试，那么可以考虑另一种方法。我们在TestFactory的文档中看到：</P><P align=left>&nbsp;This class is dependent on Java 2.&nbsp; For earlier platforms a&nbsp;&nbsp;local cache implementation should be changed to use, for example,&nbsp;&nbsp;a HashMap to track thread-local information.<BR></P><P align=left>这个方法同时也适用于我们需要处理的情况：</P><P align=left><FONT size=2>public class TestUserDAO extends TestCase{<BR>&nbsp;private static final ThreadLocal threadLocal = new ThreadLocal();<BR>&nbsp;protected void setUp() throws Exception{<BR>&nbsp;&nbsp;super.setUp();<BR>&nbsp;&nbsp;//构造一个测试用的数据<BR>&nbsp;&nbsp;User user = new User("张三");<BR>&nbsp;&nbsp;//向数据库插入一条记录<BR>&nbsp;&nbsp;userDAO.addUser(user);<BR>&nbsp;&nbsp;//lastId = user.getId();//刚刚插入的记录在数据库中产生的ID;<BR>&nbsp;&nbsp;threadLocal.set(new Integer(user.getId()));<BR>&nbsp;}</FONT></P><P align=left><FONT size=2>&nbsp;public void testUpdateUser() throws DaoException{<BR>&nbsp;&nbsp;//针对setup中插入的数据进行update操作<BR>&nbsp;&nbsp;//user = userDAO.getUserById(lastId);<BR>&nbsp;&nbsp;user = userDAO.getUserById(((Integer)threadLocal.get()).intValue());<BR>&nbsp;&nbsp;user.setName("李四");<BR>&nbsp;&nbsp;userDAO.updateUser(user);<BR>&nbsp;}<BR>&nbsp;protected void tearDown() throws Exception{<BR>&nbsp;&nbsp;//删除测试数据<BR>&nbsp;&nbsp;userDAO.deleteUserById(((Integer)threadLocal.get()).intValue());<BR>&nbsp;&nbsp;super.tearDown();<BR>&nbsp;}</FONT></P></DIV><PRE><P></P></PRE><P></P></PRE><P></P></PRE></SPAN></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/emu/aggbug/4755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2005-05-18 14:13 <a href="http://www.blogjava.net/emu/articles/4755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自作聪明的junit.swingui.TestRunner </title><link>http://www.blogjava.net/emu/articles/4754.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Wed, 18 May 2005 06:08:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/4754.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/4754.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/4754.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/4754.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/4754.html</trackback:ping><description><![CDATA[<PRE><DIV class=post><DIV class=postTitle><A href="http://blog.csdn.net/emu/archive/2005/04/29/367679.aspx"><U><FONT color=#800080>自作聪明的junit.swingui.TestRunner</FONT></U></A><SCRIPT language=javascript>document.title="自作聪明的junit.swingui.TestRunner - "+document.title</SCRIPT> </DIV><DIV class=postText><P>问题<BR>在junit.swingui.TestRunner的时候发现TestRunner启动过程中报错：<BR>log4j:ERROR A "org.apache.log4j.ConsoleAppender" object is not assignable to a "org.apache.log4j.Appender" variable.<BR>同时也发现一个平时工作正常的类在使用junit.swingui.TestRunner进行测试的时候报告一个奇怪的 ClassCastException，明明构造的对象的类是实现了指定的接口的，可是就是无法造型到接口上。<BR>进一步研究发现，即使造型回原来的类也不行，虽然调试的时候显示构造的对象就是指定的类，但是就是无法造型成这个类，一度认为是妖人作祟或者机子被落了降头。</P><P>研究<BR>求得庄老大再次出手，一下指出指出问题在于不同的类装载器装载的类无法相互造型的。于是进去junit.swingui.TestRunner里面去找类装载器，一翻折腾之后终于找到：</P><P>junit.runner.BaseTestRunner<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |－－－－－－junit.swingui.TestRunner<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |－－－－－－junit.textui.TestRunner</P><P>在BaseTestRunner里面定义了这样一个方法：<BR>&nbsp;&nbsp;&nbsp; public TestSuiteLoader getLoader() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (useReloadingTestSuiteLoader())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new ReloadingTestSuiteLoader();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new StandardTestSuiteLoader();<BR>&nbsp;&nbsp;&nbsp; }<BR>不过注意到junit.textui.TestRunner是不会出上面的错误的，因为它自己重载了getLoader()方法，<BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Always use the StandardTestSuiteLoader. Overridden from<BR>&nbsp;&nbsp;&nbsp;&nbsp; * BaseTestRunner.<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public TestSuiteLoader getLoader() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new StandardTestSuiteLoader();<BR>&nbsp;&nbsp;&nbsp; }<BR>但是junit.swingui.TestRunner就很自作聪明了，为了避免每次在点“run”按钮的时候装载运行器本身，就直接使用了基类的方法去获取装载器），这样基类就可以调用自己的getLoader方法来决定要启用那个classloader：</P><P>&nbsp;&nbsp;&nbsp; public TestSuiteLoader getLoader() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (useReloadingTestSuiteLoader())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new ReloadingTestSuiteLoader();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new StandardTestSuiteLoader();<BR>&nbsp;&nbsp;&nbsp; }</P><P>如果我们用sun的jdk的话，这个方法会返回一个TestCaseClassLoader对象，而这个对象在装载class的时候总是调用creatLoader方法：<BR>&nbsp;&nbsp;&nbsp; protected TestCaseClassLoader createLoader() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new TestCaseClassLoader();<BR>&nbsp;&nbsp;&nbsp; }</P><P>返回的其实是TestCaseClassLoader。这样如果被测试类使用了log4j的话，会造成org.apache.log4j.Appender类被 sun.misc.Launcher$AppClassLoader(也就是sun.misc.Launcher类的嵌入类AppClassLoader)装载一次（在启动test的过程中vm自动装载被引用到的类），然后在运行的时候又被junit.runner.TestCaseClassLoader再装载一次。由两个装载器装载进来的类不管是不是来自同一个.class文件，都会被认为是两个不同的类。因此就造成了上面的错误。<BR>同样的，如果你在自己的代码里面这样装载类：<BR>MyClass myClass = (MyClass)Thread.currentThread().getContextClassLoader().loadClass(mClassName);<BR>也会造成相同的问题并抛出ClassCastException。因为MyClass是在运行测试的过程由junit.runner.TestCaseClassLoader装载的，而Thread.currentThread().getContextClassLoader()却指向的是sun.misc.Launcher$AppClassLoader。</P><P>解决方法<BR>1 java -Dlog4j.ignoreTCL junit.swingui.TestRunner<BR>我猜TCL是ThreadClassLoader的缩写，这个参数的意思大概就是让log4j忽略Thread自己的类装载器（sun.misc.Launcher$AppClassLoader），改而使用当前Class的装载器（junit.runner.TestCaseClassLoader）来装载。但是这个方法只能解决log4j的错误报告（改变了org.apache.log4j.ConsoleAppender的装载方式），但是对我们自己写的代码中的问题却没有作用。</P><P>2 在我们自己的类里面写上一段静态代码：<BR>&nbsp; static{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.currentThread().setContextClassLoader(MyClassFactory.class.getClassLoader());<BR>&nbsp; }<BR>和方法一类似，这也是在工厂类中用加载了当前lass的装载器（TestCaseClassLoader）来代替Thread的初始化装载器sun.misc.Launcher$AppClassLoader。这个方法可以解决我们自己代码中的问题，并且不会带来影响原来的其他代码。结合第一种方法可以解决上面的两个问题。但是如果你有好几个工厂类，或者你用的其他包里面用了这样的装载方式……那你还可以试试下面的偏门：</P><P>3 注意到BaseTestRunner要进行一个useReloadingTestSuiteLoader()判断才决定返回哪个装载器<BR>public TestSuiteLoader getLoader() {<BR>&nbsp;&nbsp;&nbsp; if (useReloadingTestSuiteLoader())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new ReloadingTestSuiteLoader();<BR>&nbsp;&nbsp;&nbsp; return new StandardTestSuiteLoader();<BR>}<BR>我们来看看这个判断过程：<BR>protected boolean useReloadingTestSuiteLoader() {<BR>&nbsp;&nbsp;&nbsp; return getPreference("loading").equals("true") &amp;&amp; !inVAJava() &amp;&amp; fLoading;<BR>}<BR>嗯，里面有个inVAJava()是什么玩意儿？<BR>public static boolean inVAJava() {<BR>&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("com.ibm.uvm.tools.DebugSupport");<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; return true;<BR>}<BR>原来它是想判断如果当前使用的是ibm的虚拟机就使用默认装载器，但是判断的条件也忒简单了点，很容易就吧它给蒙过去了：<BR>在当前工程下创建com.ibm.uvm.tools包，在其中创建DebugSupport类：<BR>package com.ibm.uvm.tools;<BR>public class DebugSupport{}<BR>没有错，就这个空白的类，这样就可以把junit.swingui.TestRunner给蒙倒。这样做据说的副作用是，每次点run按钮的时候，都要重起gui环境，但是我没有发现有什么区别。不过要是没有区别，人家又干吗费那么多事呢？不解。</P><P>参考资料</P><P><A href="http://mail-archives.apache.org/mod_mbox/logging-log4j-user/200301.mbox/%3C3E1F1A31.2000605@attbi.com%3E"><U><FONT color=#800080>http://mail-archives.apache.org/mod_mbox/logging-log4j-user/200301.mbox/%3C3E1F1A31.2000605@attbi.com%3E</FONT></U></A></P><BR>[<A href="javascript:StorePage()"><U><FONT color=#0000ff>点击此处收藏本文</FONT></U></A>] </DIV><DIV class=postFoot>发表于 2005年04月29日 10:48 AM </DIV></DIV><P><LINK href="http://blog.csdn.net/emu/Services/Pingback.aspx" rel=pingback><!--<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><rdf:Descriptionrdf:about="http://blog.csdn.net/emu/archive/2005/04/29/367679.aspx"dc:identifier="http://blog.csdn.net/emu/archive/2005/04/29/367679.aspx"dc:title="自作聪明的junit.swingui.TestRunner"trackback:ping="http://blog.csdn.net/emu/services/trackbacks/367679.aspx" /></rdf:RDF>--><BR></P><DIV id=comments><H3></H3><DIV class=post><DIV class=postTitle>maggie&nbsp;发表于<SPAN>2005-04-29 11:43 AM</SPAN>&nbsp;&nbsp;</DIV><DIV class=postText>果然看不不懂</DIV></DIV><BR><DIV class=post><DIV class=postTitle><A href="http://blog.csdn.net/emu/" target=_blank><U><FONT color=#800080>emu</FONT></U></A>&nbsp;发表于<SPAN>2005-04-29 6:02 PM</SPAN>&nbsp;&nbsp;</DIV><DIV class=postText>你将来长大了就懂了呵呵</DIV></DIV><BR><DIV class=post><DIV class=postTitle>Pingback/Trackback&nbsp;发表于<SPAN>2005-04-29 6:36 PM</SPAN>&nbsp;&nbsp;</DIV><DIV class=postText>试一试</DIV></DIV><BR><DIV class=post><DIV class=postTitle>linux_china&nbsp;发表于<SPAN>2005-05-12 8:13 PM</SPAN>&nbsp;&nbsp;</DIV><DIV class=postText>please modify excluded.properties in junit.jar,and execude some package will be all right.</DIV></DIV></DIV></PRE><img src ="http://www.blogjava.net/emu/aggbug/4754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2005-05-18 14:08 <a href="http://www.blogjava.net/emu/articles/4754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>