`

JUnit4 和JUnit3的区别

    博客分类:
  • Java
阅读更多

    为了说明JUnit4JUnit3 的区别,我们先看代码:
    Largest.java: 这是一个测试类

//测试类
public class Largest {
  public Largest() {
  }
   public static int largest(int[] list){//用于求该数组的最大值,为了测试方便,该方法为静态方法
     int index,max=Integer.MAX_VALUE;
     for(index=0;index<list.length-1;index++){
       if(list[index]>max){
         max=list[index];
       }
     }
     return max;
   }
}

    首先看JUnit3 的 测试用例:TestLargest.java :

import junit.framework.TestCase;

//这是用Junit3创建的,没有报错。
public class TestLarget extends TestCase {

 protected void setUp() throws Exception {
  super.setUp();
 }
 
 public void testSimple()
 {
  assertEquals (9, Largest.largest(new int[]{9,8,7}));
 }

 protected void tearDown() throws Exception {
  super.tearDown();
 }

}

   然后我们再看用JUnit4 的测试用例:TestLargest.java:

//注意下面的包org.junit.After,org.junit.Before
import org.junit.After;
import org.junit.Before;
//为了测试自己写的脚本,要引入包:
import org.junit.Test;
import org.junit.Assert;//assertEquals方法等都在Assert.中

//此种是自己New的一个Junit Test Case, 然后选择了自动添加setUp和tearDown方法。注意在两个方法的前面有两个标记:@Before和@After
public class TestLargest {

 @Before
 public void setUp() throws Exception {
 }

 @Test //此处必须加
 public void testSimple()
 {
  //assetEquals(9,Largest.largest(new int[]{9,8,7}));//为什么assetEquals()报错呢
  Assert.assertEquals( 9,Largest.largest(new int[]{9,8,7}));//避免上面的错误,要用此种形式
 }
 @After
 public void tearDown() throws Exception {
 }

}

    下面的这个是右键 Largest.java,New->JUnit Test Case,自动生成的测试框架(JUnit4),LargestTest.java:

import static org.junit.Assert.*;

import org.junit.Test;

//此种方法为自动生成的框架。然后填写代码即可。右键 Larget.java,New->Junit Test Case
public class LargestTest {

 @Test
 public void testLargest() {
  fail("Not yet implemented");
 }
}

    然后我们自己添加代码即可。
    有上面的代码对比,我们可以总结JUnit4和JUnit3的区别 主 要有两点:
    1. JUnit4 利用了 Java 5 的新特性 " 注释 " ,每个测试方法都不需要以 testXXX 的方式命名 , 行时不在用反射机制来查找并测试方法,取而带之是用 @Test 来标注每个测试方法,效率提升
    2. JUnit4中 测试类不必 继承 TestCase 了, 另外要注意JUnit4和JUnit3引入的包完全不同。
            PS: Eclipse 中要使用 Junit 的话,必须要添加 Junit library
    3.JUnit4和JUnit3在测试Suite时也有很大不同: 例如我们有两个测试类Product.javaShoppingCart.java ,还涉及到一个异常类ProductNotFoundException.java:

Product.java:

public class Product {
  private String title;
 private double price;

 public Product(String title, double price) {
     this.title = title;
     this.price = price;
 }

 public String getTitle() {
     return title;
 }

 public double getPrice() {
     return price;
 }

 public boolean equals(Object o) {
     if (o instanceof Product) {
         Product p = (Product)o;
         return p.getTitle().equals(title);
     }

     return false;
 }

}


ShoppingCart.java:

import java.util.*;

public class ShoppingCart
{
  private  ArrayList items;
 
  public ShoppingCart()
  {
    items=new ArrayList();
  }
   public double getbalance()
   {
     double balance=0.00;
     for(Iterator i=items.iterator();i.hasNext();)
     {
       Product item=(Product)i.next();
       balance+=item.getPrice();
     }
     return balance;
     }
  
    public void addItem(Product item) {
      items.add(item);
  }

  public void removeItem(Product item) throws ProductNotFoundException {
      if (!items.remove(item)) {
          throw new ProductNotFoundException();
      }
  }

  public int getItemCount() {
      return items.size();
  }

  public void empty() {
      items.clear();
  }
}


ProductNotFoundException.java:


public class ProductNotFoundException extends Exception {

    public ProductNotFoundException() {
        super();
    }
}
    下面是用JUnit4 写的测试类:
ProductTest.java:

import junit.framework.TestCase;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.Assert;


public class ProductTest extends TestCase//extends完全可以不写,只是为了把测试方法加入到suite中
{

 private Product p;
 public ProductTest() {
   }
 
 //这是为了AllTests类做的铺垫
 public ProductTest(String method)
 {
  super(method);
 }
 
 @Before
 public void setUp() throws Exception {
  p=new Product("a book",32.45);
 }

 @After
 public void tearDown() throws Exception {
 }
 
 @Test
 public void testGetTitle()
   {
     Assert. assertEquals("a book",p.getTitle());
   }
 
 @Test
 public void testSameRefrence()
   {
     //product q=new product("a sheet",12.56);
     Product q=p;
     Assert. assertSame("not equale object",p,q);
   }
 @Test
    public void  testEquals()
    {
      String q="Yest";
      Assert. assertEquals("should not equal to a string object",false,p.equals(q));
    }
 
 @Test
    public void testGetPrice()
    {
      Assert. assertEquals(32.45,p.getPrice(),0.01);
    }

}


ShoppingCartTest.java:

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;


public class ShoppingCartTest {

  private ShoppingCart cart;
   private Product book1;
  
   public ShoppingCartTest(){
   }
 @Before
 public void setUp() throws Exception {
  cart = new ShoppingCart();
      book1 = new Product("Pragmatic Unit Testing", 29.95);
      cart.addItem(book1);
 }

 @After
 public void tearDown() throws Exception {
 }
 
 @Test
 public void testEmpty() {
       cart.empty();
       Assert. assertEquals(0, cart.getItemCount());
   }

 @Test
   public void testAddItem() {

       Product book2 = new Product("Pragmatic Project Automation", 29.95);
       cart.addItem(book2);

       Assert. assertEquals(2, cart.getItemCount());

       double expectedBalance = book1.getPrice() + book2.getPrice();
       
       Assert. assertEquals(expectedBalance, cart.getbalance(), 0.0);
   }


   //抛出异常
 @Test
   public void testRemoveItem() throws ProductNotFoundException {

       cart.removeItem(book1);
       Assert. assertEquals(0, cart.getItemCount());
   }

 @Test
   public void testRemoveItemNotInCart() {//需要捕捉异常
       try {

           Product book3 = new Product("Pragmatic Unit Testingx", 29.95);
           cart.removeItem(book3);

           Assert. fail("Should raise a ProductNotFoundException");

       } catch(ProductNotFoundException expected) {
        Assert. assertTrue(true);
       }
   }
}
    下面是测试套件的类:TestSuite.java(JUnit4)

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

//通过下面的形式运行套件,必 须构造一个空类
@RunWith(Suite.class)
@Suite.SuiteClasses({ShoppingCartTest.class,ProductTest.class})

public class TestSuite {

}
    另外为了在Suite添加一个测试方法,我们可以采用下面的一个办法:AllTests.java:

import junit.framework.Test;
import junit.framework.TestSuite;

public class AllTests {

 public static Test suite() {
  TestSuite suite = new TestSuite("Test for default package");
  suite.addTest(new ProductTest("testGetTitle"));//注意此时ProductTest必须要继承TestCase
  return suite;
 }

}
    作为对比,我们再看一下JUnit3 写的测试类:
productTest.java:

import junit.framework.TestCase;

public class productTest extends TestCase {
   private product p;
   public productTest() {
   }
   public void setUp()
   {
      p=new product("a book",32.45);
   }
   public void tearDown()
   {
   }
   public void test GetTitle()
   {
     assertEquals ("a book",p.getTitle());
   }
   public void test SameRefrence()
   {
     //product q=new product("a sheet",12.56);
     product q=p;
     assertSame ("not equale object",p,q);
   }
    public void  test Equales()
    {
      String q="Yest";
      assertEquals ("should not equal to a string object",false,p.equals(q));
    }
 }


ShoppingCartTest .java:

import junit.framework.*;

public class ShoppingCartTest extends TestCase {
  private ShoppingCart cart;
  private product book1;
  public ShoppingCartTest(){

  }
  public ShoppingCartTest(String method){
    super(method);
  }
  /**
   * 建立测试 fixture.
   * 每个test函数运行之前都执行.
   */
  protected void setUp() {

      cart = new ShoppingCart();

      book1 = new product("Pragmatic Unit Testing", 29.95);

      cart.addItem(book1);
  }

  /**
   * 销毁fixture.
   * 每个测试函数执行之后都运行
   */
  protected void tearDown() {
      // release objects under test here, as necessary
  }


  public void test Empty() {

      cart.empty();

      assertEquals (0, cart.getItemCount());
  }


  public void test AddItem() {

      product book2 = new product("Pragmatic Project Automation", 29.95);
      cart.addItem(book2);

      assertEquals (2, cart.getItemCount());

      double expectedBalance = book1.getPrice() + book2.getPrice();
      assertEquals (expectedBalance, cart.getbalance(), 0.0);
  }


  public void test RemoveItem() throws productNotFoundException {

      cart.removeItem(book1);

      assertEquals (0, cart.getItemCount());
  }


  public void test RemoveItemNotInCart() {

      try {

          product book3 = new product("Pragmatic Unit Testingx", 29.95);
          cart.removeItem(book3);

          fail("Should raise a ProductNotFoundException");

      } catch(productNotFoundException expected) {
          assertTrue (true);
      }
  }
  public static Test suite(){
    TestSuite suite=new TestSuite();
    suite.addTest(new ShoppingCartTest("testRemoveItem"));
    suite.addTest(new ShoppingCartTest("testRemoveItemNotInCart"));
    return suite;
  }

}
    下面这个是测试Suite的测试类:TestClassComposite .java(JUnit3):

import junit.framework.*;

public class TestClassComposite {//be a base class,extendding from TestCase is of no necessary.
  public static Test suite() { //注意suite的大小写
    TestSuite suite = new TestSuite();
    suite.addTestSuite(productTest.class);
    suite.addTest(ShoppingCartTest.suite());
    return suite;
  }
}
    通过代码,我们可以清楚的看到JUnit4和 JUnit2在测试套件时的区别,JUnit4在测试套件时,必须构造一个空类,而且使用Annotation的形式,即
@RunWith(Suite.class)
@Suite.SuiteClasses({ShoppingCartTest.class,ProductTest.class}),而JUuni3则 是普通的直接用函数调用,添加Suite。

分享到:
评论

相关推荐

    junit4 jar完整包

    这个“junit4 jar完整包”包含了所有你需要进行单元测试的类和接口,使得测试过程变得简单且易于维护。下面我们将深入探讨JUnit4的核心概念、功能以及如何使用它。 首先,JUnit4是JUnit系列的一个重大升级,引入了...

    junit4学习文档

    在 JUnit3 中,使用 `setUp` 和 `tearDown` 方法来进行测试前后的初始化和清理工作。而在 JUnit4 中,使用 `@Before` 和 `@After` 注解替代了这些方法。 #### 四、JUnit4 实践案例 下面是一个使用 JUnit4 编写的...

    junit4 jar包

    这个“junit4 jar包”包含了运行JUnit4测试所必需的库文件,主要包括两个核心组件:`junit-4.11.jar`和`hamcrest-core-1.3.jar`。 `junit-4.11.jar`是JUnit的主要库,包含了JUnit4.11版本的所有功能。这个版本引入...

    junit4测试jar包

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

    JUnit4JUnit4JUnit4(文档)

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

    junit4教程(《Junit4初探》)

    与JUnit3相比,JUnit4的灵活性和可扩展性得到了显著提升,使得测试驱动开发(TDD)在Java领域变得更加普及。 ## 二、JUnit4的核心组件 ### 1. 测试注解 - `@Test`: 表示一个方法是测试方法,可以包含断言。 - `@...

    junit3.8 和junit4 api

    5. **分类(Categories)**:在JUnit 4中引入,用于组织和筛选测试,但JUnit 3没有这个功能。 **JUnit 4 API** JUnit 4是一个重大的更新,引入了许多新特性和改进,使得测试更加灵活和强大: 1. **测试注解...

    Junit4简单实用

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

    Junit4教程非常详尽

    同时,JUnit4 也提供了更多的元数据来描述测试方法的行为,从而使得测试用例更加灵活和可靠。 五、JUnit4 的应用场景 JUnit4 可以应用于各种 Java 项目的测试中,包括单元测试、集成测试、功能测试等。使用 JUnit4...

    Junit4完整源码

    3. **JUnit4的扩展**: - **Test Rules**:可以通过实现`org.junit.rules.TestRule`接口来创建自定义测试规则,增强测试的功能。 - **Test Execution Listeners**:监听测试执行过程,通过实现`org.junit.runner....

    JUnit4基础文档

    要使用JUnit4进行单元测试,需要创建一个测试类和测试方法。测试类通常放在test包中,类名用XXXTest结尾。测试方法用testMethod命名。下面是一个简单的JUnit4 HelloWorld示例: 首先,创建一个测试类:...

    单元测试JUnit4和DbUnit

    为了更好地学习和实践这些概念,文档"单元测试JUnit4和DbUnit.doc"可能包含了详细的步骤和示例代码,而"dbunitAndJunit4"和"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-...

    Junit4.zip

    JUnit4作为Java平台上的主流单元测试工具,为开发者提供了丰富的注解和API,使得测试用例的编写更为简洁明了。 JUnit4引入了许多新特性,如注解(Annotations)和参数化测试。注解使得测试类和方法的声明更加直观,...

    Junit4使用方法

    * 向后兼容,可以运行 JUnit3 的测试 * 提供了多种 assert 方法,方便测试结果的检查 * 可以与各种流行工具(如 Ant 和 Maven)集成 * 可以与流行 IDE(如 Eclipse、NetBeans、IntelliJ 和 JBuilder)集成 JUnit ...

    junit4单元测试

    首先,JUnit4是对JUnit3的一个重大改进,它引入了注解(Annotations)的概念,这使得编写测试用例更加简洁。例如,`@Test`注解用于标记测试方法,而`@Before`和`@After`则分别用于在每个测试之前和之后执行的设置和...

    Junit4电子教程 api

    JUnit4相比其前身JUnit3,引入了许多改进和新特性,使得测试更加灵活和强大。 1. **注解驱动测试**:JUnit4放弃了传统的继承Test类的方式,而是采用注解(@Test)来标记测试方法,使得测试类结构更加清晰,易于理解...

    junit4 单元测试源码

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

Global site tag (gtag.js) - Google Analytics