﻿<?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-cerulean-随笔分类-Testing Related</title><link>http://www.blogjava.net/cerulean/category/20116.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 19 Oct 2007 09:51:10 GMT</lastBuildDate><pubDate>Fri, 19 Oct 2007 09:51:10 GMT</pubDate><ttl>60</ttl><item><title>哪里要测？用什么测？</title><link>http://www.blogjava.net/cerulean/archive/2007/03/20/105097.html</link><dc:creator>cerulean</dc:creator><author>cerulean</author><pubDate>Tue, 20 Mar 2007 13:17:00 GMT</pubDate><guid>http://www.blogjava.net/cerulean/archive/2007/03/20/105097.html</guid><wfw:comment>http://www.blogjava.net/cerulean/comments/105097.html</wfw:comment><comments>http://www.blogjava.net/cerulean/archive/2007/03/20/105097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cerulean/comments/commentRss/105097.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cerulean/services/trackbacks/105097.html</trackback:ping><description><![CDATA[
		<p>DAO层： JUnit test,需要用dbunit恢复现场; <br />service层：JUnit test,需要用dbunit恢复现场,逻辑更重要些,分支覆盖更重要些; <br />action：不做测试; <br />selenium：做集成测试。<br />    尽管有人认为struts action不需要做测试，不过无意中看到strutsTestCase这个东东,还没有试,用途是测试struts的action.觉得比较有用.<br />    尤其是,如果web页面交由第三方来做的话,那么单独对action进行测试就是十分有必要的.<br />    但是,如果整个web系统从前台到后台都是一个team来做,那么个人认为还不如跟页面一起集成测,毕竟这是真实情况,而且从页面上可视性更强,更容易发现问题.与此同时,使用脚本录制回放测试工具(还没有试过)提高效率.</p>
<img src ="http://www.blogjava.net/cerulean/aggbug/105097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cerulean/" target="_blank">cerulean</a> 2007-03-20 21:17 <a href="http://www.blogjava.net/cerulean/archive/2007/03/20/105097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>试验JMock</title><link>http://www.blogjava.net/cerulean/archive/2007/03/20/105094.html</link><dc:creator>cerulean</dc:creator><author>cerulean</author><pubDate>Tue, 20 Mar 2007 13:05:00 GMT</pubDate><guid>http://www.blogjava.net/cerulean/archive/2007/03/20/105094.html</guid><wfw:comment>http://www.blogjava.net/cerulean/comments/105094.html</wfw:comment><comments>http://www.blogjava.net/cerulean/archive/2007/03/20/105094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cerulean/comments/commentRss/105094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cerulean/services/trackbacks/105094.html</trackback:ping><description><![CDATA[
		<p>“jMock利用mock objects思想来对Java code进行测试。jMock具有以下特点:容易扩展，让你快速简单地定义mock objects,因此不必打破程序间的关联，你定义灵活的超越对象之间交互作用而带来测试局限，减少你测试地脆弱性。”<br /><br />    跟JMock功能类似的还有EasyMock。<br />    简单试验后的感觉没有试验DBUnit后的感觉强烈,试了DBUnit的感觉是这东西以后一定要用.<br />    但个人认为mock object这种东西能不用就不用,模拟来模拟去,最后还是要和真东西联调,所以mock的阶段应该是尽可能的短才是.<br /><br /><strong>使用模仿对象进行测试的常用编码样式是：</strong><br />· 创建模仿对象的实例 <br />· 设置模仿对象中的状态和期望值 <br />· 将模仿对象作为参数来调用域代码 <br />· 验证模仿对象中的一致性</p>
		<p>
				<strong>代码中的大概过程：<br /></strong>     Mock mock = new Mock(**.class);//构造一个那个类的mock对象，把这个类传入Mock<br />     使用mock.expects方法，来设置想要执行的操作：执行几次、执行哪个方法、传什么参、返回什么值<br />     获得那个mock对象：** x = (**)mock.proxy();//proxy方法返回代理类实例，即虚拟对象实例<br />     然后run **.class的那个方法（call methods on the mock object, expectation on it will deliver the result set up by yourself）<br /><br />     写mock-object 测试，需要有独立的接口作为mock的对象(从而促进了针对接口编程的习惯)，还有个好的副作用：他迫使你来重写一些代码。实际上，代码常常写的不好。你让类和环境之间产生了不必要的耦合。</p>
