﻿<?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;font color="red"&gt;love fish&lt;/font&gt;&lt;font color="lightgreen"&gt;大鹏一曰同风起，扶摇直上九万里&lt;/font&gt;-随笔分类-Testing</title><link>http://www.blogjava.net/liaojiyong/category/19328.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 19 Nov 2009 14:24:08 GMT</lastBuildDate><pubDate>Thu, 19 Nov 2009 14:24:08 GMT</pubDate><ttl>60</ttl><item><title>loadrunner 9.5 破解 注册码</title><link>http://www.blogjava.net/liaojiyong/archive/2009/11/17/302626.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 17 Nov 2009 01:01:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2009/11/17/302626.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/302626.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2009/11/17/302626.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/302626.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/302626.html</trackback:ping><description><![CDATA[golba-1000：AEACFSJI-YASEKJJKEAHJD-BCLBR
<img src ="http://www.blogjava.net/liaojiyong/aggbug/302626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2009-11-17 09:01 <a href="http://www.blogjava.net/liaojiyong/archive/2009/11/17/302626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>华为测试流程（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/28/120496.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 28 May 2007 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/28/120496.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/120496.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/28/120496.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/120496.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/120496.html</trackback:ping><description><![CDATA[<p>不知不觉做华为外包项目已一年多了，曾在华为常驻过，也曾负责过项目的测试，感觉对华为外包项目的测试流程较熟悉，故写些心得来与大家分享。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果竞标成功，项目就开始要启动了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 华为方会提供一份CRS(客户需求)和SOW（工作任务书），华为方派人过来进行需求培训，这时该项目的测试组长也要参与到项目需求的培训和评审，也就是测试工作应该从需求开始介入。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目经理编写《项目计划》，开发人员产出《SRS》，这时测试组长就要根据SOW开始编写《测试计划》，其中包括人员，软件硬件资源，测试点，集成顺序，进度安排和风险识别等内容。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 《测试计划》编写完成后需要进行评审，参与人员有项目经理，测试经理和华为方人员，测试组长需要根据评审意见修改《测试计划》，并上传到VSS上，由配置管理员管理。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 待开发人员把《SRS》归纳好并打了基线，测试组长开始组织测试成员编写《测试方案》，测试方案要求根据《SRS》上的每个需求点设计出包括需求点简介，测试思路和详细测试方法三部分的方案。《测试方案》编写完成后也需要进行评审，评审人员包括项目经理，开发人员，测试经理，测试组长，测试成员和华为方；如果华为方不在公司，就需要测试组长把《测试方案》发送给华为进行评审，并返回评审结果。测试组长组织测试成员修改测试方案，直到华为方评审通过后才进入下个阶段――编写测试用例。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 测试用例是根据《测试方案》来编写的，通过《测试方案》阶段，测试人员对整个系统需求有了详细的理解。这时开始编写用例才能保证用例的可执行和对需求的覆盖。测试用例需要包括测试项，用例级别，预置条件，操作步骤和预期结果。其中操作步骤和预期结果需要编写详细和明确。测试用例应该覆盖测试方案，而测试方案又覆盖了测试需求点，这样才能保证客户需求不遗漏。同样，测试用例也需要通过开发人员，测试人员和华为方的评审，测试组长也需要组织测试人员对测试用例进行修改，直到华为方评审通过。</p>
<p>　　在我们编写测试用例的阶段，开发人员基本完成代码的编写，同时完成单元测试。华为的外包项目一般是一次性集成，所以软件转测试部后直接进行系统测试。测试部对刚转过来的测试版本进行预测试，如果软件未实现CheckList清单上的10％，测试部会把该版本打回。否则，软件转测试部进行系统测试。根据《测试计划》进度安排，测试组长进行多轮次的测试，每轮测试完成后测试组长需要编写测试报告，其中包括用例执行通过情况，缺陷分布情况，缺陷产生原因，测试中的风险等等，这时测试人员就修改增加测试用例。待到开发修改完bug并转来新的测试版本，测试部开始进行第二轮的系统测试，首先回归完问题单，再继续进行测试，编写第二轮的测试报告，如此循环下去，直到系统测试结束。在系统测试期间，测试人员还需要编写验收手册，验收用例和资料测试用例等。</p>
<p>　　完成系统测试后，软件就开始转到华为进行验收测试，其中大概测试半个月，一般会要求测试部派人到华为方进行协助测试，并发回问题单给公司开发人员修改。</p>
<p>　　如果验收发现的缺陷率在SOW规定的范围内，那么验收成功，华为方付钱给公司，项目结束。如果超过规定的缺陷率，那么公司可能要罚钱了，整个项目组的成员（包括开发和测试）都可能要罚了。这种情况也会有，如果按照流程做事，概率不会很大。</p>
<p>　　测试流程的规范是很重要的，但是如果要成为优秀的测试人员只知道流程还是不够的，需要学习的东西还很多，包括熟悉相关测试业务，计算机专业知识（linux，oracle，tcp/ip等），开发的架构和语言，性能测试和系统瓶颈分析、调优等。还有性格（细心，耐心）和人际沟通能力也是很重要的决定条件。任重而道远，我刚起步，希望大家一起在测试的路上互励互勉。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/120496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-28 16:02 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/28/120496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的WEB功能测试方法（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/14/99807.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 14 Feb 2007 05:43:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/14/99807.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/99807.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/14/99807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/99807.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/99807.html</trackback:ping><description><![CDATA[功能测试就是对产品的各功能进行验证，根据功能测试用例，逐项测试，检查产品是否达到用户要求的功能。常用的测试方法如下： 
<p class="main">　　1. 页面链接检查：每一个链接是否都有对应的页面，并且页面之间切换正确。 </p><p class="main">　　2. 相关性检查：删除/增加一项会不会对其他项产生影响，如果产生影响，这些影响是否都正确。 </p><p class="main">　　3. 检查按钮的功能是否正确：如update, cancel, delete, save等功能是否正确。 </p><p class="main">　　4. 字符串长度检查: 输入超出需求所说明的字符串长度的内容, 看系统是否检查字符串长度,会不会出错. </p><p class="main">　　5. 字符类型检查: 在应该输入指定类型的内容的地方输入其他类型的内容(如在应该输入整型的地方输入其他字符类型),看系统是否检查字符类型,会否报错. </p><p class="main">　　6. 标点符号检查: 输入内容包括各种标点符号,特别是空格,各种引号,回车键.看系统处理是否正确. </p><p class="main">　　7. 中文字符处理: 在可以输入中文的系统输入中文,看会否出现乱码或出错. </p><p class="main">　　8. 检查带出信息的完整性: 在查看信息和update信息时,查看所填写的信息是不是全部带出.,带出信息和添加的是否一致 </p><p class="main">　　9. 信息重复: 在一些需要命名,且名字应该唯一的信息输入重复的名字或ID,看系统有没有处理,会否报错,重名包括是否区分大小写,以及在输入内容的前后输入空格,系统是否作出正确处理.</p><p class="main">　　10. 检查删除功能:在一些可以一次删除多个信息的地方,不选择任何信息,按”delete”,看系统如何处理,会否出错;然后选择一个和多个信息,进行删除,看是否正确处理. </p><p class="main">　　11. 检查添加和修改是否一致: 检查添加和修改信息的要求是否一致,例如添加要求必填的项,修改也应该必填;添加规定为整型的项,修改也必须为整型. </p><p class="main">　　12. 检查修改重名:修改时把不能重名的项改为已存在的内容,看会否处理,报错.同时,也要注意,会不会报和自己重名的错. </p><p class="main">　　13. 重复提交表单：一条已经成功提交的纪录，back后再提交，看看系统是否做了处理。 </p><p class="main">　　14. 检查多次使用back键的情况: 在有back的地方,back,回到原来页面,再back,重复多次,看会否出错. </p><p class="main">　　15. search检查: 在有search功能的地方输入系统存在和不存在的内容,看search结果是否正确.如果可以输入多个search条件,可以同时添加合理和不合理的条件,看系统处理是否正确. </p><p class="main">　　16. 输入信息位置: 注意在光标停留的地方输入信息时,光标和所输入的信息会否跳到别的地方. </p><p class="main">　　17. 上传下载文件检查：上传下载文件的功能是否实现，上传文件是否能打开。对上传文件的格式有何规定，系统是否有解释信息，并检查系统是否能够做到。 </p><p class="main">　　18. 必填项检查：应该填写的项没有填写时系统是否都做了处理，对必填项是否有提示信息，如在必填项前加* </p><p class="main">　　19. 快捷键检查：是否支持常用快捷键，如Ctrl+C Ctrl+V Backspace等，对一些不允许输入信息的字段，如选人，选日期对快捷方式是否也做了限制。 </p><p class="main">　　20. 回车键检查: 在输入结束后直接按回车键,看系统处理如何,会否报错. </p><img src ="http://www.blogjava.net/liaojiyong/aggbug/99807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-14 13:43 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/14/99807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读 TDD 的总结 </title><link>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94684.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 18 Jan 2007 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94684.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/94684.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/94684.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/94684.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">读</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt">TDD</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的总结</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 14pt">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<pre style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; tab-stops: 27.6pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt">
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">读完<span lang="EN-US">TDD</span>（测试驱动开发），发现其中主要就是在反复说了这么两件事情（也就是两个简单的规则）：一、在写任何代码之前，写一个会失败的自动测试程序，即单元测试；二、消除重复设计，优化设计结构，即重构。整本书都围绕着这两个规则来进行说明，告诉读者到底要如何这样做？又如何分阶段应用这些规则？这两条简单的规则可以运用多深？<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<pre style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-SIZE: 10.5pt">
						<font face="宋体">第一部分通过一个简单的实例来告诉读者如何使用<span lang="EN-US">TDD</span>，如何反复通过<span lang="EN-US">“</span>不可运行<span lang="EN-US">/</span>可运行<span lang="EN-US">/</span>重构<span lang="EN-US">/</span>不可运行<span lang="EN-US">/</span>可运行<span lang="EN-US">/</span>重构<span lang="EN-US">”</span>来进行开发；第二部分告诉读者如何使用单元测试，怎样组织单元测试；第三部分则是将<span lang="EN-US">TDD</span>分解成较小的步骤来进行详细说明，根据我对本书的理解，我认为需要完全将<span lang="EN-US">TDD</span>运用到日常的开发行为中，则要按照以下非常细小的步骤进行：<span lang="EN-US"><o:p></o:p></span></font>
				</span>
		</pre>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">1.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">获得任务。即项目经理安排的任务。任务往往不止一项。将它们写入周工作计划表或者月工作计划表。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">2.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">选择任务。每天开始工作之前，将今天将要解决的问题写入工作计划列表。并选择自己最有把握完成的任务作为当前任务。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">3.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">分析并分解任务。将当前任务分解成一个个相对简单的问题，分解的问题最好是能在十多分钟之内能完成，并将它们写入工作列表。如：若要实现多币种相加，则可以分解为：实现相同币种之间的相加，不同币种之间的互换，最后才能实现不同币种之间的相加。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">4.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">写测试列表。将分解后的问题所对应的测试写入测试列表。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">5.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">选择测试。从测试列表中选择自己认为最有把握实现的一项。如：“同币种相加”对我来说是最有把握实现的一项，因此我最先来实现它，即先从它的测试程序开始编写。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">6.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">编写测试数据。写一个容易让人理解的必须实现的测试数据列表，尽量使用显然数据。如：用</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">String</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">表示</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">IP</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">地址</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">"255.255.255.255"</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">转换为</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">int</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，在我们写测试数据时应这样写：</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">(255 &lt;&lt; 24) + (255 &lt;&lt; 16) + (255 &lt;&lt; 8) + 255</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，而不是写“</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">-1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">”。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">7.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">编写测试。选择一项最容易让测试通过的测试数据加入测试方法。断言优先，然后加入为了让断言通过编译的一切准备条件。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">8.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">运行测试，不可运行状态。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">9.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">编写方法注释，把所有想到的该方法要实现的功能写上。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">10.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">编写功能代码，使之达到可运行状态。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">11.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">重构，消除重复设计。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">12.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">往测试方法中增加一个新的小测试。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">13.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">运行测试，不可运行状态。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">14.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">修改功能代码，使之达到可运行状态。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">15.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">重构。消除重复设计。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">16.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">重复</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">12-15</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">17.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">当无论如何也不能让该测试通过的时候，认真想一想是不是哪里出大问题了，如果实在想不出来的话，就将现有代码扔掉，重新开始。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">18.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">所有测试都运行通过之后，仔细检查所有代码，看是否还有值得重构的地方，并重构。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">19.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">提交</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">(check in)</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">20.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">再选择测试列表中的下一个测试。重复以上步骤。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">21.<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">当一天的工作结束时，若有某个任务未完成，则留下一个不完整测试，以便于次日能迅速回忆起当时写该代码时的想法，并接着写下去。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/94684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-18 15:54 <a href="http://www.blogjava.net/liaojiyong/archive/2007/01/18/94684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TDD 程序代码（13） </title><link>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94683.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 18 Jan 2007 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94683.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/94683.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/94683.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/94683.html</trackback:ping><description><![CDATA[Error convertoring HTML to XHTML: System.ArgumentException: Cannot have ']]&gt;' inside an XML CDATA block.
   at System.Xml.XmlTextWriter.WriteCData(String text)
   at System.Xml.XmlWriter.WriteNode(XmlReader reader, Boolean defattr)
   at FreeTextBoxControls.Support.Formatter.HtmlToXhtml(String input)<img src ="http://www.blogjava.net/liaojiyong/aggbug/94683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-18 15:53 <a href="http://www.blogjava.net/liaojiyong/archive/2007/01/18/94683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何测试异常？ </title><link>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94681.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 18 Jan 2007 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94681.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/94681.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/94681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/94681.html</trackback:ping><description><![CDATA[ 在写单元测试时，如何写异常的测试是很多人的难题。很多书建议使用如下方法进行测试：<br />public void method()<br />{<br />      throw new RuntimeException("exception message");<br />}<br />public void testException()<br />｛<br />      try<br />      {<br />         method();<br />         fail();<br />      }<br />      catch(Exception e)<br />      {<br />         assertTrue(true);/或者此处不写<br />      }<br />｝<br />      通过这种测试，可以测试方法中是否会达到期望的要求，在方法出现预期中的异常时是否会抛出该异常，若没有像期望的一样抛出异常，则单元测试会运行到"fail();"使得单元测试不会通过。正常情况下是没有问题的。但是有的时候方法内部会有多个子方法抛出同一个异常（或者说抛出的多个异常都继承于同一个异常类），因此这个时候我们必须定位到是哪个子方法抛出的异常，而通过以上方法是不能达到这个目标的。为了达到这个目标，可以通过判断异常中的信息来判断是哪个子方法出错。通常，程序员会在抛出异常时会将产生该异常的原因写入异常信息中，如：new Exception(message)。因此，我们只要在单元测试中能捕捉到该异常信息，往往就能定位到该异常出现的位置。<br />只需要将以上测试的catch块中的语句改为如下语句即可：<br />assertTrue(e.toString().contains(exception message));<br /><img src ="http://www.blogjava.net/liaojiyong/aggbug/94681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-18 15:52 <a href="http://www.blogjava.net/liaojiyong/archive/2007/01/18/94681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据的合法性检测 </title><link>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94679.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 18 Jan 2007 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94679.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/94679.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/94679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/94679.html</trackback:ping><description><![CDATA[
		<div>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">一般的数据类都应该有自己的数据合法性检查，如一个Person类，它的年龄属性是int型的，但是如果给它赋值10000则为不合法，一个人不可能活那么长时间。因此需要在创建该类的对象时必需对其进行合法性检查，若构造方法传入的是非法数据，则不让其创建该对象，并抛出异常。也许大多数人认为只需要对构造方法传入的参数进行合法性检查即可。如下所示：<br />class ValidClass<br />{<br /><span lang="EN-US"><span style="mso-tab-count: 2">        </span>int <span style="mso-spacerun: yes"> </span>dataValid1;<br /></span>        String dataValid2;<br /><br />         public ValidClass(int i, String str)<br />         {<br />               check(int i, String str);<br />               dataValid1 = i;<br />               dataValid2 = str;<br />         }<br /><br />         void check(int i, String str)<br />         {<br />            if(i &gt;100 &amp;&amp; i &lt;= 0) throws new RuntimeException("message");<br />            if(str == "str") throws new RuntimeException("message");<br />         }<br /><br />         void setDataValid1(int dataValid1)<br />         {<br />               this.dataValid1 = dataValid1;<br />         }<br />}<br />实际上这种合法性并不可靠，这样只是保证了在构造方法中传入的数据是合法的，但是不能保证程序员在使用该对象时能传入合法的数据。如下程序代码：<br />ValidClass validClass = new ValidClass(2, "123");<br />validClass.set(200);<br />这样使用的话，程序运行并不会报错，但是实际上我们已经传入了非法数据到该对象中去了，因此为了避免出现程序员在使用的时候也犯这种错误，对数据的合法性检查的正确方式应如下所示：<br />class ValidClass</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 1">       </span>{</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 2">              </span>int <span style="mso-spacerun: yes"> </span>dataValid;</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 2">              </span>
						</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 2">              </span>protected checkDataValid()</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 2">              </span>{</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 3">                     </span>check if dataValid valid</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 3">                     </span>if (fail)</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 3">                     </span>{<span style="mso-tab-count: 1">     </span>throws new RZXDataException(this, “.needValidate=”</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 126pt; TEXT-INDENT: 21pt">
						<span lang="EN-US">+needValidate); } </span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 2">              </span>}</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt">
						<span lang="EN-US">public ValidClass(int in)</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 2">              </span>{<span style="mso-tab-count: 1">     </span></span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 21pt">
						<span lang="EN-US">setDataValid(in);<span style="mso-tab-count: 1">     </span></span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt">
						<span lang="EN-US">}</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 2">              </span>public setDataValid(int in)</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 2">              </span>{<span lang="EN-US"><span style="mso-tab-count: 3">                     </span><br />                     checkNeedValidate();</span></span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 3">                     </span>dataValid = in;</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 2">              </span>}</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 1">       </span>}</span>
				</p>
				<p>在set方法中进行合法性检查，然后在构造方法中也调用set方法设置字段值，而不直接使用类中的字段。这样做的好处很明显：不仅保证了构造方法中传入的数据必须合法，而且可以保证程序在使用的过程中不能使用非法数据，如果程序员使用了非法数据，程序运行必然出错，并且能够很快的找到错误的根源所在。<br /><br />         另外，有些程序员认为，有些数据类的对象全部来自于另一个数据对象，也就是说该类的构造方法中的参数即另一个数据类对象，因此在该类中所有与被传入对象类中有相同的合法性检查的数据字段不需要再进行合法性检查了。其实这种想法是错误的，问题与上面所说的一样，你能保证传入的数据是合法的，但不能保证使用者在调用你的set方法时能100%传入合法数据。因此，程序员是不应该偷这个懒的。也许有人会说，他们的合法性检查完全一样，如果在该类中再写的话就会出现大量的重复代码了。能想到这里是对的，但是如果你有一定的经验，你就知道去建立一个专门保存合法性检查方法的类，这样你就可以在需要进行合法性检查的时候就使用该类里面的方法，如果该类中没有你所需要的方法，你就可以在里面加入你所需要的合法性检查方法，再去使用它。这样做会使得代码非常的清晰。<br /><br />         我认为，应该在自己类中的所有使用“this.value = data;”字样的代码都应该使用setValue()，因为也许这个字段现在不需要进行合法性检查，但是不能保证将来也没有合法性要求。而一旦以后需要对该字段进行合法检查的时候，就需要在set方法中增加合法性检查代码，而且需要将该类中所有对该字段的赋值语句均改用set方法。一旦有某处漏掉，则很可能带来致命的错误。也许在某个运算中带来了非法数据，但是你却怎么也不会往这方面去想，因为你一直以为自己全部都作了合法性检查的。</p>
		</div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/94679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-18 15:51 <a href="http://www.blogjava.net/liaojiyong/archive/2007/01/18/94679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>junit assert() 使用实例 </title><link>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94663.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 18 Jan 2007 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94663.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/94663.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/94663.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/94663.html</trackback:ping><description><![CDATA[
		<div>
				<p>package com.liyingcheng.netTest;</p>
				<p>
						<br />import com.liyingcheng.net.Sort;</p>
				<p>import junit.framework.Test;<br />import junit.framework.TestCase;<br />import junit.framework.TestSuite;<br />import junit.xiaoxuhui.Sum;</p>
				<p>
						<br />public class SortTest extends TestCase<br />{<br /> // Sort popObj = new Sort();</p>
				<p> public SortTest(String name)<br /> {<br />  super(name);<br /> }</p>
				<p>
						<br /> protected void setUp() throws Exception<br /> {<br />  super.setUp();<br /> }</p>
				<p>
						<br /> protected void tearDown() throws Exception<br /> {<br />  super.tearDown();<br /> }</p>
				<p>
						<br /> static public void assertEquals(int[] expected, int[] actual)<br /> {<br />  for(int i = 0; i &lt; expected.length; i++)<br />  {<br />   assertEquals(null, expected[i], actual[i]);<br />  }<br /> }</p>
				<p>
						<br /> public void testPopSort()<br /> {<br />  int[] expected = new int[] {1, 2, 3, 4};<br />  assertEquals(expected, Sort.popSort(new int[] {1, 2, 4, 3}));<br />  assertEquals(expected, Sort.popSort(new int[] {1, 2, 3, 4}));<br />  assertEquals(expected, Sort.popSort(new int[] {1, 3, 4, 2}));<br />  assertEquals(expected, Sort.popSort(new int[] {1, 3, 2, 4}));<br />  assertEquals(expected, Sort.popSort(new int[] {2, 1, 4, 3}));<br />  assertEquals(expected, Sort.popSort(new int[] {2, 4, 1, 3}));<br />  assertEquals(expected, Sort.popSort(new int[] {3, 2, 4, 1}));<br />  assertEquals(new int[] {1, 2}, Sort.popSort(new int[] {2, 1}));<br />  // assertEquals(new int[]{1,3,2,4},popObj.popSort(new int[]{1,2,4,3}));<br />  // assertEquals(new int[]{1,2,3,4},popObj.popSort(new int[]{1,2,4,3}));<br /> }</p>
				<p>
						<br /> public void testCreateArray()<br /> {<br />  assertEquals(4, Sort.createArray(4).length);<br /> }</p>
				<p>
						<br /> public void testGetSum()<br /> {<br />  assertEquals(5050, Sum.getSum(1, 100));<br /> }</p>
				<p>
						<br /> public void testFalse()<br /> {<br />  assertFalse(false);<br />  assertTrue(true);<br /> }</p>
				<p>
						<br /> public void testIsNull()<br /> {<br />  String str1 = "";<br />  int[] arr1 = {};<br />  String str2 = null;<br />  int[] arr2 = null;<br />  assertNotNull(str1);<br />  assertNotNull(arr1);<br />  assertNull(str2);<br />  assertNull(arr2);<br />  // assertNull(str);<br /> }</p>
				<p>
						<br /> public void testNull()<br /> {<br /> }</p>
				<p>
						<br /> public void testNotSame()<br /> {<br />  String str1 = "123";<br />  String str2 = "123";<br />  String str3 = new String(str1);<br />  String str4 = new String("123");<br />  int one = 1;<br />  int first = 1;<br />  assertSame(one, first);<br />  assertSame(str1, str2);<br />  assertNotSame(str3, str4);<br />  //fail("hahahahahahahah");<br />  /*<br />   * assertNotSame(one,first); assertNotSame(str1,str2);<br />   */<br /> }</p>
				<p>
						<br /> public static Test suite()<br /> {<br />  TestSuite suite = new TestSuite("Test sort!");<br />  suite.addTestSuite(SortTest.class);<br />  return suite;<br /> }</p>
				<p>}<br /></p>
		</div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/94663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-18 15:22 <a href="http://www.blogjava.net/liaojiyong/archive/2007/01/18/94663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从文件中取测试数据进行单元测试 </title><link>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94659.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 18 Jan 2007 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94659.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/94659.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/94659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/94659.html</trackback:ping><description><![CDATA[public void testPopSortFromFile() throws IOException<br /> {<br />  @SuppressWarnings("unused")<br />  String line = "";<br />  FileReader myFileReader = new FileReader<font color="#ff0000">("com/liyingcheng/testFiles/TestPopSort.txt");//相对路径<br /></font>  BufferedReader myBufferedReader=new BufferedReader(myFileReader);<br />  while((line = myBufferedReader.readLine())!=null)<br />  {<br />   if(line.startsWith("#"))<br />   {<br />    continue;<br />   }<br />   <br />   String[] tokens = line.split(",");<br />   <br />   int[] actual = {Integer.parseInt(tokens[0]),Integer.parseInt(tokens[1]),Integer.parseInt(tokens[2])};<br />   int[] expected = {Integer.parseInt(tokens[3]),Integer.parseInt(tokens[4]),Integer.parseInt(tokens[5])};<br />   testSinglePopSort(expected,actual);<br />  }<br /> }<br /><img src ="http://www.blogjava.net/liaojiyong/aggbug/94659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-18 15:20 <a href="http://www.blogjava.net/liaojiyong/archive/2007/01/18/94659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Junit4功能 先睹为快. (译文) （转） </title><link>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94657.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 18 Jan 2007 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94657.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/94657.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/94657.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/94657.html</trackback:ping><description><![CDATA[Error convertoring HTML to XHTML: System.ArgumentException: Cannot have ']]&gt;' inside an XML CDATA block.
   at System.Xml.XmlTextWriter.WriteCData(String text)
   at System.Xml.XmlWriter.WriteNode(XmlReader reader, Boolean defattr)
   at FreeTextBoxControls.Support.Formatter.HtmlToXhtml(String input)<img src ="http://www.blogjava.net/liaojiyong/aggbug/94657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-18 15:19 <a href="http://www.blogjava.net/liaojiyong/archive/2007/01/18/94657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TestSuite的使用 </title><link>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94651.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 18 Jan 2007 07:15:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94651.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/94651.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/01/18/94651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/94651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/94651.html</trackback:ping><description><![CDATA[
		<div>您定义自己的TestCase，并使用TestRunner来运行测试，事实上TestRunner并不直接运行 TestCase上的单元方法，而是透过TestSuite，TestSuite可以将数个TestCase在一起，而让每个TestCase保持简单。<br /><br />来看看一个例子：<br /><ul><li>MathToolTest.java </li></ul><pre>package onlyfun.caterpillar.test;<br /><br />import onlyfun.caterpillar.MathTool;<br />import junit.framework.TestCase;<br /><br />public class MathToolTest extends TestCase {<br />    public MathToolTest(String testMethod) {<br />        super(testMethod);<br />    }<br /><br />    public void testGcd() {<br />        assertEquals(5, MathTool.gcd(10, 5));<br />    }<br /><br />    public static void main(String[] args) {<br />        junit.textui.TestRunner.run(MathToolTest.class);<br />    }<br />}</pre><br />在这个例子中，您并没有看到任何的TestSuite，事实上，如果您没有提供任何的TestSuite，TestRunner会自己建立一个，然後这个 TestSuite会使用反射（reflection）自动找出testXXX()方法。<br /><br />如果您要自行生成TestSuite，则在继承TestCase之後，提供静态的（static）的suite()方法，例如：<br /><div style="MARGIN-LEFT: 40px"><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">public static Test suite() {</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">     return new TestSuite(MathTool.class);</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">}</span><br /></div><br />如果您没有提供任何的TestSuite，则TestRunner就会像上面这样自动为您建立一个，并找出testXXX()方法，您也可以如下面定义 suite()方法：<br /><div style="MARGIN-LEFT: 40px"><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">public static Test suite() {</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">     TestSuite suite = new TestSuite(MathTool.class);</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">     suite.addTest(new MathToolTest("testGcd"));</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">     return suite;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">}</span><br /></div> <br />JUnit并没有规定您一定要使用testXXX()这样的方式来命名您的测试方法，如果您要提供自己的方法（当然JUnit 鼓励您使用testXXX()这样的方法名称），则可以如上撰写，为了要能够使用建构函式提供测试方法名称，您的TestCase必须提供如下的建构函 式：<br /><div style="MARGIN-LEFT: 40px"><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">public MathToolTest(String testMethod) {</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">    super(testMethod);</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">}</span><br /></div> <br /><br />如果要加入更多的测试方法，使用addTest()就可以了，suite()方法传回一个TestSuite物件，它与 TestCase都实作了Test介面，TestRunner会调用TestSuite上的run()方法，然後TestSuite会将之委托给 TestCase上的run()方法，并执行每一个testXXX()方法。<br /><br />除了组合TestCase之外，您还可以将数个TestSuite组合在一起，例如：<br /><div style="MARGIN-LEFT: 40px"><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">public static Test suite() { </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">    TestSuite suite= new TestSuite(); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">    suite.addTestSuite(TestCase1.class);</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">    suite.addTestSuite(TestCase2.class); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">    return suite; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">}</span><br /></div> <br />如此之来，您可以一次运行所有的测试，而不必个别的运行每一个测试案例，您可以写一个运行全部测试的主测试，而在使用TestRunner时呼叫 suite()方法，例如：<br /><div style="MARGIN-LEFT: 40px"><span class="postbody"></span><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New,Courier,monospace">junit.textui.TestRunner.run(TestAll.suite());</span><br /></div><br />TestCase与TestSuite都实作了Test介面，其运行方式为 Command 模式 的一个实例，而TestSuite可以组合数个TestSuite或TestCase，这是 Composite 模式 的一个实例。</div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/94651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-18 15:15 <a href="http://www.blogjava.net/liaojiyong/archive/2007/01/18/94651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>