﻿<?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-离弦之ray的技术天空-随笔分类-JUnit</title><link>http://www.blogjava.net/clraychen/category/12103.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 17:56:05 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 17:56:05 GMT</pubDate><ttl>60</ttl><item><title>JUnit框架和组成</title><link>http://www.blogjava.net/clraychen/archive/2006/06/12/52265.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Mon, 12 Jun 2006 10:48:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2006/06/12/52265.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/52265.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2006/06/12/52265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/52265.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/52265.html</trackback:ping><description><![CDATA[import junit.framework.*;<br />public class TestSimple extends TestCase{<br />   public TestSimple(String name){<br />          super(name);<br />     }<br />   public void testAdd(){<br />            assertEquals(2,1+1);<br />     }<br />}<br />这是最简单的JUnit框架，你可以在一个测试方法里面加多个断言，但只要一个断言出问题了，下面的断言就不执行咯。<br /><br />但是调用其它测试类甚至一个测试系统该怎么办呢？<br />其实每个测试类都包含了一个<br />public static Test suite()方法，如果你没显式地实现它，系统会自动运行以test开头的方法<br /><br />import junit.framework.*;<br />public class TestSimple extends TestCase{<br />   public TestSimple(String method){<br />          super(method);<br />     }<br />   public void <font color="#ff0000">testA</font>(){<br />            ……<br />     }<br />   public void <font color="#ff0000">testB</font>(){<br />            ……<br />     }<br />   public void <font color="#ff0000">testC</font>(){<br />            ……<br />     }<br /><font color="#0000ff">   //如果你只想运行A和B 那么要这样写<br /></font>   public static Test suite(){<br />        TestSuite suite = new TestSuite();<br />        suite.addTest(new TestSimple("testA"));<br />        suite.addTest(new TestSimple("testB"));<br />        return suilte;<br />    }<br />}<br /><br />甚至有更高层的调用<br />suite.addTestSuite(TestClassOne.class);<br />suite.addTestSuite(TestClassTwo.suite());<br /><br />仔细观察这两句的调用方法和参数哦，应该不用多说什么了吧……<img src ="http://www.blogjava.net/clraychen/aggbug/52265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2006-06-12 18:48 <a href="http://www.blogjava.net/clraychen/archive/2006/06/12/52265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JUnit的各种断言</title><link>http://www.blogjava.net/clraychen/archive/2006/06/12/52077.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Sun, 11 Jun 2006 16:50:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2006/06/12/52077.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/52077.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2006/06/12/52077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/52077.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/52077.html</trackback:ping><description><![CDATA[        在上一篇中已经看到了assertEquals断言，还有其它断言吗？它们的原型又是怎样的呢？<br /><br />        首先是assertEquals<br />        它的函数原型是assertEquals([String message],expected,actual)其中String message 是可选的。这样就比较清楚啦，expected 是期望的值，而actual是事实上运行后得到的值。如果这两个值吻合，那么这个测试就通过了，Eclipse里面会出现一个<font style="BACKGROUND-COLOR: #ffffff" color="#008000">绿色</font>的长条，看到它是心旷神怡啊。否则，长条就是<font color="#ff0000">红色</font>的，就要去改程序啦。<br /><br />         接下来介绍其它几个断言。<br />         assertNull([String message],java.lang.Object object ) 这是判断对象是否为空<br />         相对的<br />         还有一个：<br />         assertNotNull([String message],java.lang.Object object)这是判断对象是否不为空<br /><br />         assertSame([String message],expected,actual)判断expected 和actual引用的是否为同一个对象<br /><br />         assertTrue([String message],boolean condition)判断条件是否为true<br /><br />         当然还有assertFalse啦<br /><br />          另一个比较另类的函数是fail([String message])其中String message 是可选的。<br />          这个断言会让测试立即失败，主要用在某个不应该被到达的分支，比如在一个预期发生的异常之后。<img src ="http://www.blogjava.net/clraychen/aggbug/52077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2006-06-12 00:50 <a href="http://www.blogjava.net/clraychen/archive/2006/06/12/52077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JUnit初试</title><link>http://www.blogjava.net/clraychen/archive/2006/06/11/51913.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Sat, 10 Jun 2006 16:26:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2006/06/11/51913.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/51913.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2006/06/11/51913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/51913.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/51913.html</trackback:ping><description><![CDATA[
		<p>     闲逛东大浦口图书馆，看到《单元测试之道——java版》，早已闻此书之大名，借来一阅。<br /><br />      JUnit有多重要等等就不多说了，如果你想接触它，Come on，书上有个简单的例子。下面是一个被测试的例子：<br /><br />public class Largest {<br />     public static int largest(int[] list)<br />    {<br />          int index, max = Integer.MAX_VALUE;<br />          for(index=0;index&lt;list.length－1;index++){<br />          if(list[index]&gt;max)max=list[index];<br />          }<br />         return max;<br />         }<br />}<br />这是一段有错误的程序，明眼人应该能看出来，以它来说明JUnit的用法。<br />我使用的Eclipse 3.1 ,JDK是1.4.2版本的。<br /><br />在此工程里新建一个JUnit Test Case（JUnit在整个工程中所占的位置在后面有说暂时就随意了，可以放在被测程序同一个package内，也可以重新新建一个package）<br /><br />刚生成的Test Case是如下这样的<br />package com.test.ray;</p>
		<p>import junit.framework.TestCase;</p>
		<p>public class TestLargest <font color="#ff0000">extends TestCase</font> {<br />}<br />标记红色是因为这是一个test case 一定要继承的，而上面引用进来的junit.framework.TestCase包含了一个TestCase的具体框架。<br /><br />跟普通的类一样，它需要一个构造函数。<br />public TestLargest(String name)<br /> {<br />  super(name);<br /> }<br />其中的name到底是什么，下一篇再讲。<br />接下来就可以写测试函数了，如果你想让自己写的测试函数自动被编译器运行的话，请务必以test作为方法名的开头。<br />public void testSimple()<br /> {<br />  assertEquals(9,Largest.largest(new int[]{7,8,9}));<br />  assertEquals(-7,Largest.largest(new int[]{-8,-7,-9}));<br /> }<br /><br />测试方法体一般是有断言组成的（关于断言的内容，以后再讲），第一个断言主要是测试边界的，可以看到9位于数组的最后，运行后可以在Eclipse里面看到一个红条，会有相关的错误信息。<br />junit.framework.AssertionFailedError: expected:&lt;9&gt; but was:&lt;2147483647&gt;<br /> 从此你可以分析到，程序中循环语句判断条件应该是<font color="#ff0000">index&lt;list.length,哈哈，</font><font color="#000000">一个错误找到了。<br /><br />可是改过之后还是有错<br />仔细看看……<br />God，<font color="#ff0000">max的初始化</font>！！！<br />可能很多人会想当然地把它改成max＝0；<br />让我们看看接下来会发生什么。<br />junit.framework.AssertionFailedError: expected:&lt;-7&gt; but was:&lt;0&gt;<br />知道为什么了吗？如果数组里面有负数，得到的结果当然是0了。<br />应该是这样<font color="#ff0000">max＝Integer.MIN_VALUE</font>;<br />测试顺利通过！<br /></font><font color="#000000"><br />其实这个程序还是有漏洞的，就是如果传入的数组是一个空数组的情况，可以这样改写<br />public class Largest {<br /> public static int largest(int[] list)<br /> {<br />  int index, max = Integer.MIN_VALUE;<br /> <font color="#ff0000"> if(list.length==0){throw new RuntimeException("Empty list");}<br /></font>  for(index=0;index&lt;list.length;index++)<br />  {<br />   if(list[index]&gt;max)max=list[index];<br />  }<br />  return max;<br /> }<br />}<br /><br />对应的Test Case也改变一下<br />public class TestLargest extends TestCase {<br /> public TestLargest(String name)<br /> {<br />  super(name);<br /> }<br /> public void testSimple()<br /> {<br />  assertEquals(9,Largest.largest(new int[]{7,8,9}));<br />  assertEquals(-7,Largest.largest(new int[]{-8,-7,-9}));<br /> }<br /> <font color="#ff0000">public void testEmpty()<br /> {<br />  try{<br />   Largest.largest(new int[]{});<br />   fail("lallal");<br />   }catch(RuntimeException e){System.out.println("cuo la!");}<br /> }<br /></font>}<br />增加了一个测试数组为空的测试方法，从Test Case下面的Console中可以知道Test Case 已经捕获了这个异常。<br /><br />好了，今天就写到这里，下次有更精彩的内容哦。<br /></font></p>
		<p> </p>
<img src ="http://www.blogjava.net/clraychen/aggbug/51913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2006-06-11 00:26 <a href="http://www.blogjava.net/clraychen/archive/2006/06/11/51913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>