<img src ="http://www.blogjava.net/cerulean/aggbug/105094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cerulean/" target="_blank">cerulean</a> 2007-03-20 21:05 <a href="http://www.blogjava.net/cerulean/archive/2007/03/20/105094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DBUnit的使用</title><link>http://www.blogjava.net/cerulean/archive/2007/03/20/105093.html</link><dc:creator>cerulean</dc:creator><author>cerulean</author><pubDate>Tue, 20 Mar 2007 12:59:00 GMT</pubDate><guid>http://www.blogjava.net/cerulean/archive/2007/03/20/105093.html</guid><wfw:comment>http://www.blogjava.net/cerulean/comments/105093.html</wfw:comment><comments>http://www.blogjava.net/cerulean/archive/2007/03/20/105093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cerulean/comments/commentRss/105093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cerulean/services/trackbacks/105093.html</trackback:ping><description><![CDATA[
		<p>DBUnit扩展自JUnit.在使用DBUnit之前,为了验证自己编写的涉及数据库操作方法的正确性,每次都要执行一个简单的sql脚本,灌些数据,然后人眼观察着数据表中的数据.然后,代码执行完毕后,再次观察数据变化情况.久而久之,表里面的数据就变得杂乱,一般会全部删除,重新来过.<br />    DBUnit的目标正是保证数据库数据环境的稳定性,具备将数据库中数据与xml文件之间双向转换的能力.<br />试验了一下,<br /><br />首先,下载dbunit的jar包,加入工程即可.<br /><strong>1.从xml中将数据导入数据库表</strong><br />tc不再继承自TestCase,而是继承DatabaseTestCase<br />覆盖几个方法,包括获得xml文件内容,获得DB连接,以及在setup方法和teardown方法中调用提供的dbunit操作类型,构建数据库内数据环境.</p>
		<p>这时,我以为如果只有几个简单的数据,写xml固然简单,但想测试大数据量时(虽然UT主要是测试功能而非性能,但是大数据量也方便验证)就有点问题,好在是双向的,可以先把数据用function灌入数据库,再导进xml里面:<br /><br /><strong>2.从数据库表数据导入xml文件</strong><br />    用ant+DBUnit来完成这个任务非常方便!</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">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">target </span>
				<span style="COLOR: #ff0000">name</span>
				<span style="COLOR: #0000ff">="export"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">taskdef </span>
				<span style="COLOR: #ff0000">name</span>
				<span style="COLOR: #0000ff">="dbunit"</span>
				<span style="COLOR: #ff0000"> classname</span>
				<span style="COLOR: #0000ff">="org.dbunit.ant.DbUnitTask"</span>
				<span style="COLOR: #ff0000"> classpathref</span>
				<span style="COLOR: #0000ff">="compile.path"</span>
				<span style="COLOR: #ff0000"> </span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">dbunit </span>
				<span style="COLOR: #ff0000">driver</span>
				<span style="COLOR: #0000ff">="com.mysql.jdbc.Driver"</span>
				<span style="COLOR: #ff0000"> url</span>
				<span style="COLOR: #0000ff">="jdbc:mysql://127.0.0.1:3306/mydb"</span>
				<span style="COLOR: #ff0000"> userid</span>
				<span style="COLOR: #0000ff">="root"</span>
				<span style="COLOR: #ff0000"> password</span>
				<span style="COLOR: #0000ff">="root"</span>
				<span style="COLOR: #ff0000"> supportBatchStatement</span>
				<span style="COLOR: #0000ff">="true"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">export </span>
				<span style="COLOR: #ff0000">dest</span>
				<span style="COLOR: #0000ff">="${test.srcpath}/export.xml"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">                <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">query </span>
				<span style="COLOR: #ff0000">name</span>
				<span style="COLOR: #0000ff">="test_table"</span>
				<span style="COLOR: #ff0000"> sql</span>
				<span style="COLOR: #0000ff">="SELECT * FROM test_table"</span>
				<span style="COLOR: #ff0000"> </span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">table </span>
				<span style="COLOR: #ff0000">name</span>
				<span style="COLOR: #0000ff">="user_table"</span>
				<span style="COLOR: #ff0000"> </span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">export</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">dbunit</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">target</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p>
				<br />    疑问,看到有人说DBUnit在清除数据时,有时不能彻底,原因是分析不出来外键等表之间的约束.因为在试验中采用的数据库里没啥表之间的约束,所以还没有体会到.<br /><br />    DatabaseTestCase类提供了两个方法来控制测试前和测试后的数据库状态：getSetUpOperation() 和 getTearDownOperation().       <br />    一种高效的实施方案就是让getSetUpOperation()方法执行REFRESH操作，通过这个操作,我们可以用种子文件中的数据去更新目标数据库里的数据。<br />    接下来，就是getTearDownOperation()，让他去执行一个NONE操作，也就是什么也不执行<br />    常用操作：<br />    DatabaseOperation.CLEAN_INSERT; 先删除表中所有，再插入准备的数据<br />    DatabaseOperation.REFRESH; 使用准备数据更新表，存在则update，不存在则insert<br />    DatabaseOperation.DELETE;  只删除准备的数据<br />    DatabaseOperation.NONE;  啥都不做</p>
