JUnit4的Junit单元测试单类和多类.

本文介绍了如何使用JUnit4进行单元测试,包括创建测试类、遵循的规则、测试方法的编写、setUp和tearDown方法的使用,以及如何在没有IDE的情况下运行测试。此外,还展示了如何通过TestSuite进行多个测试类的整合测试,提高测试效率。
摘要由CSDN通过智能技术生成
 
  1. <pre name="code" class="java">注:转自JavaEye中zhouwendong006的博客http://zhouwendong006.iteye.com/blog/372795  
  2.   
  3. 1.  建立一个工程,取名随意。  
  4.   
  5. 2.  建立包(com.test.junit3),并建立一个计算类(Calculator),添加其相应的方法。完成后代码如下:  
  6.   
  7. Java代码   
  8. public class Calculator {      
  9.      
  10.     public int add(int a, int b) {      
  11.         return a + b;      
  12.     }      
  13.      
  14.     public int minus(int a, int b) {      
  15.         return a - b;      
  16.     }      
  17.      
  18.     public int multiply(int a, int b) {      
  19.         return a * b;      
  20.     }      
  21.      
  22.     public int divide(int a, int b) throws Exception {      
  23.         if (0 == b) {      
  24.             throw new Exception("除数不能为0!");      
  25.         }      
  26.         return a / b;      
  27.     }           
  28. }这里面的方法比较简单,不在解释。  
  29.   
  30. 3.  建立测试类。  
  31.   
  32.      a.  建立测试类的时候(我指的是使用Eclipse或者MyEclipse进行开发的时候),一般将测试类放到另外一个源文件夹中。在项目上点右键,选择new-->Source Folder。名字随意,一般取名字test。  
  33.   
  34.      b.  建立测试包。包名一般与需要被测试的类的包名相同,在这里,包名与Calculator类的包名相同(com.test.junit3)。  
  35.   
  36.      c.   建立测试类。测试类命名一般是需要被测试的类名加上后缀“Test”,这里为CalculatorTest。  
  37.   
  38. 4.  测试类需要注意的方面。在这里,也就是CalculatorTest需要遵守的规则。  
  39.   
  40.      a.  测试类必须继承TestCase类。  
  41.   
  42.      b.  测试方法必须为public型的,void的,没有方法参数,且方法名必须以“test”为前缀,即以test开头(如果不以test开头,那该方法需要手动启动测试。运行测试类的时候,该方法是无法被自动进行测试的)。  
  43.   
  44. 5. 实际的测试类。  
  45.   
  46. Java代码   
  47. package com.test.junit3;      
  48.      
  49. import junit.framework.Assert;      
  50. import junit.framework.TestCase;      
  51.      
  52. public class CalculatorTest extends TestCase{      
  53.      
  54.     private Calculator cal;      
  55.           
  56.     /**    
  57.      * 执行每一个测试方法的时候,先执行setUp();    
  58.      */     
  59.     protected void setUp() throws Exception {      
  60.         cal=new Calculator();             
  61.     }      
  62.      
  63.     /**    
  64.      * 执行每一个测试方法之后,执行tearDown();    
  65.      */     
  66.     protected void tearDown() throws Exception {      
  67.         super.tearDown();      
  68.     }      
  69.           
  70.     public void testAdd(){      
  71.         int result=cal.add(12);      
  72.         //断言:assert       
  73.         Assert.assertEquals(3, result);      
  74.     }      
  75.           
  76.     public void testMinus(){      
  77.         int result =cal.minus(12);      
  78.         Assert.assertEquals(-1, result);      
  79.     }      
  80.           
  81.     public void testMultiply(){      
  82.         int result =cal.multiply(23);      
  83.         Assert.assertEquals(6, result);      
  84.     }      
  85.           
  86.     public void testDivied(){      
  87.         int result=0;      
  88.         try {      
  89.             result = cal.divide(64);      
  90.         } catch (Exception e) {      
  91.             e.printStackTrace();      
  92.             Assert.fail();      
  93.         }      
  94.         Assert.assertEquals(1, result);      
  95.     }      
  96.           
  97.     public void testDivied2(){      
  98.         Throwable tx=null;      
  99.         try {      
  100.             cal.divide(40);      
  101.             Assert.fail();      
  102.         } catch (Exception e) {      
  103.             tx=e;      
  104.         }      
  105.                   
  106.         //断言tx是否为空       
  107.         Assert.assertNotNull(tx);      
  108.               
  109.         //断言两个对象是否相同       
  110.         Assert.assertEquals(Exception.class,tx.getClass());      
  111.               
  112.         //断言String是否相同       
  113.         Assert.assertEquals("除数不能为0!", tx.getMessage());      
  114.     }      
  115. }               
  116.     “Assert.fail;”表示该方法测试失败,它的目的是:假如它被执行到了,那么表示divide(int a,int b)方法没有抛出异常,也就是方法中有bug。  
  117.   
  118.        “tx=e;”将异常e赋给tx,将局部变量赋给全局变量,以便进行下面操作。  
  119.   
  120.        “Assert.assertNotNull(tx);”断言tx是否为空,如果tx为空,则说明divide(int a,int b)方法没有将异常抛出,方法中存在bug。  
  121.   
  122.        “Assert.assertEquals(Exception.class,tx.getClass());”。tx.getClass()可以得到tx,也就是这个异常是哪个类,然后断言是否与你期望的异常类相同。如果不同,测试失败,方法抛出异常错误,方法中存在bug。其实到这里可以结束了,而“Assert.assertEquals("除数不能为0!",tx.getMessage());”是为了通过断言异常信息,更进一步判断该异常是否是你在方法中指定的异常。  
  123.   
  124.        这样,通过这些断言,可以保证你的方法目前没有发现bug存在,测试的时候,该方法会通过,表现方式为TestBar为绿色通过。  
  125.   
  126. 6.  在测试的时候,再TestCase中有两个方法,一个为setUp(),表示初始化。该方法在每个测试方法执行之前将被首先执行。比如如果要执行testAdd()方法的时候,先要执行一遍setUp()方法。因此该方法一般进行一些初始化操作,比如对被测试类的实例化,如:  
  127.   
  128. Java代码   
  129. protected void setUp() throws Exception {      
  130.     cal=new Calculator();         
  131. }       
  132.        另一个方法为tearDown(),该方法在每个测试方法执行之后执行,因此该方法一般处理每个测试方法结束后的资源释放操作。  
  133.   
  134.        总的来说:如果测试类中有3个测试方法test1(),test2(),test3(),那么方法的执行顺序为  
  135.   
  136.        setUp()->test1()->tearDown()->setUp()->test2()->tearDown()->setUp()->test3()->tearDown()  
  137.   
  138. 7.  测试的时候,一般要注意临界值的测试。如除数不能为0,索引越界等问题。  
  139.   
  140. 8.  如果在没有IDE的情况下,可以通过使用TestRunner类进行测试,如以下代码所示  
  141.   
  142. Java代码   
  143. public static void main(String[] args) {      
  144.     junit.awtui.TestRunner.run(CalculatorTest.class);      
  145. }     
  146.    需要注意的是:在junit.awtui、junit.swingui和junit.textui三个包下均有TestRunner类,任何一个类都可以执行测试任务。只是表现的方式不同,看你喜欢用哪个了!  
  147. 9.  在执行多个测试类的时候,一个一个点运行,进行测试显然是非常费时的事情。junit提供了一个类TestSuite可以将多个测试类一起运行,进行测试。示例代码如下:  
  148.   
  149. Java代码   
  150. package com.test.junit3;      
  151.      
  152. import junit.framework.Test;      
  153. import junit.framework.TestCase;      
  154. import junit.framework.TestSuite;      
  155.      
  156. public class TestAll extends TestCase {      
  157.           
  158.     /**    
  159.      * 该方法名称必须为suite(),不能更改    
  160.      * 该方法中    
  161.      * TestSuite对象不仅可以添加测试类,还可以包装suite对象    
  162.      * @return    
  163.      */     
  164.     public static Test suite(){      
  165.               
  166.         TestSuite suite=new TestSuite();      
  167.         suite.addTestSuite(LargestTest.class);      
  168.         suite.addTestSuite(CalculatorTest.class);      
  169.               
  170.         return suite;      
  171.     }      
  172. }         
  173.        如注释所示,该静态方法名称必须为suite(),原因可以参看junit源代码。另外该方法返回Test对象。TestSuite中有两个方法很重要,一个是addTestSuite(),可以直接添加测试类。另一个方法为addTest(),可以添加TestSuite对象,所以,上面也可以通过下面的代码实现:  
  174.   
  175. Java代码   
  176. package com.test.junit3;      
  177.      
  178. import junit.framework.Test;      
  179. import junit.framework.TestCase;      
  180. import junit.framework.TestSuite;      
  181.      
  182. public class TestAll extends TestCase {      
  183.           
  184.     public static Test suite(){      
  185.               
  186.         TestSuite suite=new TestSuite();      
  187.               
  188.         TestSuite suite1=new TestSuite();      
  189.         suite1.addTestSuite(LargestTest.class);      
  190.               
  191.         TestSuite suite2=new TestSuite();      
  192.         suite2.addTestSuite(CalculatorTest.class);      
  193.               
  194.         suite.addTest(suite1);      
  195.         suite.addTest(suite2);      
  196.      
  197.         return suite;      
  198.     }      
  199. }     
  200.  这样我们可以方便的对多个测试类进行测试了。  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值