﻿<?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-轮上飞-随笔分类-&lt;b&gt; TEST &lt;/b&gt;</title><link>http://www.blogjava.net/zhyiwww/category/11940.html</link><description>zhyiwww</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 13:32:39 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 13:32:39 GMT</pubDate><ttl>60</ttl><item><title>DOS中如何删除文件夹</title><link>http://www.blogjava.net/zhyiwww/archive/2006/09/20/70855.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 20 Sep 2006 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/09/20/70855.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/70855.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/09/20/70855.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/70855.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/70855.html</trackback:ping><description><![CDATA[可以使用rd命令。<br />如果目录是空的，那么可以用<br /><strong> rd 目录<br /></strong>删除目录。如下图：<br /><img height="289" alt="dos-rd-dir-s.JPG" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/dos/dos-rd-dir-s.JPG" width="650" border="0" /><br />输入Y之后系统就会删除整个目录。<br /><br />如果目录是非空，那么使用<br /><strong>rd 目录 /s<br /></strong>来删除目录（目录下的文件也会删除一同）。<br />如果没有加/s,那么系统会给出目录非空的提示。如下图：<br /><img height="226" alt="dos-rd-dir-no-s.JPG" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/dos/dos-rd-dir-no-s.JPG" width="648" border="0" /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/70855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-09-20 17:24 <a href="http://www.blogjava.net/zhyiwww/archive/2006/09/20/70855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JUnit 最佳实践</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/07/51186.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 07 Jun 2006 09:49:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/07/51186.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/51186.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/07/51186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/51186.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/51186.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JUnit best practice																																																2006-5-31 																																																																																							...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhyiwww/archive/2006/06/07/51186.html'>阅读全文</a><img src ="http://www.blogjava.net/zhyiwww/aggbug/51186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-07 17:49 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/07/51186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ant+cactus+tomcat5.5容器内单元测试简明手册(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/07/51185.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 07 Jun 2006 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/07/51185.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/51185.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/07/51185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/51185.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/51185.html</trackback:ping><description><![CDATA[
		<div class="title">
				<h2>ant+cactus+tomcat5.5容器内单元测试简明手册</h2>
		</div>
		<!-- end of div title -->
		<div class="summary">
				<div class="left">
						<script type="text/javascript">
								<!--
