`
i_am_birdman
  • 浏览: 280897 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Junit 4

阅读更多

  近期写单元测试计划,公司准备把junit3.8升级到junit4以上的版本,所以研究了一下,写下学习过程和心得体会,为了巩固学习成果,所以把学习心得写下来加深印象,也供需要的朋友查阅,少走弯路。 
   好了,废话不多说,直接开始: 
   假设我们要写一个整数除法和乘法的类,并且给他写测试用例: 

1) 建立Math类
 
工具是eclipse3.3 

Java代码
  1. /**  
  2.  * @author bulargy.j.bai  
  3.  * @mail bulargy@gmail.com  
  4.  * @创建时间:Mar 10, 2008  
  5.  * @描述:一个整数除法和乘法的工具类  
  6.  */  
  7. public class Math {   
  8.     public static int divide(int x,int y) {   
  9.         return x/y;   
  10.     }   
  11.   
  12.     public static int multiple(int x,int y) {   
  13.         return x*y;   
  14.     }   
  15. }  


2) 建立测试用例 
选中需要建立测试用例的包,选择new->other->JUnit Test Case。 
有5个方法可以选择: 
setUp()方法在测试方法前调用,一般用来做测试准备工作。 
tearDown()方法在测试方法后调用,一般作测试的清理工作。 
setUpBeforeClass()方法在整个类初始化之后调用,一般用来做测试准备工作。 
tearDownAfterClass()方法在整个类结束之前调用,一般作测试的清理工作。 
constructor()为是否包含构造方法。 

自动生成的代码如下: 
Java代码
  1. /**  
  2.  * @author bulargy.j.bai  
  3.  * @mail bulargy@gmail.com  
  4.  * @创建时间:Mar 11, 2008  
  5.  * @描述:  
  6.  */  
  7. public class MathTest {   
  8.   
  9.     @BeforeClass  
  10.     public static void setUpBeforeClass() throws Exception {   
  11.     }   
  12.   
  13.     @AfterClass  
  14.     public static void tearDownAfterClass() throws Exception {   
  15.     }   
  16.        
  17.     @Test  
  18.     public void testDivide() {   
  19.         fail("Not yet implemented");   
  20.     }   
  21.   
  22.     @Test  
  23.     public void testMultiple() {   
  24.         fail("Not yet implemented");   
  25.     }   
  26. }  

说明: 
@BeforeClass标签注释的方法用于在整个类测试过程的初始化后调用一次,@AfterClass标签注释的方法则是整个测试类结束之前调用一次。这2个标签的搭配可以避免使用@Before、@After标签组合在每个测试方法前后都调用的弊端,减少系统开销,提高系统测试速度。(不过对环境独立性要求较高的测试还是应当使用@Before、@After来完成) 
@Test标签用来标注待测试的方法,按照类中声明的顺序执行。
 

我们在testDivide方法加入测试代码,分别测试三种情况: 
a. 完全正确也没有可能出错的数据,如:9除3  结果必须等于3 
b. 可能有问题的边缘数据,如:10除3 结果也必须等于3 
c. 错误的数据,如:10除0 必须抛出异常 

忽略testMultiple方法 

代码如下: 
Java代码
  1. @Test(expected=ArithmeticException.class)   
  2. public void testDivide() {   
  3.     assertEquals(3,Math.divide(9,3));   
  4.     assertEquals(3,Math.divide(10,3));   
  5.     Math.divide(10,0); //除数不能为0,会抛出异常   
  6. }   
  7.   
  8. @Ignore("忽略乘法测试")   
  9. @Test  
  10. public void testMultiple() {   
  11. }  

说明: 
Junit4为测试方法增加了判断异常的方式,避免了以前还要通过try/catch块捕捉异常再抛出的复杂方式,简单的这样声明“@Test(expected=ArithmeticException.class)”Junit4就会检查此方法是否抛出ArithmeticException异常,如果抛出则测试通过,没抛出则测试不通过(@Test标签还有一些其他参数,例如超时测试@Test(timeout=1)这样,但是由于并不能准确反应实际时间,所以应用较少,经过我测试误差太大绝对不适合拿来做超时测试的) 
@Ignore标签会告诉Junit4忽略它所标注的方法,例如数据库不可用时可以用此标注标注一些测试数据库连接的方法来避免测试失败。 

3) 运行测试 
系统会打开JUnit透视图,如果测试全部通过,则显示颜色条为绿色;我们将assertEquals(3,Math.divide(9,3));改成assertEquals(2,Math.divide(9,3));则显示颜色条为红色,我们可以对错误或者故障的地方进行追踪。 

4) 创建测试套件 
  测试套件可以将多个测试用例合在一起测试,将相关的测试用例合成一个测试套件,在做一个修改后,只需要运行测试套件就可以,不需要运行每一个测试用例。 
  Junit4没有采用以前的套件测试方法,同样使用annotation的方式来进行。简单在你所要构建测试套件的包里创建一个文件,一般以包名+4Suite 
下面我在上面的测试包中复制一下之前的测试类并且一个改名字叫做MathTestAnother,新建一个class类叫做Uitl4Suite,代码如下: 
Java代码
  1. import org.junit.runner.RunWith;   
  2. import org.junit.runners.Suite;   
  3. import org.junit.runners.Suite.SuiteClasses;   
  4. /**  
  5.  * @author bulargy.j.bai  
  6.  * @mail bulargy@gmail.com  
  7.  * @创建时间:Mar 11, 2008  
  8.  * @描述:util包的测试套件  
  9.  */  
  10. @RunWith(Suite.class)   
  11. @SuiteClasses({MathTest.class,   
  12.            MathTestAnother.class})   
  13. public class Util4Suite {   
  14. }  

说明: 
通过@RunWith和@SuiteClasses标签来注释一个空的包含无参数构造函数的类来作为套件类,将需要组成套件运行的类加到@SuiteClasses的属性中即可。 

可以看到运行套件类的结果是2个测试类都进行了测试。 

5) 参数测试 
修改 testMultiple 
Java代码
  1. //@Ignore("忽略乘法测试")   
  2. @Test  
  3. public void testMultiple() {   
  4.     assertEquals(result,Math.multiple(faciend,multiplicator));   
  5. }  

编写参数方法: 
Java代码
  1. @Parameters  
  2.     public static Collection multipleValues() {   
  3.         return Arrays.asList(new Object[][] {   
  4.         {326 },   
  5.         {4312 },   
  6.         {215105 },   
  7.         {1122242 },   
  8.         {8972 }});   
  9.     }  

说明: 
需要使用@Parameters标签注解一个静态的返回集合对象的方法 

增加成员变量和构造函数: 
Java代码
  1. int faciend;   
  2. int multiplicator;   
  3. int result;   
  4.   
  5. public MathTest(int faciend, int multiplicator, int result) {   
  6.     this.faciend = faciend;   
  7.     this.multiplicator = multiplicator;   
  8.     this.result = result;   
  9. }  

最后在给测试类增加如下注释: 
Java代码
  1. @RunWith(Parameterized.class)  


完整的循环测试代码如下: 
Java代码
  1. import static org.junit.Assert.*;   
  2.   
  3. import java.util.Arrays;   
  4. import java.util.Collection;   
  5.   
  6. import org.junit.AfterClass;   
  7. import org.junit.BeforeClass;   
  8. import org.junit.Ignore;   
  9. import org.junit.Test;   
  10. import org.junit.runner.RunWith;   
  11. import org.junit.runners.Parameterized;   
  12. import org.junit.runners.Parameterized.Parameters;   
  13.   
  14. /**  
  15.  * @author bulargy.j.bai  
  16.  * @mail bulargy@gmail.com  
  17.  * @创建时间:Mar 11, 2008  
  18.  * @描述:  
  19.  */  
  20. @RunWith(Parameterized.class)   
  21. public class MathTest {   
  22.     int faciend;   
  23.     int multiplicator;   
  24.     int result;   
  25.   
  26.     public MathTest(int faciend, int multiplicator, int result) {   
  27.          this.faciend = faciend;   
  28.          this.multiplicator = multiplicator;   
  29.          this.result = result;   
  30.     }   
  31.   
  32.     @BeforeClass  
  33.     public static void setUpBeforeClass() throws Exception {   
  34.     }   
  35.   
  36.     @AfterClass  
  37.     public static void tearDownAfterClass() throws Exception {   
  38.     }   
  39.   
  40.     @Test(expected=ArithmeticException.class)   
  41.     public void testDivide() {   
  42.         assertEquals(3,Math.divide(9,3));   
  43.         assertEquals(3,Math.divide(10,3));   
  44.         Math.divide(10,0);//除数不能为0,会抛出异常   
  45.   
  46.     }   
  47.   
  48.     //@Ignore("忽略乘法测试")   
  49.     @Test  
  50.     public void testMultiple() {   
  51.         assertEquals(result,Math.multiple(faciend,multiplicator));   
  52.     }   
  53.        
  54.     @Parameters  
  55.     public static Collection multipleValues() {   
  56.      return Arrays.asList(new Object[][] {   
  57.         {326 },   
  58.         {4312 },   
  59.         {215105 },   
  60.         {1122242 },   
  61.         {8972 }});   
  62.     }   
  63.   
  64. }  

OK,大功告成。测试看看吧,测试类跑了5次~~。 

大概就这么多体会了,总得来说JUnit4以后测试还是很方便的,顺便这个是仅仅是为了做例子,实际使用中由于JUnit4不再受命名的限制,所以应该划分更细粒度的测试来完成,一个方法的正确,异常,错误及边界数据完全可以分开来写测试方法。由于大部分情况资源只用加载和释放一次就足够,大大提高的测试的速度,再也不会有以前那样点开测试然后去泡咖啡的情况出现了~~呵呵~~

分享到:
评论

相关推荐

    junit4 jar完整包

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了一种方便、高效的方式来验证代码的正确性。这个“junit4 jar完整包”包含了所有你需要进行单元测试的类和接口,使得测试过程变得简单且易于...

    junit4 jar包

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了编写可重复执行、易于维护的测试代码的能力。这个“junit4 jar包”包含了运行JUnit4测试所必需的库文件,主要包括两个核心组件:`junit-4.11....

    junit4学习文档

    ### JUnit4 学习知识点详解 #### 一、JUnit4 概述 JUnit4 是 JUnit 测试框架的一个重大更新版本,它充分利用了 Java 5 的注解(Annotation)特性来简化测试用例的编写过程。注解是一种元数据,用于描述程序中的...

    junit4测试jar包

    JUnit4测试框架是Java开发中广泛使用的单元测试工具,它为开发者提供了编写和运行可重复、可靠的测试用例的能力。这个“junit4测试jar包”包含了一切你需要在项目中集成JUnit4进行测试的库文件。只需将其复制到你的...

    powermock-module-junit4-2.0.9-API文档-中英对照版.zip

    赠送jar包:powermock-module-junit4-2.0.9.jar; 赠送原API文档:powermock-module-junit4-2.0.9-javadoc.jar; 赠送源代码:powermock-module-junit4-2.0.9-sources.jar; 赠送Maven依赖信息文件:powermock-...

    JUnit4JUnit4JUnit4(文档)

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了强大的工具来编写、组织和执行单元测试。JUnit4引入了许多改进和新特性,极大地提升了测试的灵活性和效率。下面将详细介绍JUnit4的关键概念、...

    junit4教程(《Junit4初探》)

    **JUnit4教程——初探单元测试的艺术** JUnit4是Java编程语言中广泛使用的单元测试框架,它是Java开发者进行软件质量保证的重要工具。本教程将深入浅出地介绍JUnit4的基本概念、核心特性以及如何在实际项目中应用它...

    Junit4简单实用

    总结来说,JUnit4 是对 JUnit3 的一个重要升级,它利用 Java 5 的注解特性极大地简化了测试用例的编写,提高了测试代码的可读性和可维护性。通过使用注解,开发者能够更自由地组织测试逻辑,同时也能够方便地扩展...

    Junit4教程非常详尽

    JUnit4 教程详尽 JUnit4 是 JUnit 框架有史以来的最大改进,其主要目标便是利用 Java5 的 Annotation 特性简化测试用例的编写。下面是对 JUnit4 的详细介绍: 一、Annotation 简介 Annotation 是 Java5 中引入的...

    在Eclipse中使用JUnit4进行单元测试

    在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...

    Junit4单元测试入门例子

    Junit4作为Java领域最常用的单元测试框架,为开发者提供了方便、高效的测试工具。本文将深入探讨如何使用Junit4对名为Calculate的类进行单元测试,包括其加减乘除四个方法。 首先,我们需要了解Junit4的基本结构和...

    junit4 jar包 Java单元测试框架绿色免费版.zip

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了一种方便、高效的方式来验证代码的正确性。这个“junit4 jar包 Java单元测试框架绿色免费版.zip”文件包含的是JUnit4框架的可执行jar包,用于...

    JUnit4基础文档

    JUnit4基础文档 单元测试是软件测试的一种,旨在检验软件的正确性和可靠性。JUnit是一个流行的单元测试框架,广泛应用于Java开发中。本文档介绍了JUnit4的基础知识,包括单元测试的概念、JUnit4的HelloWorld示例、...

    Junit4完整源码

    JUnit4 是一个广泛使用的Java编程语言的单元测试框架。它为开发者提供了一种方便的方式来编写和执行可重复的、自动化的测试用例,确保代码的质量和功能稳定性。JUnit4源码的完整版本包含了整个框架的实现细节,对于...

    Junit4使用方法

    JUnit4 使用方法 JUnit4 是一个流行的 Java 单元测试框架,提供了许多功能强大且灵活的测试工具。本文将详细介绍 JUnit4 的使用方法和核心概念。 JUnit4 核心概念 JUnit4 的核心概念包括测试类、测试集和测试运行...

    Junit4电子教程 api

    JUnit4 是一个广泛使用的Java编程语言的单元测试框架,它为开发者提供了编写和运行可重复测试的工具。这个“Junit4电子教程 API”可能是针对如何有效地利用JUnit4 API进行测试编写的一份详细指南。在Java开发过程中...

    Junit4所需jar包

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了强大的测试工具,能够帮助他们编写可重复运行的、可靠的单元测试。在Java项目中,为了使用JUnit4进行测试,我们需要引入相应的jar包。这里...

    junit4单元测试

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了一种方便、高效的方式来验证代码的正确性。这个压缩包文件包含了JUnit4的相关库,使得开发人员能够轻松地在他们的项目中引入单元测试功能。...

    junit4 单元测试源码

    【标题】"junit4 单元测试源码"涉及的是Java编程中单元测试的重要工具JUnit4的使用,这是对代码进行验证和调试的关键部分。JUnit4是JUnit框架的一个版本,它提供了更灵活的注解、测试套件管理和断言方式,使得编写...

Global site tag (gtag.js) - Google Analytics