﻿<?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 face=华文隶书 color=salmon pink size=6&gt;&lt;b&gt;工作小驿&lt;/b&gt;-随笔分类-JUnit</title><link>http://www.blogjava.net/wjun530/category/25552.html</link><description>&lt;a href="http://www.fodey.com/generators/animated/ninjatext.asp"&gt;&lt;img src="http://r3.fodey.com/14c8ffb1600cc41aaaa8e03a1cf049678.1.gif" border=0 width="437" height="146" alt="Ninja!"&gt;&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Wed, 05 Sep 2007 11:51:31 GMT</lastBuildDate><pubDate>Wed, 05 Sep 2007 11:51:31 GMT</pubDate><ttl>60</ttl><item><title>JUnit 介绍</title><link>http://www.blogjava.net/wjun530/archive/2007/09/05/142900.html</link><dc:creator>王君</dc:creator><author>王君</author><pubDate>Wed, 05 Sep 2007 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/wjun530/archive/2007/09/05/142900.html</guid><wfw:comment>http://www.blogjava.net/wjun530/comments/142900.html</wfw:comment><comments>http://www.blogjava.net/wjun530/archive/2007/09/05/142900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wjun530/comments/commentRss/142900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wjun530/services/trackbacks/142900.html</trackback:ping><description><![CDATA[一、JUnit简介<br />
&nbsp; JUnit是基于面向对象构建的java单元测试框架。<br />
&nbsp; JUnit是开放源代码项目，可按需要进行扩展。<br />
&nbsp; <br />
&nbsp;二、安装JUnit<br />
&nbsp; 首先获取JUnit的软件包，从http://www.junit.org下载最新的软件包。<br />
&nbsp; 将软件包在适当的目录下解包。<br />
&nbsp; 这样在安装目录下找到一个名为junit.jar的文件，将这个jar文件加入<br />
&nbsp;<br />
&nbsp;CLASSPATH系统变量。<br />
&nbsp;<br />
&nbsp;三、JUnit框架介绍：<br />
&nbsp;一）TestCase--测试用例，对每个测试类，都要定义一个测试用例。<br />
&nbsp;JUnit支持两种运行单个测试的方法：静态的和动态的方法。 <br />
&nbsp;1、静态的方法就是覆盖TestCase类的runTest()方法，一般是采用内部类的方式<br />
&nbsp;<br />
&nbsp;创建一个测试实例： <br />
&nbsp;TestCase test01 = new testCar("test getWheels") { <br />
&nbsp; public void runTest() { <br />
&nbsp; testGetWheels(); <br />
&nbsp; } <br />
&nbsp;}<br />
&nbsp;采用静态的方法要注意要给每个测试一个名字，这样你就可以区分哪个测试失败<br />
&nbsp;<br />
&nbsp;了。 <br />
&nbsp;<br />
&nbsp;2、动态的方法是用内省来实现runTest()以创建一个测试实例。这要求测试的名<br />
&nbsp;<br />
&nbsp;字就是需要调用的测试方法的名字： <br />
&nbsp;TestCase test01 = new testCar("testGetWheels"); <br />
&nbsp;JUnit会动态查找并调用指定的测试方法。动态的方法很简洁，但如果你键入了错<br />
&nbsp;<br />
&nbsp;误的名字就会得到一个令人奇怪的NoSuchMethodException异常。动态的方法和静<br />
&nbsp;<br />
&nbsp;态的方法都很好，你可以按照自己的喜好来选择。<br />
&nbsp;<br />
&nbsp;二）TestSuite <br />
&nbsp;一旦你创建了一些测试实例，下一步就是要让他们能一起运行。我们必须定义一<br />
&nbsp;<br />
&nbsp;个TestSuite。在JUnit中，这就要求你在TestCase类中定义一个静态的suite()方<br />
&nbsp;<br />
&nbsp;法。suite()方法就像main()方法一样，JUnit用它来执行测试。在suite()方法中<br />
&nbsp;<br />
&nbsp;，你将测试实例加到一个TestSuite对象中，并返回这个TestSuite对象。一个<br />
&nbsp;<br />
&nbsp;TestSuite对象可以运行一组测试。<br />
&nbsp;TestSuite和TestCase都实现了Test接口，而Test接口定义了运行测试所需的方法<br />
&nbsp;<br />
&nbsp;。这就允许你用TestCase和TestSuite的组合创建一个TestSuite。<br />
&nbsp;public static Test suite() { <br />
&nbsp; TestSuite suite= new TestSuite(); <br />
&nbsp; suite.addTest(new testCar("testGetWheels")); <br />
&nbsp; suite.addTest(new testCar("testGetSeats")); <br />
&nbsp; return suite; <br />
&nbsp;}<br />
&nbsp;public static Test suite() { <br />
&nbsp; return new TestSuite(testCar.class); <br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;三）TestRunner<br />
&nbsp;有了TestSuite我们就可以运行这些测试了，JUnit提供了三种界面来运行测试 <br />
&nbsp;[Text UI] junit.textui.TestRunner <br />
&nbsp;[AWT UI] junit.awtui.TestRunner <br />
&nbsp;[Swing UI] junit.swingui.TestRunner <br />
&nbsp;java junit.textui.TestRunner yourTestclass<br />
&nbsp;<br />
&nbsp;Fixture<br />
&nbsp;如果需要在一个或若干个的类执行多个测试，这些类就成为了测试的context。在<br />
&nbsp;<br />
&nbsp;JUnit中被称为Fixture。当你编写测试代码时，你会发现你花费了很多时间配置/<br />
&nbsp;<br />
&nbsp;初始化相关测试的Fixture。将配置Fixture的代码放入测试类的构造方法中并不<br />
&nbsp;<br />
&nbsp;可取，因为我们要求执行多个测试，我并不希望某个测试的结果意外地（如果这<br />
&nbsp;<br />
&nbsp;是你要求的，那就另当别论了）影响其他测试的结果。通常若干个测试会使用相<br />
&nbsp;<br />
&nbsp;同的Fixture，而每个测试又各有自己需要改变的地方。 <br />
&nbsp;为此，JUnit提供了两个方法，定义在TestCase类中。 <br />
&nbsp;<br />
&nbsp;protected void setUp() throws java.lang.Exception <br />
&nbsp;protected void tearDown() throws java.lang.Exception <br />
&nbsp;<br />
&nbsp;覆盖setUp()方法，初始化所有测试的Fixture，如建立数据库连接，将每个测试<br />
&nbsp;<br />
&nbsp;略有不同的地方在testXXX()方法中进行配置。 <br />
&nbsp;覆盖tearDown()，释放你在setUp()中分配的永久性资源，如数据库连接。 <br />
&nbsp;当JUnit执行测试时，它在执行每个testXXXXX()方法前都调用setUp()，而在执行<br />
&nbsp;<br />
&nbsp;每个testXXXXX()方法后都调用tearDown()方法，由此保证了测试不会相互影响。 <br />
&nbsp;<br />
&nbsp;四）Assert<br />
&nbsp;Assert类中定义了相当多的assert方法，主要有assert(),assertEquals(), <br />
&nbsp;<br />
&nbsp;assertNull(), assertSame(), assertTrue(), fail()等方法。<br />
&nbsp;<br />
&nbsp;Faile失败是一个期望的被assert方法检查到的结果。<br />
&nbsp;Error错误则是意外的问题引起的，如ArrayIndexOutOfBoundsException。 <br />
&nbsp;<br />
&nbsp;<br />
&nbsp;四、测试流程： <br />
&nbsp;1. 扩展TestCase类；<br />
&nbsp;2. 覆盖runTest()方法（可选）；<br />
&nbsp;3. 对应测试目标类书写testXXXXX()方法；<br />
&nbsp;4、扩展TestSuite类，重载suite()方法，实现自定义的测试过程；<br />
&nbsp;5. 运行TestRunner进行测试；<br />
http://www.chinaitlab.com/www/news/article_show.asp?id=24311
<img src ="http://www.blogjava.net/wjun530/aggbug/142900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wjun530/" target="_blank">王君</a> 2007-09-05 14:55 <a href="http://www.blogjava.net/wjun530/archive/2007/09/05/142900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解敏捷开发的常见误区</title><link>http://www.blogjava.net/wjun530/archive/2007/09/05/142879.html</link><dc:creator>王君</dc:creator><author>王君</author><pubDate>Wed, 05 Sep 2007 05:49:00 GMT</pubDate><guid>http://www.blogjava.net/wjun530/archive/2007/09/05/142879.html</guid><wfw:comment>http://www.blogjava.net/wjun530/comments/142879.html</wfw:comment><comments>http://www.blogjava.net/wjun530/archive/2007/09/05/142879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wjun530/comments/commentRss/142879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wjun530/services/trackbacks/142879.html</trackback:ping><description><![CDATA[好文章，大家共勉：<br />
<br />
<br />
<br />
1.&nbsp;敏捷是&#8220;一个&#8221;过程<br />
　　<br />
敏捷不是一个过程，是一类过程的统称，它们有一个共性，就是符合敏捷价值观，遵循敏捷的原则。<br />
<br />
<br />
敏捷的价值观如下：<br />
　　<br />
个体和交互&nbsp;胜过&nbsp;过程和工具<br />
　　<br />
可以工作的软件&nbsp;胜过&nbsp;面面俱到的文档<br />
<br />
客户合作&nbsp;胜过&nbsp;合同谈判<br />
　　<br />
响应变化&nbsp;胜过&nbsp;遵循计划<br />
　　<br />
由价值观引出的12条敏捷原则：<br />
　　<br />
我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。<br />
　　<br />
即使到了开发的后期，也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。<br />
　　<br />
经常性地交付可以工作的软件，交付的间隔可以从几个星期到几个月，交付的时间间隔越短越好。<br />
　　<br />
在整个项目开发期间，业务人员和开发人员必须天天都在一起工作。<br />
　　<br />
围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持，并且信任他们能够完成工作。<br />
　　<br />
在团队内部，最具有效果并且富有效率的传递信息的方法，就是面对面的交谈。<br />
　　<br />
工作的软件是首要的进度度量标准。<br />
　　<br />
敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度。<br />
　　<br />
不断地关注优秀的技能和好的设计会增强敏捷能力。<br />
　　<br />
简单??使未完成的工作最大化的艺术??是根本的。<br />
　　<br />
最好的构架、需求和设计出自于自组织的团队。<br />
　　<br />
每隔一定时间，团队会在如何才能更有效地工作方面进行反省，然后相应地对自己的行为进行调整。<br />
　　<br />
建立敏捷联盟的17位大师所创立的敏捷方法包括：极限编程，Scrum，特征驱动开发，动态系统开发方法，自适应软件开发，水晶方法，实用编程方法。这些方法统称为敏捷方法。<br />
　　<br />
其实每个人都可以从敏捷宣言和原则出发，明确问题，找出一些解决方法，形成自己的过程。我觉得国内的软件环境这么复杂，程序员的自主精神又这么强，敏捷方法应该是在中国首先提出才对，只是国人都有唯标准唯规范至上的心理定式，即使找出好办法，也觉得不规范，没有深入形成理论，无法提升高度，始终是跟着鬼子屁股后面走，我想这也是国外软件行业不成熟的表现之一吧。<br />
　　<br />
　　&nbsp;<br />
　　<br />
2.&nbsp;敏捷仅仅是一个软件过程<br />
　　<br />
如果仅仅从软件过程的角度去认识敏捷实施敏捷，效果不会太好。敏捷相对以前的软件工程最大的革新之处在于把人的作用提高到了过程至上，正如敏捷宣言的第一条&#8220;个体和交互胜过过程和工具&#8221;所说的。<br />
　　<br />
涉及到人的问题，就已经不再是过程所能覆盖的了，就到了企业管理的层面上了，包括企业的价值观和文化。这也是敏捷在国内实施的最大障碍：<br />
　　<br />
把客户当作合作伙伴而不是对手，从客户角度出发去想问题，充分的跟客户沟通，而不是出了问题推诿责任。目标是让软件实现客户的价值，而不是收钱就完事儿。<br />
　　<br />
把人的能动性调动起来，给动力而不是给压力。<br />
　　<br />
要实用而不是要规范。让开发人员理解并实施，体验到敏捷的好处，而不是盲目机械地实施规范。<br />
　　<br />
没有绝对的权威，每个人都有可取之处。<br />
　　<br />
　　&nbsp;<br />
　　<br />
3.&nbsp;迭代就是敏捷，UP属于敏捷。<br />
　　<br />
看到这么多人都把UP归入敏捷，我都开始怀疑是不是自己搞错了。但是在我的印象中：<br />
　　<br />
UP是重型的过程，虽然引入了迭代，但是其原则和价值观与敏捷是不同的。敏捷注重的是反馈，迭代周期尽量的短，重在客户的参与，通过客户的参与，获取持续的反馈，不断调整使整个项目走在正确的方向上。同时也给客户一个感受和思考的机会，因为对于大多数客户而言，目标是明确的（不排除有些客户目标也不明确），但是具体怎么做，开始时是没有想法的，只有看到具体的东西的时候，才知道&#8220;噢，原来可以这样，那我想把这里调整一下&#8221;。<br />
　　<br />
　　&nbsp;<br />
　　<br />
4.&nbsp;敏捷是彻底革命的。<br />
　　<br />
敏捷，特别是XP，让人有耳目一新的感觉，觉得以前的所有软件工程理论，设计方法都可以抛弃掉了，推翻一切，从头再来。抱着这种想法实施敏捷，那就错了，敏捷不是&#8220;石头里蹦出个孙大圣&#8221;，以前的软件过程中也有敏捷的影子，只是没有像敏捷一样上升到价值观和原则的高度，比如快速原型法。敏捷是在对已有的软件过程方法的改进，抛弃的是传统软件工程低效的外表，以往的软件过程中很多技巧都是很实用的。实施敏捷应该以现有的软件过程为基础，从敏捷宣言和原则出发，利用敏捷的方法来改善过程。<br />
　　<br />
　　&nbsp;<br />
　　<br />
5.&nbsp;敏捷是反文档的。<br />
　　<br />
文档只是为了达成目标的一种手段，如果这种手段是低效的，那就换一种手段。可是完全抛弃了文档，怎样解决沟通的问题？难道你想每次沟通都完全用手比划，用嘴说，跟不同的人重复表述同样的想法，那样更是低效的。<br />
　　<br />
应该清楚文档的本质是把知识显性化。在一个项目中存在很多需要沟通的知识，知识具备两种形态，显性的和隐性的，传统的观念是尽量把隐性知识显性化，即文档化，而忽略了这其中的代价（特别是更新同步文档的代价）。<br />
　　<br />
因此，在实施敏捷的时候，需要在团队内明确哪些知识是必须显性的，这些知识可以通过文档交流。哪些知识是可以隐性的，这些知识则完全可以通过口头的方式进行交流，以达到沟通的最佳效率。<br />
　　<br />
文档不是目的，有效沟通才是目的。<br />
　　<br />
　　&nbsp;<br />
　　<br />
6.&nbsp;为了敏捷而敏捷<br />
　　<br />
&#8220;嗯，敏捷这么好，我们也敏捷吧&#8221;，可能很多人会有这种想法。忘了以前是在哪儿看的大师采访录：<br />
　　<br />
Q：&#8220;我们现有的过程很好，不知道怎么用敏捷改进？&#8221;<br />
　　<br />
A：&#8220;既然很好，那就不要用敏捷&#8221;。<br />
　　<br />
做什么事情都要有明确目标的，敏捷虽好，得看你需不需要，能不能解决你现在头疼的问题，如果不是，那就不要给自己找麻烦了。<br />
　　<br />
　　&nbsp;<br />
　　<br />
7.&nbsp;敏捷是CMM的反义词<br />
　　<br />
在桂林会议的讨论中，很多人把CMM作为敏捷的反义词，我觉得这不是很合适。CMM只是一种衡量软件成熟度的标准，并非过程，和敏捷不是一类概念。如果要给敏捷找一个反义词，我觉得传统的瀑布式开发应该更合适一些。<br />
　　<br />
并且，我认为，如果CMM还能继续流行下去的话，应该会有公司可以用敏捷改善的过程通过CMM认证。<br />
　　<br />
　　&nbsp;<br />
　　<br />
8.&nbsp;敏捷是自由的，无约束的。<br />
　　<br />
敏捷强调的是自组织团队，发挥人的能动性，以动力代替压力，让人有绝对自由的错觉。但是应该清楚，凡是都是要讲究一个平衡，人也是两面的，消极的一面和积极的一面同时并存，绝对的自由会放纵人消极的一面。敏捷并非是绝对自由，无约束的。作为管理者，有一个职责，就是引导团队成员用自己积极的一面去压制消极的一面，不能放任团队中出现搭便车的现象，否则将打击整个团队的士气。如果实在无效，那就只能将其排除出团队了，这个惩罚够有约束力吧？<br />
　　<br />
　　&nbsp;<br />
　　<br />
9.&nbsp;重做就是重构<br />
　　<br />
重做不等于重构，很多场合这两个概念是混淆的。但是在敏捷中，重构的一个特征是必须可控的。当对系统结构进行大的调整时，如果没有测试驱动辅助的话，那么可控性就会很差，这不能叫做重构。<br />
<img src ="http://www.blogjava.net/wjun530/aggbug/142879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wjun530/" target="_blank">王君</a> 2007-09-05 13:49 <a href="http://www.blogjava.net/wjun530/archive/2007/09/05/142879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Eclipse中使用JUnit</title><link>http://www.blogjava.net/wjun530/archive/2007/09/04/142766.html</link><dc:creator>王君</dc:creator><author>王君</author><pubDate>Tue, 04 Sep 2007 14:14:00 GMT</pubDate><guid>http://www.blogjava.net/wjun530/archive/2007/09/04/142766.html</guid><wfw:comment>http://www.blogjava.net/wjun530/comments/142766.html</wfw:comment><comments>http://www.blogjava.net/wjun530/archive/2007/09/04/142766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wjun530/comments/commentRss/142766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wjun530/services/trackbacks/142766.html</trackback:ping><description><![CDATA[<font size="2"><font face="宋体">这篇文章将向你介绍Junit，一个用来在项目中进行测试和调试的工具。在介绍完TDD（以测试驱动开发）理论后，将进一步讲解怎样在流行的Eclipse中建立你自己的JUnit测试。向你展示如何测试Hello World这样简单的程序。</font></font>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 许多书上都讨论了自动测试，但是只有很少的著作注意到这么一个问题，那就是怎样把这些测试组织起来。随着测试的增加，放置和调用这些测试却变得更加麻烦。这将成为一个重要问题，以至于出现了TDD，极限编程（XP）使TDD得以普及。另外，你可以这样理解TDD：通过测试来开发。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-family: 宋体">TDD的主要规范：</span></strong></font></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 在编写程序代码之前，与之对应的自动测试必须被写好。甚至程序代码并不存在，那也要看见一个失败的测试结果。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 在测试通过后，副本代码必须被丢弃。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 有一个具体步骤（可能指的是《Extreme Programming》）可以被任何一个程序员来参考，而不需要特殊的其他方法。在我们开始写测试之前，这些步骤（章节）应该被首先阅读——怎样组织自动测试。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 讲解一下不同种类的测试：</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; <strong>单元测试：</strong>检测模块（也就是类）的正确性。如果对象需要访问外部的数据资源，例如数据库，就需要模拟一个mock objects，但在实际中真实数据与测试环境是不同的。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; <strong>客户测试：</strong>这是功能性、系统、和验收测试。用来测试整体的系统特性。在XP中，这些测试由用户编写。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; <strong>综合测试：</strong>介于用户测试和单元测试之间的桥梁。综合测试帮助测试应用程序的交互性。一般情况下，mock objects不被用于综合测试，它会增加测试时间。同样，综合测试经常依赖特殊的测试环境，例如数据库送来的测试数据。综合测试也需要用到外部类库。例如为J2EE应用程序进行综合测试的类库Cactus。解释这些测试超出了本文的范围，需要更加详细的信息请参考</font><a href="http://jakarta.apache.org/cactus/"><font size="2">http://jakarta.apache.org/cactus/</font></a><font size="2">。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; <strong>开发人员测试：</strong>这是用来让开发人员检验自己代码或新函数的。对于每一个开发人员，只要有可能，就需要有更多的测试来检验代码。组织这些测试和组织程序代码一样重要。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 在以下章节，只要提到&#8220;测试&#8221;，那就指的是开发人员测试。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp; &nbsp;</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 我们几乎准备好开始建立测试了，先应该为我们的测试选择名字。你也许会说，&#8220;这不是问题：把&#8216;Test&#8217;这个字放在类名前面，就好了！&#8221;不会这么快！让我来说一下这个步骤存在的问题：</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 在TDD中，被测试的类或者方法还不存在。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 一个测试能够覆盖多个方法，甚至多个类，这是可能的。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 以上只是一些普遍问题；还存在更多的问题。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 让我来提一个建议，在测试命名时：测试类的名字应该让人一眼就知道这是一个测试类，且能说明它要测试什么，注意是否和其他类重名。按照以上建议做，就很简单了，也不用担心名字太长或难听。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 即将在Eclipse中用JUnit工具创建我们第一个测试了。假设你已经下载了一个最新的Eclipse版本。如果还没有，你应该去官方站点http://www.eclipse.org下载。还需要JUnit，也可以从http://www.junit.org/下载。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 运行Eclipse。新建一个workplace项目，点击<strong>文件</strong>-&gt;<strong>新建</strong>-&gt;<strong>项目</strong>，选择Java项目，点击<strong>下一步</strong>。起一个项目名称，例如ProjectWithJUnit。点击<strong>完成</strong>。这样就完成新项目的建立了。再来配置一下Eclipse，在构建路径中添加JUnit类库。在工具条上点击<strong>项目</strong>-&gt;<strong>属性</strong>，选择<strong>Java构建路径</strong>，<strong>库</strong>，选择<strong>添加外部JAR</strong>，浏览Junit被存储的目录，选择junit.jar，点击<strong>打开</strong>。你将会看见JUnit出现在库的列表中。点击<strong>确定</strong>，让Eclipse重建路径。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 现在开发我们的&#8220;Hello World&#8221;例子。按照TDD的规则，应该在代码建立以前先把测试写好。为了能够在某出开始，我们假设未来的类名是HelloWorld，并且有一个方法Say()，这个方法返回String的值（例如&#8220;Hello World!&#8221;）。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 建立测试，在ProjectWithJUnit的标题上面点击右键，选择<strong>新建</strong>-&gt;<strong>其他</strong>，展开&#8220;Java&#8221;选项，选择<strong>JUnit</strong>。在右边的栏目对话框中选择测试案例，然后下一步。参考图1。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<img alt="" hspace="0" src="http://www.51testing.com/ddimg/uploadimg/20051024/1728410.gif" align="baseline" border="0" /></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 9pt; font-family: 宋体">图1. 在Eclipse中建立JUnit测试</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; <font size="2">在测试类这一栏中，写上将要被测试的类名HelloWorld。选择一个<strong>测试案例</strong>的名字，例如TestThatWeGetHelloWorldPrompt（是的，看上去很长，但是很清楚它的行为。）点击<strong>完成</strong>。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; TestThatWeGetHelloWorldPrompt的代码如下：</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; import junit.framework.TestCase;</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; public class TestThatWeGetHelloWorldPrompt</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; extends TestCase {</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public TestThatWeGetHelloWorldPrompt(</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name) {</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(name);</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void testSay() {</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HelloWorld hi = new HelloWorld();</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertEquals("Hello World!", hi.say());</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; junit.textui.TestRunner.run(</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TestThatWeGetHelloWorldPrompt.class);</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; }</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 代码并不复杂；只是有点与众不同。然而，让我们考察一下细节。我们继承了JUnit的TestCase类，它在JUnit的javadocs定义为&#8220;运行众多测试的夹具。&#8221;JUnit也有TestSuite类，它是一组测试案例的集合，但在本文中不做讨论。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 建立测试案例的步骤如下：</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 1、建立一个junit.framework.TestCase的实例。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 2、定义一些以&#8220;test&#8221;开头的无返回方法（例如testWasTransactionSuccessful()，testShow()，等等）。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; TestThatWeGetHelloWorldPrompt.java包含这些：TestCase的子类和一个叫做testSay()的方法。这个方法调用了assertEquals()函数，它用来比较我们预期的值和由say()返回的值。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; main()方法用来运行测试和显示输出的。JUnit的TestRunner处理测试，提供基于图像和文本的输出表现形式。我们使用基于文本的版本，因为Eclipse支持它，且也适合我们。当开始运行后，基于文本的版本测试会以文本形式输出，Eclipse会把这些输出自动变成图像界面的输出。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 按照TDD规范，首次运行测试，应该故意让它失败。点击<strong>运行</strong>-&gt;<strong>运行为</strong>-&gt;<strong>Junit测试</strong>（记住TestThatWeGetHelloWorldPrompt.java应该被突出的显示在包资源管理器中）。在左边窗口，应该看见JUnit窗口而不是<strong>包资源管理器</strong>，它显示一个红条，一次失败的测试，具体的失败原因参看图2。如果没有自动显示这些内容，点击<strong>JUnit</strong>标签（在底部的左边）。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<img alt="" hspace="0" src="http://www.51testing.com/ddimg/uploadimg/20051024/1728411.gif" align="baseline" border="0" /></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 9pt; font-family: 宋体">图2. JUnit中失败的测试</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 很好！的却失败了。现在我们来建立被测试代码：在包资源管理器窗口的ProjectWithJUnit标题上右击，选择<strong>新建</strong>-&gt;<strong>类</strong>。选择类名，我们已经假设了它叫HelloWorld，然后直接点击<strong>完成</strong>。为HelloWorld.java填入下列代码：</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class HelloWorld {</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String say() {</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return("Hello World!");</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #000066; font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="2">&nbsp;&nbsp;&nbsp; 这段代码很简单，甚至不需要注解，我们再来看看结果。按照上面描述过的方式，在<strong>JUnit</strong>的窗口中显示了一个绿条，参看图3。绿条证明测试成功。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <img alt="" hspace="0" src="http://www.51testing.com/ddimg/uploadimg/20051024/1728412.gif" align="baseline" border="0" /></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 9pt; font-family: 宋体">图3. JUnit中成功的测试</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; <font size="2">现在，我们想再让测试失败一次，但原因不同。这有助于展示JUnit测试中不同的报错信息。修改assertEquals()代码，把&#8220;Hello World!&#8221;变成&#8220;Hello Me!&#8221;。当再次运行JUnit时，结果变成了红条，在<strong>JUnit</strong>窗口的底部输出了失败原因，参看图4。</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <img alt="" hspace="0" src="http://www.51testing.com/ddimg/uploadimg/20051024/1728413.gif" align="baseline" border="0" /></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 9pt; font-family: 宋体">图4. JUnit中的ComparisonError</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp; &nbsp;<font size="2">最后，我想说一下关于测试是开发过程中的必要部分的话题。测试代码一直是开发中的重要部分。经过近几年的发展，已得到了很大的提高，这要归功于强大的理论研究（比如&#8220;expectations-based development&#8221;等等），和快速发展的测试工具包，还有测试过程的改进。如果你对这篇文章感兴趣，那请你花一些时间来正式的学习一下测试理论吧，这对你的工作很有用。</font></span></p>
<img src ="http://www.blogjava.net/wjun530/aggbug/142766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wjun530/" target="_blank">王君</a> 2007-09-04 22:14 <a href="http://www.blogjava.net/wjun530/archive/2007/09/04/142766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>junit使用简明手册 </title><link>http://www.blogjava.net/wjun530/archive/2007/09/03/142468.html</link><dc:creator>王君</dc:creator><author>王君</author><pubDate>Mon, 03 Sep 2007 15:09:00 GMT</pubDate><guid>http://www.blogjava.net/wjun530/archive/2007/09/03/142468.html</guid><wfw:comment>http://www.blogjava.net/wjun530/comments/142468.html</wfw:comment><comments>http://www.blogjava.net/wjun530/archive/2007/09/03/142468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wjun530/comments/commentRss/142468.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wjun530/services/trackbacks/142468.html</trackback:ping><description><![CDATA[<div class="postText">用XP进行开发的过程，unit test是必不可少的环节。作为unit test，junit是首选的工具。本文从使用目的、如何使用、以及使用中需要考虑的问题，简略描述了junit的基本用法。<br />
<br />
使用目的<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;junit是java中书写unit test的framework，目前一些流行的unit test工具大都都是在junit上扩展而来的。目前它的版本是junit3.8.1，可以从www.junit.org上下载。<br />
<br />
用法<br />
1. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基本使用步骤，Junit的使用非常简单，它的基本使用步骤：<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;创建，从junit.framework.TestCase派生unit test需要的test case<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;书写测试方法，提供类似于如下函数签名的测试方法：<br />
<br />
public void testXXXXX();<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译，书写完test case后，编译所写的test case类<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运行，启动junit test runner，来运行这个test case。<br />
<br />
Junit提供了2个基本的test runner：字符界面和图形界面。启动命令分别如下：<br />
<br />
a 图形界面：<br />
<br />
java junit.swingui.TestRunner XXXXX<br />
<br />
b 字符界面：<br />
<br />
java junit.textui.TestRunner XXXXX<br />
<br />
2. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用例子：<br />
<br />
import junit.frmework.TestCase;<br />
<br />
public class TestSample extends TestCaset{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void testMethod1(){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertTrue( true);<br />
<br />
}<br />
<br />
}<br />
<br />
3. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setUp与tearDown，这两个函数是junit framework中提供初始化和反初始化每个测试方法的。setUp在每个测试方法调用前被调用，负责初始化测试方法所需要的测试环境；tearDown在每个测试方法被调用之后被调用，负责撤销测试环境。它们与测试方法的关系可以描述如下：<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;测试开始 -&gt; setUp -&gt; testXXXX -&gt; tearDown -&gt;测试结束<br />
<br />
<br />
<br />
<br />
4. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用例子：<br />
<br />
import junit.frmework.TestCase;<br />
<br />
public class TestSample extends TestCaset{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected void setUp(){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化&#8230;&#8230;<br />
<br />
}<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void testMethod1(){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertTrue( true);<br />
<br />
}<br />
<br />
<br />
<br />
potected void tearDown(){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//撤销初始化&#8230;&#8230;<br />
<br />
}<br />
<br />
}<br />
<br />
5. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;区分fail、exception。<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fail，期望出现的错误。产生原因：assert函数出错（如assertFalse(true)）；fail函数产生（如fail(&#8230;&#8230;)）。<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exception，不期望出现的错误，属于unit test程序运行时抛出的异常。它和普通代码运行过程中抛出的runtime异常属于一种类型。<br />
<br />
对于assert、fail等函数请参见junit的javadoc。<br />
<br />
6. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用例子：<br />
<br />
import junit.frmework.TestCase;<br />
<br />
public class TestSample extends TestCaset{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected void setUp(){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化&#8230;&#8230;<br />
<br />
}<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void testMethod1(){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean b= &#8230;&#8230;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertTrue( b);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new Exception( &#8220;This is a test.&#8221;);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fail( &#8220;Unable point.&#8221;); &nbsp;&nbsp;&nbsp;&nbsp;//不可能到达<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception e){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fail( &#8220;Yes, I catch u&#8221;); //应该到达点<br />
<br />
}<br />
<br />
&#8230;&#8230;<br />
<br />
}<br />
<br />
<br />
<br />
potected void tearDown(){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//撤销初始化&#8230;&#8230;<br />
<br />
}<br />
<br />
}<br />
<br />
7. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;组装TestSuite，运行更多的test。在junit中，Test、TestCase和TestSuite三者组成了composiste pattern。通过组装自己的TestSuite，可以完成对添加到这个TestSuite中的所有的TestCase的调用。而且这些定义的TestSuite还可以组装成更大的TestSuite，这样同时也方便了对于不断增加的TestCase的管理和维护。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;它的另一个好处就是，可以从这个TestCase树的任意一个节点（TestSuite或TestCase）开始调用，来完成这个节点以下的所有TestCase的调用。提高了unit test的灵活性。<br />
<br />
8. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用例子：<br />
<br />
import junit.framework.Test;<br />
<br />
import junit.framework.TestSuite;<br />
<br />
public class TestAll{<br />
<br />
public class TestAll{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义一个suite，对于junit的作用可以视为类似于java应用程序的main。<br />
<br />
&nbsp;&nbsp;&nbsp;public static Test suite(){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestSuite suite = new TestSuite("Running all tests.");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;suite.addTestSuite( TestCase1.class);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;suite.addTestSuite( TestCase2.class);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return suite;<br />
<br />
&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
<br />
运行同运行单独的一个TestCase是一样的，参见step 1 &#8220;运行&#8221;。<br />
<br />
9. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用Ant junit task。我们除了使用java来直接运行junit之外，我们还可以使用junit提供的junit task与ant结合来运行。涉及的几个主要的ant task如下：<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;junit&gt;，定义一个junit task<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;batchtest&gt;，位于&lt;junit&gt;中，运行多个TestCase<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;test&gt;，位于&lt;junit&gt;中，运行单个TestCase<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;formatter&gt;，位于&lt;junit&gt;中，定义一个测试结果输出格式<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;junitreport&gt;，定义一个junitreport task<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;report&gt;，位于&lt;junitreport&gt;中，输出一个junit report<br />
<br />
具体的语法请参见相关文档。<br />
<br />
10. &nbsp;&nbsp;使用例子：<br />
<br />
&lt;junit printsummary="yes" haltonfailure="no"&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&lt;classpath&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;path refid="classpath"/&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;pathelement location="${dist.junit}"/&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&lt;/classpath&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&lt;formatter type="brief" usefile="false"/&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&lt;formatter type="xml"/&gt;<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&lt;batchtest todir="${doc.junitReport}"&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset dir="${dist.junit}" includes="**/*Test.class" /&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&lt;/batchtest&gt;<br />
<br />
&lt;/junit&gt;<br />
<br />
<br />
<br />
&lt;junitreport todir="${doc.junitReport}"&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&lt;fileset dir="${doc.junitReport}"&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;include name="TEST*-*.xml"/&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&lt;/fileset&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&lt;report format="frames" styledir="${junit.styleDir}" todir="${doc.junitReport}"/&gt;<br />
<br />
&lt;/junitreport&gt;<br />
<br />
检查表<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;junit的使用并不很难，然而要书写一个好的TestCase却并非易事。一个不好的TestCase往往是既浪费了时间，也起不了实际的作用。相反，一个好的TestCase，不仅可以很好的指出代码中存在的问题，而且也可以作为代码更准确的文档，同时还在持续集成的过程中起非常重要的作用。在此给出书写TestCase时需要注意的几点：<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;测试的独立性：一次只测试一个对象，方便定位出错的位置。这有2层意思：一个TestCase，只测试一个对象；一个TestMethod，只测试这个对象中的一个方法。<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;给测试方法一个合适的名字。<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在assert函数中给出失败的原因，如：assertTrue( &#8220;&#8230; should be true&#8221;, &nbsp;&#8230;&#8230;)，方便查错。在这个例子中，如果无法通过assertTrue，那么给出的消息将被显示。在junit中每个assert函数都有第一个参数是出错时显示消息的函数原型。<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;测试所有可能引起失败的地方，如：一个类中频繁改动的函数。对于那些仅仅只含有getter/setter的类，如果是由IDE（如Eclipse）产生的，则可不测；如果是人工写，那么最好测试一下。<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在setUp和tearDown中的代码不应该是与测试方法相关的，而应该是全局相关的。如针对与测试方法A和B，在setUp和tearDown中的代码应该是A和B都需要的代码。<br />
<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;测试代码的组织：相同的包，不同的目录。这样，测试代码可以访问被测试类的protected变量/方法，方便测试代码的编写。放在不同的目录，则方便了测试代码的管理以及代码的打包和发布。一个例子如下：<br />
<br />
src &nbsp;&nbsp;&lt;=源代码根目录<br />
<br />
<img style="vertical-align: middle" height="19" src="http://www.uml.org.cn/j2ee/images/016.gif" width="19" border="0"  alt="" />-com<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img style="vertical-align: middle" height="19" src="http://www.uml.org.cn/j2ee/images/016.gif" width="19" border="0"  alt="" />-mod1<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img style="vertical-align: middle" height="19" src="http://www.uml.org.cn/j2ee/images/016.gif" width="19" border="0"  alt="" />-class1<br />
<br />
junit &nbsp;&nbsp;&lt;=测试代码根目录<br />
<br />
<img style="vertical-align: middle" height="19" src="http://www.uml.org.cn/j2ee/images/016.gif" width="19" border="0"  alt="" />-com<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img style="vertical-align: middle" height="19" src="http://www.uml.org.cn/j2ee/images/016.gif" width="19" border="0"  alt="" />-mod1<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img style="vertical-align: middle" height="19" src="http://www.uml.org.cn/j2ee/images/016.gif" width="19" border="0"  alt="" />-class1 <br />
</div>
 <img src ="http://www.blogjava.net/wjun530/aggbug/142468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wjun530/" target="_blank">王君</a> 2007-09-03 23:09 <a href="http://www.blogjava.net/wjun530/archive/2007/09/03/142468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>