google_ad_client = "pub-9672439736604416";
google_alternate_ad_url = "http://www.matrix.org.cn/google_adsense_script.html";
google_ad_width = 300;
google_ad_height = 250;
google_ad_format = "300x250_as";
google_ad_type = "text_image";
google_ad_channel ="";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "0000FF";
google_color_url = "008000";
google_color_text = "000000";
//-->
						</script>
						<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
						</script>
				</div>
				<div class="center">
						<h4>摘要:</h4>折腾了一个星期，终于搞定ant+cactus+tomcat5.5容器内单元测试，为感谢cleverpig斑竹的热心回贴，特首发于matrix apache版。 </div>
				<div class="right">
						<div class="help">
								<h4>文章工具</h4>
								<a href="http://www.matrix.org.cn/favorite.shtml;jsessionid=70E464F4A6F960A00ACB9C782C527E45?type=article&amp;title=ant%252Bcactus%252Btomcat5.5%25E5%25AE%25B9%25E5%2599%25A8%25E5%2586%2585%25E5%258D%2595%25E5%2585%2583%25E6%25B5%258B%25E8%25AF%2595%25E7%25AE%2580%25E6%2598%258E%25E6%2589%258B%25E5%2586%258C&amp;url=resource%2Farticle%2F44%2F44173_ant%2Bcactus%2Btomcat5.5.html">收藏</a>
								<br />
								<a href="http://www.matrix.org.cn/resource/article/44/44173_ant+cactus+tomcat5.5.html#avote">投票评分</a>
								<br />
								<a href="http://www.matrix.org.cn/resource/article/44/44173_ant+cactus+tomcat5.5.html#areview">发表评论</a>
								<br />
								<a onclick="copyLink('ant+cactus+tomcat5.5容器内单元测试简明手册');" href="http://www.matrix.org.cn/resource/article/44/44173_ant+cactus+tomcat5.5.html#">复制链接</a>
								<br />
						</div>
				</div>
		</div>
		<!-- end of summary line -->
		<div class="overflow" id="text">折腾了一个星期，终于搞定ant+cactus+tomcat5.5容器内单元测试，为感谢cleverpig斑竹(<a href="http://blog.matrix.org.cn/page/cleverpig" target="_new">http://blog.matrix.org.cn/page/cleverpig</a>)的热心回贴，特首发于matrix apache版。关于ant的使用，请搜索ant的使用手册，网上大把中文的。<br /><br /><span style="COLOR: blue">一、下载并解压缩cactus</span><br />下载地址为<a href="http://apache.freelamp.com/jakarta/cactus/binaries/jakarta-cactus-12-1.7.1.zip" target="_new">http://apache.freelamp.com/jakarta/cactus/binaries/jakarta-cactus-12-1.7.1.zip</a>。将cactus的lib目录下的cactus-ant-1.7.1.jar复制到ant的lib目录。<br /><br /><br /><span style="COLOR: blue">二、配置cactus</span><br />cactus的配置很简单，新建一个cactus.properties文件，并把它放在ant脚本中的cactus任务的classpath下，文件中包括如下内容<br /><pre class="overflow">cactus.sysproperties=cactus.contextURL<br />#cactus-sample-servlet-cactified就是你的测试应用所在路径，8080是端口号<br />cactus.contextURL = http://localhost:8080/cactus-sample-servlet-cactified<br />cactus.servletRedirectorName = ServletRedirector<br />cactus.jspRedirectorName = JspRedirector<br />cactus.filterRedirectorName = FilterRedirector </pre><br />具体的做法结合ant脚本再进一步解释。<br /><br /><span style="COLOR: blue">三、运行ant脚本</span><br />  ant脚本主要执行以下任务<br /><br /><span style="COLOR: green">1、设定classpath</span><br />    <pre class="overflow">&lt;path id="project.classpath"&gt;<br />        &lt;fileset dir="${lib.dir}"&gt;<br />           &lt;include name="*.jar"/&gt;<br />        &lt;/fileset&gt;<br />        &lt;!-- cactus.properties文件就需要放在lib.dir所对应的路径中 --&gt;<br />        &lt;pathelement location="${lib.dir}"/&gt;<br />        &lt;pathelement location="${tomcat.home}/common/lib/jsp-api.jar"/&gt;<br />        &lt;pathelement location="${tomcat.home}/common/lib/servlet-api.jar"/&gt;<br />    &lt;/path&gt;</pre><br /><br /><span style="COLOR: green">2、定义相关任务</span><br />   <pre class="overflow">&lt;taskdef resource="cactus.tasks" classpathref="project.classpath"/&gt;<br />   &lt;taskdef name="runservertests" classname="org.apache.cactus.integration.ant.RunServerTestsTask"&gt;<br />            &lt;classpath&gt;<br />                &lt;path refid="project.classpath"/&gt;<br />            &lt;/classpath&gt;<br />        &lt;/taskdef&gt;</pre><br /><br /><span style="COLOR: green">3、编译应用的类文件和测试的类文件</span><br /><br /><span style="COLOR: green">4、打包整个应用为war文件</span><br />需要注意的是，不仅要打包应用类，测试类也要打包<br />   <br />   <pre class="overflow">&lt;target name="war" depends="compile.java"<br />            description="Generate the runtime war"&gt;<br /><br />        &lt;war warfile="${target.dir}/${project.name}.war"<br />             webxml="${src.webapp.dir}/WEB-INF/web.xml"&gt;<br />            &lt;fileset dir="${src.webapp.dir}"&gt;<br />                &lt;exclude name="cactus-report.xsl"/&gt;<br />                &lt;exclude name="WEB-INF/cactus-web.xml"/&gt;<br />                &lt;exclude name="WEB-INF/web.xml"/&gt;<br />            &lt;/fileset&gt;<br />            &lt;classes dir="${target.classes.java.dir}"/&gt;<br />            &lt;!-- 别忘了打包测试类 --&gt;<br />            &lt;classes dir="${target.classes.test.dir}"/&gt;<br />            &lt;!-- 别忘了打包各种相关的jar文件 --&gt;<br />            &lt; lib dir="project.classpath"/&gt;<br />        &lt;/war&gt;<br />    &lt;/target&gt;</pre><br /><br /><span style="COLOR: green">5、在应用的web.xml文件中添加测试所需的各种映射</span><br />cactus提供了两个task来完成这个工作，CactifyWar和WebXmlMerge。<br />CactifyWar的功能是自动在已经打包的应用的web.xml文件中添加所需的映射。WebXmlMerge是提供合并两个web.xml文件的功能。<br /><pre class="overflow">&lt;target name="test.prepare"<br />            depends="war, compile.cactus, test.prepare.logging"&gt;<br /><br />        &lt;!-- Cactify the web-app archive --&gt;<br />        &lt;cactifywar srcfile="${target.dir}/${project.name}.war"<br />                    destfile="${tomcat.home}/webapps/${project.name}-cactified.war"<br />                &gt;<br />            &lt;classes dir="${target.classes.java.dir}"/&gt;<br />            &lt;classes dir="${target.classes.test.dir}"/&gt;<br />            &lt;lib dir="project.classpath"/&gt;<br />       &lt;/cactifywar&gt;<br />&lt;/target&gt;</pre><br /><br /><span style="COLOR: green">6、运行测试</span><br />cactus提供了cactus和RunServerTests两个task来运行测试。<br />"cactus" task是通过复制容器服务器的最小文件并运行来运行测试，因此需要制定容器服务器的类型，启动速度稍快点，另外配置比较方便，但是无法测试象tomcat连接池等资源。另外对tomcat5.5的支持也不好。<br />"RunServerTests"是通过直接启动容器服务起来运行测试，因此速度稍慢，且配置较麻烦，但能测试各种资源。<br />   <pre class="overflow">&lt;target name="test" depends="test.prepare"<br />             description="Run tests on Tomcat "&gt;<br /><br />        &lt;!-- Start the servlet engine, wait for it to be started, run the<br />             unit tests, stop the servlet engine, wait for it to be stopped.<br />             The servlet engine is stopped if the tests fail for any reason --&gt;<br />        &lt;!-- 8080是服务器的端口号，${project.name}-cactified是项目的路径，和上一步的cactifywar 的destfile相对应 --&gt;<br />        &lt;runservertests<br />                testURL="http://localhost:8080/${project.name}-cactified/ServletRedirector?Cactus_Service=RUN_TEST"<br />                startTarget="_StartTomcat"<br />                stopTarget="_StopTomcat"<br />                testTarget="_Test"/&gt;<br /><br />    &lt;/target&gt;</pre><br />    <br />    <pre class="overflow">&lt;!-- _Test就是一个普通的junit任务 --&gt;<br />    &lt;target name="_Test"&gt;<br />        &lt;junit printsummary="yes" fork="yes"&gt;<br />            &lt;classpath&gt;<br />                &lt;path refid="project.classpath"/&gt;<br />                &lt;pathelement location="${target.classes.java.dir}"/&gt;<br />                &lt;pathelement location="${target.classes.test.dir}"/&gt;<br />            &lt;/classpath&gt;<br />            &lt;formatter type="brief" usefile="false"/&gt;<br />            &lt;formatter type="xml"/&gt;<br /><br />            &lt;batchtest&gt;<br />                &lt;fileset dir="${src.test.dir}"&gt;<br />                    &lt;!-- Due to some Cactus synchronization bug, the 'unit' tests need<br />              to run before the 'sample' tests --&gt;<br />                    &lt;include name="**/Test*.java"/&gt;<br />                    &lt;exclude name="**/Test*All.java"/&gt;<br />                &lt;/fileset&gt;<br />            &lt;/batchtest&gt;<br />        &lt;/junit&gt;<br />    &lt;/target&gt;</pre><br />    <br />本文由本人历经2小时写成，经历一次提交失败，苦笑。本人初学ant，学识有限，若有疏漏，不当之处，欢迎指正。</div>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/51185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-07 17:48 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/07/51185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cactus实例讲解(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/07/51184.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 07 Jun 2006 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/07/51184.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/51184.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/07/51184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/51184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/51184.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="558" border="0">
				<tbody>
						<tr>
								<td valign="center" align="right" colspan="2" height="32">
										<div class="style7" align="center">
												<span style="FONT-SIZE: 12pt">
														<b>Cactus实例讲解</b>
												</span>
										</div>
								</td>
						</tr>
						<tr>
								<td valign="center" align="right" bgcolor="#000000" colspan="2" height="1">
								</td>
						</tr>
						<tr>
								<td valign="center" align="right" colspan="2" height="20">
										<div align="center"> </div>
								</td>
						</tr>
						<tr>
								<td valign="top" align="right" colspan="2" height="10">
								</td>
						</tr>
						<tr>
								<td valign="top" align="right" width="2%" height="10">
										<div align="left">
										</div>
								</td>
								<td valign="top" align="right" width="98%" bgcolor="#ffffff">
										<div class="daxiao14" align="left">
												<p class="style2">Cactus简介</p>
												<p>
														<strong>．　简介 </strong>
												</p>
												<p>Cactus实现了对JUnit测试框架的无缝扩展，可以方便地测试服务端应用程序。Cactus可以在下面几种情况下使用：</p>
												<ul>
														<li>测试Servlet以及任何使用了像HttpServletRequest，HttpServletResponse，……这样的对象的代码。使用ServletTestCase。 
</li>
														<li>测试Filter以及任何使用了像FilterConfig，……这样的对象的代码。使用FilterTestCase。 
</li>
														<li>测试JSP 。使用ServletTestCase或JspTestCase。 
</li>
														<li>测试Taglibs以及任何使用了像PageContext，……这样的对象的代码。使用JspTestCase。 
</li>
														<li>测试EJB。ServletTestCase或JspTestCase或FilterTestCase。 </li>
												</ul>
												<p>Cactus的使用也是非常简单的，你写的测试类只需继承ServletTestCase或者JspTestCase、FilterTestCase（它们都继承了JUnit的TestCase）。写好测试代码后需要启动web容器，然后执行测试代码。在下面的章节中我们将通过例子向你详细讲解。</p>
												<p>Cactus项目Apache Jakarta Commons的一个子项目，网址是：<a href="http://jakarta.apache.org/commons/cactus/"><font color="#000000">http://jakarta.apache.org/commons/cactus/</font></a>。</p>
												<p>
														<strong>．　TestCase框架</strong>
												</p>
												<p>在Cactus下，我们写的TestCase与JUnit有所不同，先看一段代码，如下：</p>　　　　　　　public class TestSample extendsServletTestCase/JspTestCase/FilterTestCase {<br />　　　　　　　public TestSample (String testName) {<br />　　　　　　　super(testName);<br />　　　　　　　}<br />　　　　　　　public void setUp() {<br />　　　　　　　}<br />　　　　　　　public void tearDown() {<br />　　　　　　　}<br />　　　　　　　public void beginXXX(WebRequest theRequest) {<br />　　　　　　　}<br />　　　　　　　public void testXXX() {<br />　　　　　　　}<br />　　　　　　　public void endXXX(WebResponse theResponse) {<br />　　　　　　　}<br /><p>上面是一个Cactus测试类的完整代码框架，其中的extends部分需要按你所测试的不同目标来继承不同的类（简介中有所描述）。</p><p>另外我们注意到两个新的方法beginXXX和endXXX的，这两个方法分别会在testXXX执行前和执行后执行，它们和setUp、tearDown不同的是beginXXX和endXXX会在相应的testXXX前执行，而setUp和tearDown则在每个testXXX方法前都会执行。另外beginXXX和endXXX是客户端代码，所以在这两个方法里是无法使用request这样的服务端对象的。</p><p>对于endXXX方法需要另加说明的是，在Cactus v1.1前（包括v1.1），它的形式是这样的public void endXXX(HttpURLConnection theConnection)，而在Cactus v1.2开始它的形式有两种可能：</p><ul><li>public void endXXX(org.apache.cactus.WebResponse theResponse)； 
</li><li>public void endXXX(com.meterware.httpunit.WebResponse theResponse)； </li></ul><p>可以看到区别在于引用的包不同，为什么会这样的呢？因为在v1.2开始Cactus集成了HttpUnit这个组件。如果你熟悉HttpUnit这个组件，我想应该明白为什么要集成HttpUnit。下面我们来看一段代码开比较一下两者的区别：</p><p align="left">public void endXXX(org.apache.cactus.WebResponse theResponse) {</p><p align="left">String content = theResponse.getText();</p><p align="left">assertEquals(content, "&lt;html&gt;&lt;body&gt;&lt;h1&gt;Hello world!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;");</p><p align="left">}</p><p align="left">public void endXXX(com.meterware.httpunit.WebResponse theResponse) {</p><p align="left">WebTable table = theResponse.getTables()[0];</p><p align="left">assertEquals("rows", 4, table.getRowCount());</p><p align="left">assertEquals("columns", 3, table.getColumnCount());</p><p align="left">assertEquals("links", 1, table.getTableCell(0, 2).getLinks().length);</p><p align="left">}</p><p>当然，在实际应用中你需要根据不同的需要来选择不同的endXXX。两个WebResponse的差别可以参见两者各自的API Doc，这里就不再多说了。</p><p class="style2">如何在Cactus里写测试</p><p><strong>．　写测试代码</strong></p><p>首先，我们给出被测类的代码，是一个Servlet：</p><p>public class SampleServlet extends HttpServlet {</p><p>public void doGet(HttpServletRequest theRequest,</p><p>HttpServletResponse theResponse) throws IOException {</p><p>PrintWriter pw = theResponse.getWriter();</p><p>theResponse.setContentType("text/html");</p><p>pw.print("&lt;html&gt;&lt;head/&gt;&lt;body&gt;");</p><p>pw.print("A GET request");</p><p>pw.print("&lt;/body&gt;&lt;/html&gt;");</p><p>}</p><p>public String checkMethod(HttpServletRequest theRequest) {</p><p>return theRequest.getMethod();</p><p>}</p><p>}</p><p>Cactus中的测试类框架已经在上面给出。下面来看一下例子，例子是从中Cactus自带的实例中抽取的一部分，如下：</p><p>public class TestSampleServlet extends ServletTestCase {</p><p>public void testReadServletOutputStream() throws IOException {</p><p>SampleServlet servlet = new SampleServlet();</p><p>servlet.doGet(request, response);</p><p>}</p><p>public void endReadServletOutputStream(WebResponse theResponse)</p><p>throws IOException {</p><p>String expected = "&lt;html&gt;&lt;head/&gt;&lt;body&gt;A GET request&lt;/body&gt;&lt;/html&gt;";</p><p>String result = theResponse.getText();</p><p>assertEquals(expected, result);</p><p>}</p><p>public void beginPostMethod(WebRequest theRequest) {</p><p>theRequest.addParameter("param", "value", WebRequest.POST_METHOD);</p><p>}</p><p>public void testPostMethod() {</p><p>SampleServlet servlet = new SampleServlet();</p><p>assertEquals("POST", servlet.checkMethod(request));</p><p>assertEquals("value", request.getParameter("param"));</p><p>} </p><p>}</p><p>第一个方法testReadServletOutputStream，调用doGet，相当于在客户端提交请求，然后在Servlet处理后会产生一个回馈，所以，在endReadServletOutputStream方法里，我们通过调用response的相应方法判断回馈是否符合预期结果。</p><p>第二个方法testPostMethod，在这之前有一个beginPostMethod，在这个方法里我们以POST方式往request里增加一个表单数据param，值为”value”。下面在testPostMethod我们就要验证表单数据是否以POST方式提交到了服务端的Servlet里，所以，我们看到了两个assertEquals，分别进行了判断。在这里我们要注意到beginPostMethod方法中的theRequest和testPostMethod中的request的区别，在前面我们已经提到过，beginPostMethod是在客户端执行的，所以它方法内的所有操作事实上是模拟页面操作的，比如上面的设置表单数据，而testPostMethod是服务端执行的，其中的request也是服务端的。</p><span class="style2"><strong>配置cactus.properties和web.xml</strong></span><p><strong>cactus.properties</strong></p><ul><li>cactus.contextURL </li></ul><p>这个属性是必须的，它指定了web应用的访问地址</p><p>例：cactus.contextURL = <a href="http://localhost:8080/test"><font color="#000000">http://localhost:8080/test</font></a></p><ul><li>cactus.servletRedirectorName </li></ul><p>可选，当测试类继承ServletTestCase时用于指定Cactus Servlet Redirector的映射名称。默认：ServletRedirector</p><p>例：cactus.servletRedirectorName = ServletRedirector</p><ul><li>cactus.jspRedirectorName </li></ul><p>可选，当测试类继承ServletTestCase时用于指定Cactus Jsp Redirector的映射名称。默认：ServletRedirector</p><p>例：cactus.jspRedirectorName = JspRedirector</p><ul><li>cactus.<a class="style3">filterRedirectorName </a>(For J2EE API 1.3 only) </li></ul><p>可选，当测试类继承ServletTestCase时用于指定Cactus Filter Redirector的映射名称。默认：ServletRedirector</p><p>例：cactus.filterRedirectorName = FilterRedirector</p><p>Cactus.properties你可以放置在WEB-INF/classes/下。</p><p><strong>web.xml</strong></p><p>在web.xml里要为相应的测试类指定相应的Cactus Redirector。</p><p>ServletTestCase对应org.apache.cactus.server.ServletTestRedirector</p><p>JspTestCase对应/jspRedirector.jsp</p><p>FilterTestCase对应org.apache.cactus.server.FilterTestRedirector</p><p>&lt;web-app&gt;</p><p>&lt;filter&gt;</p><p>&lt;filter-name&gt;FilterRedirector&lt;/filter-name&gt;</p><p>&lt;filter-class&gt;org.apache.cactus.server.FilterTestRedirector&lt;/filter-class&gt;</p><p>&lt;/filter&gt;</p><p>&lt;filter-mapping&gt;</p><p>&lt;filter-name&gt;FilterRedirector&lt;/filter-name&gt;</p><p>&lt;url-pattern&gt;/FilterRedirector&lt;/url-pattern&gt;</p><p>&lt;/filter-mapping&gt;</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;ServletRedirector&lt;/servlet-name&gt;</p><p>&lt;servlet-class&gt;org.apache.cactus.server.ServletTestRedirector&lt;/servlet-class&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;servlet&gt;</p><p>&lt;servlet-name&gt;JspRedirector&lt;/servlet-name&gt;</p><p>&lt;jsp-file&gt;<a class="style3">/jspRedirector.jsp</a>&lt;/jsp-file&gt;</p><p>&lt;/servlet&gt;</p><p>&lt;servlet-mapping&gt;</p><p>&lt;servlet-name&gt;ServletRedirector&lt;/servlet-name&gt;</p><p>&lt;url-pattern&gt;/ServletRedirector&lt;/url-pattern&gt;</p><p>&lt;/servlet-mapping&gt;</p><p>&lt;servlet-mapping&gt;</p><p>&lt;servlet-name&gt;JspRedirector&lt;/servlet-name&gt;</p><p>&lt;url-pattern&gt;/JspRedirector&lt;/url-pattern&gt;</p><p>&lt;/servlet-mapping&gt;</p><p>&lt;/web-app&gt;</p><p>如果你的测试类继承了JspTestCase则需要将jspRedirector.jsp文件放置到你在web.xml中指定的路径里。</p><p class="style2">安装说明</p><ul><li>在使用Cactus时，strutstest.jar还需要有下列包的支持。包可放置在WEB-INF/lib下 </li></ul><p>如下：</p><ul><ul><li><a class="style3">Client</a>端，需要如下包 </li></ul></ul><p align="left">junit.jar</p><p align="left">servlet.jar</p><p align="left">cactus.jar</p><p align="left">httpclient.jar</p><p align="left">commons-logging.jar</p><p align="left">httpunit.jar，Tidy.jar，xerces.jar（可选，如果你集成了httpunit的话就需要，也就是在endXXX中使用了httpunit）</p><ul><ul><li>Server端（也就是web容器）需要如下包 </li></ul></ul><p align="left">cactus.jar</p><p align="left">junit.jar</p><p align="left">aspectjrt.jar</p><p align="left">commons-logging.jar</p><ul><li>写好测试代码后将class放置在WEB-INF/classes下 
</li><li>被测代码也放置在WEB-INF/classes下 
</li><li>写好cactus.properties和web.xml两个配置文件 
</li><li>启动web容器 
</li><li>运行测试代码 </li></ul></div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/51184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-07 17:46 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/07/51184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cactus测试完整例子(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/07/51178.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 07 Jun 2006 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/07/51178.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/51178.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/07/51178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/51178.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/51178.html</trackback:ping><description><![CDATA[
		<p>
		</p>
		<div class="pagetitle">Cactus</div>
		<p>
		</p>
		<tr>
				<td>
						<font size="2">(史帝芬, 2005/8/10, <a href="mailto:hi.steven@gmail.com">hi.steven@gmail.com</a>)</font>
				</td>
		</tr>
		<tr>
				<td>
						<br />
						<img height="60" alt="Qoo1.gif" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/Qoo1.gif" width="60" border="0" />很多人學會JUnit後，就希望能在程式開發時使用，卻發現在web中根本沒辦法用，因為web程式 有太多是需要container啟動才能執行的。基本上JUnit適合用在J2SE程式的測試，在J2EE方面則力有未 逮，這時候就是Cactus粉墨登場的時候了。Cactus也是由apache所開發，是架構於JUnit之上，所以在學 習Cactus之前，先學會JUnit仍是有幫助的。接下來我們將說明Cactus如何測試servlet及jsp程式，測試時 我使用的container是Tomcat 4.1.30。<br /><ul><li><b>概念解說</b> <br /><img height="226" alt="archi.jpg" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/archi.jpg" width="434" border="0" /> <br />上圖是Cactus的架構圖，這裡做個簡單說明: <br />YYYTestCase = ( ServletTestCase | FilterTestCase | JspTestCase ) <br />XXX是test case的名稱，每個YYYTestCase包含數個test case。 <br /><ol><li>圖中標號1~8是執行的順序，當測試開始時TestRunner會產生TestCase實例，並呼叫裡面的runTest method (YYYTestCase.runTest() method )， runTest method會尋找TestCase裡的begin() method及beginXXX() method並依序執行。<br /></li><li>YYYTestCase.runTest() method接著開啟一個連線到Redirector Proxy的Http連線，所有在beginXXX() method， 中設定的request參數 (HTTP headers, HTTP parameters, ...) 將會被設定在HTTP request。<br /></li><li>Redirector Proxy再產生一個TestCase實例，並依序呼叫setUP()、testXXX()、tearDown()，這些method的用法 與JUnit的用法相同，需注意的是這時候由Redirector Proxy產生的HttpServletRequest、ServletConfig、ServletContext… 現在可以使用了。 
</li><li>Redirector Proxy收集測試結果，並將測試結果以HTTP傳回給YYYTestCase。 
</li><li>YYYTestCase執行endXXX()並顯示結果，在測試完成之後，YYYTestCase()會呼叫end() method。 
</li><li>在這整個測試流程裡，一般client要傳給server的參數會寫在beginXXX() method，server端會在testXXX() method裡作測試， client則在endXXX() method看測試結果。 </li></ol></li><li><b>範例程式</b><br />在開始使用Cactus測試程式之前，我們先寫個登入的功能，接下來才以Cactus來測試這個功能是否正常， 下圖是登入功能的圖示。<img height="76" alt="cactus01.jpg" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/cactus01.jpg" width="341" border="0" /> <br /><ol><li>index.jsp <pre>&lt;HTML&gt;
&lt;HEAD&gt;
&lt;%@ page language="java" 
    contentType="text/html; charset=BIG5" pageEncoding="BIG5" %&gt;
&lt;META http-equiv="Content-Type" content="text/html; charset=BIG5"&gt;
&lt;TITLE&gt;首頁&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;

&lt;form action="/UnitTest/LoginServlet"&gt;
	登入名稱: &lt;input type="text" name="username"&gt;&lt;br&gt;
	登入密碼: &lt;input type="password" name="password"&gt;&lt;br&gt;
	&lt;input type="submit" value="登入"&gt;
&lt;/form&gt;

&lt;/BODY&gt;
&lt;/HTML&gt;	
	</pre></li><li>LoginServlet.java <pre>package tw.idv.idealist.cactus;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.*;

public class LoginServlet extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse resp)	
      throws ServletException, IOException {
    doPost(req, resp);
  }

  public void doPost(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException {
    if (isValidUser(req)) {
      String username = req.getParameter("username");
      req.setAttribute("username", username);
      RequestDispatcher rd = req.getRequestDispatcher("/welcome.jsp");
      rd.forward(req, resp);
    }
    else {
      //do something
    }
  }

  public boolean isValidUser(HttpServletRequest req) {
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    if (username.equals("steven") &amp;&amp; password.equals("1234")) {
      return true;
    }
    else {
      return false;
    }
  }
}	
	</pre></li><li>welcome.jsp <pre>&lt;HTML&gt;
&lt;HEAD&gt;
&lt;%@ page language="java" contentType=
    "text/html; charset=BIG5" pageEncoding="BIG5" %&gt;
&lt;META http-equiv="Content-Type" content="text/html; charset=BIG5"&gt;
&lt;TITLE&gt;歡迎頁&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;

Hello, &lt;%= request.getAttribute("username") %&gt;!

&lt;/BODY&gt;
&lt;/HTML&gt;	
	</pre>上面的程式，執行後輸入登入名稱steven，登入密碼1234後，結果會如下:<br /> <img height="399" alt="cactus02.jpg" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/cactus02.jpg" width="712" border="0" /><img height="399" alt="cactus03.jpg" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/cactus03.jpg" width="712" border="0" /></li></ol></li><li><b>安裝設定</b><br />首先到<a href="http://jakarta.apache.org/cactus/">Cactus的官方網站</a>下載並解開。以下安裝Cactus的目錄以$Cactus表示。首先將[$Cactus/lib]目錄下的 commons-logging-xxx.jar、aspectjrt-xxx.jar、cactus- xxx.jar、commons-httpclient-xxx.jar與junit-xxx.jar放到web程式 下的WEB-INF/lib目錄下，再將cactus-report.xsl放置在web程式的根目錄下。接下來在WEB-INF/web.xml加入 如下內容: FilterRedirector、ServletRedirector、JspRedirector是測試Filter、Servlet、Jsp時的Redirector Proxy，如果 你只要測試其中一項，可以選擇性加入即可，如果要用到JspRedirector要記得將jspRedirector.jsp放到根目錄。 <br /><pre>&lt;filter&gt;
  &lt;filter-name&gt;FilterRedirector&lt;/filter-name&gt;
  &lt;filter-class&gt;org.apache.cactus.server.FilterTestRedirector
&lt;/filter-class&gt;
&lt;/filter&gt;

&lt;servlet&gt;
  &lt;servlet-name&gt;ServletRedirector&lt;/servlet-name&gt;
  &lt;servlet-class&gt;org.apache.cactus.server.ServletTestRedirector
&lt;/servlet-class&gt;
&lt;/servlet&gt;

&lt;servlet&gt;
  &lt;servlet-name&gt;JspRedirector&lt;/servlet-name&gt;
  &lt;jsp-file&gt;/jspRedirector.jsp&lt;/jsp-file&gt;
&lt;/servlet&gt;
    
&lt;servlet&gt;        
  &lt;servlet-name&gt;ServletTestRunner&lt;/servlet-name&gt;
  &lt;servlet-class&gt;org.apache.cactus.server.runner.ServletTestRunner
&lt;/servlet-class&gt;
  &lt;init-param&gt;
    &lt;param-name&gt;xsl-stylesheet&lt;/param-name&gt;
    &lt;param-value&gt;cactus-report.xsl&lt;/param-value&gt;
  &lt;/init-param&gt;
&lt;/servlet&gt;

&lt;filter-mapping&gt;
  &lt;filter-name&gt;FilterRedirector&lt;/filter-name&gt;
  &lt;url-pattern&gt;/FilterRedirector&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;

&lt;servlet-mapping&gt;
  &lt;servlet-name&gt;ServletRedirector&lt;/servlet-name&gt;
  &lt;url-pattern&gt;/ServletRedirector&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;

&lt;servlet-mapping&gt;
  &lt;servlet-name&gt;JspRedirector&lt;/servlet-name&gt;
  &lt;url-pattern&gt;/JspRedirector&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;

&lt;servlet-mapping&gt;        
  &lt;servlet-name&gt;ServletTestRunner&lt;/servlet-name&gt;        
  &lt;url-pattern&gt;/ServletTestRunner&lt;/url-pattern&gt;    
&lt;/servlet-mapping&gt;    </pre></li><li><b>測試servlet</b><br />接下來我們要撰寫測試案例，用來測試LoginServlet，如前面概念解說所述，beginValidUser會先被執行， client要傳給server的參數在此加入，到了server端，TestRunner會去找名稱相同的method即testValidUser來執 行，在此我們對LoginServler做驗證。程式及執行結果如下: 
<ol><li>LoginServletTest.java <pre>package tw.idv.idealist.cactus;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import org.apache.cactus.*;

public class LoginServletTest extends ServletTestCase {
	
	public void beginValidUser(WebRequest webreq) {
		webreq.addParameter("username", "steven");
		webreq.addParameter("password", "1234");
	}
	
	public void testValidUser() {
		LoginServlet login = new LoginServlet();
		assertTrue(login.isValidUser(request));
	}
}	
	</pre></li><li>執行結果<br />在瀏覽器上打入<a href="http://localhost/UnitTest/ServletTestRunner?suite=tw.idv.idealist.cactus.LoginServletTest&amp;transform=yes">http://localhost/UnitTest/ServletTestRunner?suite=tw.idv.idealist.cactus.LoginServletTest&amp;transform=yes</a> 將會呈現以下的測試結果: (UnitTest是專案名稱)<br /> <img height="478" alt="cactus04.jpg" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/cactus04.jpg" width="677" border="0" /></li></ol></li><li><b>測試JSP</b><br />所謂對JSP測試，就是對JSP所顯示出來的網頁內容做測試，由概念解說的圖可以了解，如果要知道JSP 的網頁內容應該是在client端的endXXX() method接收顯示出的來內容並做檢查。 
<ol><li>use ServletTestCase<br /><pre>package tw.idv.idealist.cactus;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import org.apache.cactus.*;

public class LoginServletTest extends ServletTestCase {
  public void beginValidUser(WebRequest webreq) {
    webreq.addParameter("username", "steven");
    webreq.addParameter("password", "1234");
  }
	
  public void testValidUser() {
    LoginServlet login = new LoginServlet();
    assertTrue(login.isValidUser(request));
  }

  public void testWelcomePage() throws ServletException, IOException {
    request.setAttribute("username", "steven");
    RequestDispatcher rd = request.getRequestDispatcher("/welcome.jsp");
    rd.forward(request, response);
  }
	
  public void endWelcomePage(WebResponse webResponse) {
    assertTrue(webResponse.getText().indexOf("Hello, steven!") &gt; 0);
  }
}				</pre></li><li>Results (I)<br />在瀏覽器上打入http://localhost/UnitTest/ServletTestRunner?suite=tw.idv.idealist.cactus.LoginServletTest&amp;transform=yes 將會呈現以下的測試結果: <img height="476" alt="cactus05.jpg" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/cactus05.jpg" width="687" border="0" /></li><li>use JspTestCase<br />另一個測試的方法是繼承JspTestCase，測試程式如下: <pre>package tw.idv.idealist.cactus;

import java.io.IOException;
import javax.servlet.ServletException;
import org.apache.cactus.*;

public class LoginPageTest extends JspTestCase {
  public void testWelcomePage() 
      throws ServletException, IOException {
    request.setAttribute("username", "steven");
    pageContext.forward("welcome.jsp");
  }
    
  public void endWelcomePage(WebResponse webResponse) {
    assertTrue(webResponse.getText().indexOf("Hello, steven!") &gt;);
  }
}		  
				</pre></li><li>Results (II)<br />在瀏覽器上打入http://localhost/UnitTest/ServletTestRunner?suite=tw.idv.idealist.cactus.LoginPageTest&amp;transform=yes 將會呈現以下的測試結果: <img height="476" alt="cactus06.jpg" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/cactus06.jpg" width="679" border="0" /></li></ol></li></ul></td>
		</tr>
		<a href="">
		</a>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/51178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-07 17:12 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/07/51178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JUnit中如何测试异常(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/06/50766.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 06 Jun 2006 06:23:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/06/50766.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/50766.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/06/50766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/50766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/50766.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="558" border="0">
				<tbody>
						<tr>
								<td valign="center" align="right" colspan="2" height="32">
										<div class="style7" align="center">
												<span style="FONT-SIZE: 12pt">
														<b>JUnit中如何测试异常</b>
												</span>
										</div>
								</td>
						</tr>
						<tr>
								<td valign="center" align="right" bgcolor="#000000" colspan="2" height="1">
								</td>
						</tr>
						<tr>
								<td valign="center" align="right" colspan="2" height="20">
										<div align="center"> </div>
								</td>
						</tr>
						<tr>
								<td valign="top" align="right" colspan="2" height="10">
								</td>
						</tr>
						<tr>
								<td valign="top" align="right" width="2%" height="10">
										<div align="left">
										</div>
								</td>
								<td valign="top" align="right" width="98%" bgcolor="#ffffff">
										<div class="daxiao14" align="left">
												<p>很多时候，我们要写一些单元测试来测试我们程序是否能正确触发异常。<br />　　比如下面的例子中，我们就写了一个test case来测试一个Email验证类EmailAddrValidator，这个类有一个doValidate(email)方法可以验证email是否合法，如果不合法则会抛出ValidationException异常。因此我们写了两个方法来进行单元测试，前一个方法testDoValidate用来测试正常值，后一个方法testDoValidateException用来测试对错误的email格式是否能正确触发异常。<br />　　这个例子的关键是方法testDoValidateException(String email) 。<br /><br />import junit.framework.TestCase;<br /><br />public class TestEmailAddrValidator extends TestCase {<br />    EmailAddrValidator validator = new EmailAddrValidator();<br /><br />    public void testDoValidate() throws ValidationException {<br />        validator.doValidate("glchengang@163.com", null);<br />        validator.doValidate("glchen.gang@163.com", null);<br />        validator.doValidate("glchen_gang@163.com", null);<br />        validator.doValidate("glchen.gang@163_tom.com", null);<br />    }<br /><br />    public void testDoValidateException() {<br />        testDoValidateException("@b.c");<br />        testDoValidateException("a@.c");<br />        testDoValidateException("a@b.");<br />        testDoValidateException("@.c");<br />        testDoValidateException("@...");<br />        testDoValidateException(" ");<br />        testDoValidateException(null);<br />    }<br /><br />    private void testDoValidateException(String email) {<br />        try {<br />            validator.doValidate(email, null);<br />            fail("末抛出异常");<br />        } catch (ValidationException e) {<br />            assertTrue(true);<br />        }<br />    }<br />}<br /><br /><br /><br />-----------------------------------------<br />注：在这里Locale 参数并没有用到。<br />import java.util.Locale;<br /><br />import com.hygensoft.common.configure.ConfigureObject;<br /><br />public class EmailAddrValidator{<br /><br />    protected static final String ERROR_CODE_INVALID_EMAIL_ADDR = "INVALID_EMAIL_ADDR";<br />    protected static final String ERROR_CODE_INVALID_INPUT = "INVALID_INPUT_OBJECT";<br /><br />    public Object doValidate(Object input, Locale locale) throws ValidationException {<br />        if (!(input instanceof String)) {<br />            throw new ValidationException(ERROR_CODE_INVALID_INPUT, input);<br />        }<br />        String inputStr = (String) input;<br />        int idx = inputStr.indexOf('@');<br />        if (idx == -1 || idx == 0) {<br />            throw new ValidationException(ERROR_CODE_INVALID_INPUT, input);<br />        }<br />        int idx2 = inputStr.indexOf('.', idx);<br />        if (idx2 == -1 || idx2 == idx + 1) {<br />            throw new ValidationException(ERROR_CODE_INVALID_INPUT, input);<br />        }<br />        if (inputStr.endsWith(".")) {<br />            throw new ValidationException(ERROR_CODE_INVALID_INPUT, input);<br />        }<br />        return input;<br />    }<br /><br />    /* (non-Javadoc)<br />     * @see com.hygensoft.common.configure.Configurable#initialize(com.hygensoft.common.configure.ConfigureObject)<br />     */<br />    public void initialize(ConfigureObject conf) {}<br /><br />}</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/50766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-06 14:23 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/06/50766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java开源测试工具汇总(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/06/50765.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 06 Jun 2006 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/06/50765.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/50765.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/06/50765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/50765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/50765.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="558" border="0">
				<tbody>
						<tr>
								<td valign="center" align="right" colspan="2" height="32">
										<div class="style7" align="center">
												<span style="FONT-SIZE: 12pt">
														<b>Java开源测试工具汇总</b>
												</span>
										</div>
								</td>
						</tr>
						<tr>
								<td valign="center" align="right" bgcolor="#000000" colspan="2" height="1">
								</td>
						</tr>
						<tr>
								<td valign="center" align="right" colspan="2" height="20">
										<div align="center">文章出处：转载 作者：不详 发布时间：2006-01-19</div>
								</td>
						</tr>
						<tr>
								<td valign="top" align="right" colspan="2" height="10">
								</td>
						</tr>
						<tr>
								<td valign="top" align="right" width="2%" height="10">
										<div align="left">
										</div>
								</td>
								<td valign="top" align="right" width="98%" bgcolor="#ffffff">
										<div class="daxiao14" align="left">JUnit   <br />JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架（regression testing framework）。Junit测试是程序员测试，即所谓白盒测试，因为程序员知道被测试的软件如何（How）完成功能和完成什么样（What）的功能。Junit是一套框架，继承TestCase类，就可以用Junit进行自动测试了。 <br /><br /><a href="http://www.junit.org/" target="_blank"><font color="#003366" size="2">http://www.junit.org/</font></a><br /><br />Cactus   <br />Cactus是一个基于JUnit框架的简单测试框架，用来单元测试服务端Java代码。Cactus框架的主要目标是能够单元测试服务端的使用Servlet对象的Java方法如HttpServletRequest,HttpServletResponse,HttpSession等<br /><br /><a href="http://jakarta.apache.org/cactus/" target="_blank"><font color="#003366" size="2">http://jakarta.apache.org/cactus/</font></a><br /><br />Abbot   <br />Abbot是一个用来测试Java GUIs的框架。用简单的基于XML的脚本或者Java代码，你就可以开始一个GUI。<br /><br /><a href="http://abbot.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://abbot.sourceforge.net/</font></a><br /><br />JUnitPerf   <br />Junitperf实际是junit的一个decorator，通过编写用于junitperf的单元测试，我们也可使测试过程自动化。<br /><br /><a href="http://www.clarkware.com/software/JUnitPerf.html" target="_blank"><font color="#003366" size="2">http://www.clarkware.com/software/JUnitPerf.html</font></a><br /><br />DbUnit   <br />DbUnit是为数据库驱动的项目提供的一个对JUnit 的扩展，除了提供一些常用功能，它可以将你的数据库置于一个测试轮回之间的状态。 <br /><br /><a href="http://dbunit.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://dbunit.sourceforge.net/</font></a><br /><br />Mockrunner   <br />Mockrunner用在J2EE环境中进行应用程序的单元测试。它不仅支持Struts actions, servlets，过滤器和标签类还包括一个JDBC和一个JMS测试框架，可以用于测试基于EJB的应用程序。<br /><br /><a href="http://mockrunner.sourceforge.net/index.html" target="_blank"><font color="#003366" size="2">http://mockrunner.sourceforge.net/index.html</font></a><br /><br />DBMonster   <br />DBMonster是一个用生成随机数据来测试SQL数据库的压力测试工具。<br /><br /><a href="http://dbmonster.kernelpanic.pl/" target="_blank"><font color="#003366" size="2">http://dbmonster.kernelpanic.pl/</font></a><br /><br />MockEJB   <br />MockEJB是一个不需要EJB容器就能运行EJB并进行测试的轻量级框架。<br /><br /><a href="http://mockejb.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://mockejb.sourceforge.net/</font></a><br /><br />StrutsTestCase   <br />StrutsTestCase 是Junit TestCase类的扩展，提供基于Struts框架的代码测试。StrutsTestCase同时提供Mock 对象方法和Cactus方法用来实际运行Struts ActionServlet，你可以通过运行servlet引擎来测试。因为StrutsTestCase使用ActionServlet控制器来测试你的代码，因此你不仅可以测试Action对象的实现，而且可以测试mappings，from beans以及forwards声明。StrutsTestCase不启动servlet容器来测试struts应用程序（容器外测试）也属于Mock对象测试，但是与EasyMock不同的是，EasyMock是提供了创建Mock对象的API，而StrutsTest则是专门负责测试Struts应用程序的Mock对象测试框架。 <br /><br /><a href="http://strutstestcase.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://strutstestcase.sourceforge.net/</font></a><br /><br />JFCUnit   <br />JFCUnit使得你能够为Java偏移应用程序编写测试例子。它为从用代码打开的窗口上获得句柄提供了支持；为在一个部件层次定位部件提供支持；为在部件中发起事件（例如按一个按钮）以及以线程安全方式处理部件测试提供支持。<br /><br /><a href="http://jfcunit.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://jfcunit.sourceforge.net/</font></a><br /><br />JTestCase   <br />JTestCase 使用XML文件来组织多测试案例数据，声明条件（操作和期望的结果），提供了一套易于使用的方法来检索XML中的测试案例，按照数据文件的定义来声明结果。<br /><br /><a href="http://jtestcase.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://jtestcase.sourceforge.net/</font></a><br /><br />SQLUnit   <br />SQLUnit是一个单元测试框架，用于对数据库存储过程进行回归测试。用 Java/JUnit/XML开发。 <br /><br /><a href="http://sqlunit.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://sqlunit.sourceforge.net</font></a><br /><br />JTR   <br />JTR (Java Test Runner)是一个开源的基于反转控制(IOC)的J2EE测试框架。它允许你构建复杂的J2EE测试套件(Test Suites)并连到应用服务器执行测试,可以包括多个测试实例。JTR的licensed是GPL协议。<br /><br /><a href="http://jtrunner.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://jtrunner.sourceforge.net/</font></a><br /><br />Marathon   <br />Marathon是一个针对使用Java/Swing开发GUI应用程序的测试框架，它由recorder, runner 和 editor组成，测试脚本是python代码。Marathon的焦点是放在最终用户的测试上。<br /><br /><a href="http://marathonman.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://marathonman.sourceforge.net</font></a><br /><br />TestNG   <br />TestNG是根据JUnit 和 NUnit思想而构建的一个测试框架，但是TestNG增加了许多新的功能使得它变得更加强大与容易使用比如：<br />*支持JSR 175注释（JDK 1.4利用JavaDoc注释同样也支持）<br />*灵活的Test配置<br />*支持默认的runtime和logging JDK功能<br />*强大的执行模型（不再TestSuite）<br />*支持独立的测试方法。<br /><br /><a href="http://testng.org/" target="_blank"><font color="#003366" size="2">http://testng.org/</font></a><br /><br />Surrogate Test framework   <br />Surrogate Test framework是一个值得称赞单元测试框架，特别适合于大型，复杂Java系统的单元测试。这个框架能与JUnit,MockEJB和各种支持模拟对象（mock object ）的测试工具无缝给合。这个框架基于AspectJ技术。<br /><a href="http://surrogate.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://surrogate.sourceforge.net</font></a><br /><br />MockCreator   <br />MockCreator可以为给定的interface或class生成模拟对象（Mock object）的源码。<br /><br /><a href="http://mockcreator.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://mockcreator.sourceforge.net/</font></a><br /><br />jMock   <br />jMock利用mock objects思想来对Java code进行测试。jMock具有以下特点:容易扩展，让你快速简单地定义mock objects,因此不必打破程序间的关联，让你定义灵活的超越对象之间交互作用而带来测试局限，减少你测试地脆弱性。<br /><br /><a href="http://www.jmock.org/" target="_blank"><font color="#003366" size="2">http://www.jmock.org/</font></a><br /><br />EasyMock   <br />EasyMock为Mock Objects提供接口并在JUnit测试中利用Java的proxy设计模式生成它们的实例。EasyMock最适合于测试驱动开发。<br /><br /><a href="http://www.easymock.org/" target="_blank"><font color="#003366" size="2">http://www.easymock.org/</font></a><br /><br />The Grinder   <br />The Grinder是一个负载测试框架。在BSD开源协议下免费使用。<br /><br /><a href="http://grinder.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://grinder.sourceforge.net/</font></a><br /><br />XMLUnit   <br />XMLUnit不仅有Java版本的还有.Net版本的。Java开发的XMLUnit提供了两个JUnit 扩展类XMLAssert和XMLTestCase,和一组支持的类。这些类可以用来比较两张XML之间的不同之处，展示XML利用XSLT来,校验XML,求得XPath表达式在XML中的值,遍历XML中的某一节点利DOM展开,<br /><br /><a href="http://xmlunit.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://xmlunit.sourceforge.net/</font></a><br /><br />Jameleon   <br />Jameleon一个自动化测试工具。它被用来测试各种各样的应用程序，所以它被设计成插件模式。为了使整个测试过程变得简单Jameleon提供了一个GUI,因此Jameleon实现了一个Swing 插件。<br /><br /><a href="http://jameleon.sourceforge.net/index.html" target="_blank"><font color="#003366" size="2">http://jameleon.sourceforge.net/index.html</font></a><br /><br />J2MEUnit   <br />J2MEUnit是应用在J2ME应用程序的一个单元测试框架。它基于JUnit.<br /><br /><a href="http://j2meunit.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://j2meunit.sourceforge.net/</font></a><br /><br />Jetif   <br />Jetif是一个用纯Java实现的回归测试框架。它为Java程序单元测试以及功能测试提供了一个简单而且可 伸缩的架构，可以用于个人开发或企业级开发的测试。它容易使用，功能强大，而且拥有一些企业级测试的重要功能。Jetif来源于JUnit, JTestCase以及TestNG的启发，有几个基本的概念直接来自于JUnit， 比如说断言机制，Test Listener的概念，因此从JUnit转到Jetif是非常容易的。<br /><a href="http://jetif.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://jetif.sourceforge.net/</font></a><br /><br />GroboUtils   <br />GroboUtils使得扩展Java测试变得可能。它包括用在Java不同方面测试的多个子项目。在GroboUtils中最常被到的工具是:多线程测试(multi-threaded tests),整体单元测试(hierarchial unit tests),代码覆盖工具(code coverage tool)。<br /><a href="http://groboutils.sourceforge.net/" target="_blank"><font color="#003366" size="2">http://groboutils.sourceforge.net/</font></a><br /><br />Testare   <br />TESTARE是用来简化分布式应用程序(比如:在SERVLETS,JMS listeners, CORBA ORBs或RMI环境下)测试开发过程的一个测试框架.<br /><a href="https://testare.dev.java.net/" target="_blank"><font color="#003366" size="2">https://testare.dev.java.net/</font></a><br /></div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/50765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-06 14:20 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/06/50765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>