<img src ="http://www.blogjava.net/cerulean/aggbug/105093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cerulean/" target="_blank">cerulean</a> 2007-03-20 20:59 <a href="http://www.blogjava.net/cerulean/archive/2007/03/20/105093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Integrate Testlink with Mantis</title><link>http://www.blogjava.net/cerulean/archive/2007/03/11/103156.html</link><dc:creator>cerulean</dc:creator><author>cerulean</author><pubDate>Sun, 11 Mar 2007 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/cerulean/archive/2007/03/11/103156.html</guid><wfw:comment>http://www.blogjava.net/cerulean/comments/103156.html</wfw:comment><comments>http://www.blogjava.net/cerulean/archive/2007/03/11/103156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cerulean/comments/commentRss/103156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cerulean/services/trackbacks/103156.html</trackback:ping><description><![CDATA[
		<p>
				<strong>前提:</strong>testlink已经跟mantis安装在同一个环境下<br /><strong>步骤:</strong><br />参照<a href="http://crystaliris.bokee.com/5588155.html">http://crystaliris.bokee.com/5588155.html</a>，testlink网站也给出了比较清楚的文档说明。<br />1.修改testlink关于interface的配置为"MANTIS"，如果用别的BTS(Bug Trace System)，有其他的对应值。<br />2.修改testlink目录下cfg/mantis.cfg.php（如果用别的BTS，修改其他对应目录下的配置），配置一些关于mantis的数据库和url属性。<br />3.修改mantis的配置文件,打开匿名登录,由于匿名登录的用户名需要是一个已经存在的真实用户,而我又没在mantis上创建新的用户,所以就填写成administrator了。</p>
<img src ="http://www.blogjava.net/cerulean/aggbug/103156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cerulean/" target="_blank">cerulean</a> 2007-03-11 21:33 <a href="http://www.blogjava.net/cerulean/archive/2007/03/11/103156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>scarab</title><link>http://www.blogjava.net/cerulean/archive/2007/03/06/102272.html</link><dc:creator>cerulean</dc:creator><author>cerulean</author><pubDate>Tue, 06 Mar 2007 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/cerulean/archive/2007/03/06/102272.html</guid><wfw:comment>http://www.blogjava.net/cerulean/comments/102272.html</wfw:comment><comments>http://www.blogjava.net/cerulean/archive/2007/03/06/102272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cerulean/comments/commentRss/102272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cerulean/services/trackbacks/102272.html</trackback:ping><description><![CDATA[
		<p>环境：windows<br />下载scarab-1.0-b20.zip,直接解压即可.<br />需要JDK,Ant(或者maven,scarab推荐maven),DB(推荐MySQL)<br />在解压后的\scarab-1.0-b20目录中,创建build.properties,以指定数据库连接的参数.</p>
		<p>例如:<br />scarab.database.type=mysql<br />scarab.database.name=scarab<br />scarab.database.jdbc.driver=org.gjt.mm.mysql.Driver<br />scarab.database.host=localhost<br />scarab.database.port=3306<br />scarab.database.username=root<br />scarab.database.password=root<br />scarab.database.admin.username=${scarab.database.username}<br />scarab.database.admin.password=${scarab.database.password}<br /><br />#发送邮件的邮件服务器也可以写在这里<br />system.mail.host=smtp.126.com<br /><br />数据库方面,本来想使用postgreSQL,结果发现对于scarab来说配置比较特殊,于是就装了MySQL[见MySQL的那篇文吧].<br />数据库配置写好以后,进入\scarab-1.0-b20\build\目录,运行ant,就对scarab进行构建啦,能够看到BUILD SUCCESSFULLY就成功啦!!<br />感觉scarab可以配置的地方很多很多,不过配置修改后还是需要重新build的.之前遇到过的错误就是在写好数据库配置后没有重新build造成的.<br /><br />构建成功后,就可以使用啦: 进入\scarab-1.0-b20\tomcat\bin目录,运行startup.bat,tomcat就启动起来了,访问<a href="http://localhost:8080/scarab/">http://localhost:8080/scarab/</a>就可以啦。<br /><br />因为很多功能都需要发邮件来协助,所以要使用SMTP服务器,比方说smtp.126.com,user=realuser,password=realuserpassword<br /><br />总得来说，觉得scarab界面不是很友好，也不是很美观。<br />由于一开始邮件服务器不能用，所以直接到数据库中update用户的状态为CONFIRMED。这样子成功登录后，点击“申请新角色”时，竟然抛出错误了，不知道是什么原因，无法继续了，挺郁闷的。</p>
<img src ="http://www.blogjava.net/cerulean/aggbug/102272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cerulean/" target="_blank">cerulean</a> 2007-03-06 22:11 <a href="http://www.blogjava.net/cerulean/archive/2007/03/06/102272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse插件coverlipse</title><link>http://www.blogjava.net/cerulean/archive/2007/02/17/100113.html</link><dc:creator>cerulean</dc:creator><author>cerulean</author><pubDate>Sat, 17 Feb 2007 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/cerulean/archive/2007/02/17/100113.html</guid><wfw:comment>http://www.blogjava.net/cerulean/comments/100113.html</wfw:comment><comments>http://www.blogjava.net/cerulean/archive/2007/02/17/100113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cerulean/comments/commentRss/100113.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cerulean/services/trackbacks/100113.html</trackback:ping><description><![CDATA[
		<p>
				<strong>coverlipse：</strong>[喜欢这种coverlipse,subclipse的插件名字，简单明了]<br /><br /><strong>功能：</strong>负责显示JUnit测试的代码覆盖率。<br /><br /><strong>安装：</strong><a href="http://coverlipse.sourceforge.net/index.php">http://coverlipse.sourceforge.net/index.php</a> 下载了coverlipse-0.9.5.3.zip，直接解压到eclipse目录中的相关文件夹(feature/plugin)。<br /><br /><strong>使用：</strong>选择run as JUnit w/Coverlipse即可，也就是运行了JUnit<br />然后show view中，可以选择:<br />Coverlipse Markers View    看测试的覆盖率(行级的)<br />Coverlipse Class View         可以看到包级/类级的覆盖百分比<br /><br />通过使用这个简单的小插件，可以看到JUnit对测试类、以及被测试类的覆盖率，不过比较怀疑在开发过程中能不能真正用起来，毕竟写出完善的UT case的情况还是很少的，可能不能对每一行代码都覆盖到。不过，对于一些重要业务逻辑处理的方法，用coverlipse来看test case对逻辑代码中分支的测试覆盖率还是比较有用的吧。<br /><br /><br />注：eclipse-&gt;window-&gt;customize perspective可以看到一些已经安装的插件。</p> <img src ="http://www.blogjava.net/cerulean/aggbug/100113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cerulean/" target="_blank">cerulean</a> 2007-02-17 14:18 <a href="http://www.blogjava.net/cerulean/archive/2007/02/17/100113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>