JUnit学习笔记

 
1.    什么是JUnit
Junit是一个用 java语音编写的单元测试框架,该框架的jar包为:junit.jar
2.    如何使用JUnit
  说明,以下测试都是在Eclipse中进行的。
2.1 单个方法进行测试
步骤
Ø 让方法所在的类继承 junit.framework.TestCase类
Ø 在该类中创建一个调用 super(String)的构造方法
Ø 将要测试的方法名选中,右键“ Run As” àJUnit Test”
 
实例
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
 
 
public class TestLargest extends TestCase{
   
    static int i;
   
    public TestLargest(String method){
       super(method);
    }
    public void testSimple(){
       i = 1+2;
       System. out.println("i: "+ i);
    }
}
 
输出结果:i: 3





















2.2 将多个方法进行组合测试
使用 TestSuite类的对象,在suite方法里将多个方法进行组合,那么当右键“Run As” àJUnit Test”时(不需要选中suite方法),就会执行suite方法,并将TestSuite类的对像所组合的方法进行一次执行。
值得注意的是, suite方法不需要选中,右键测试就会执行,选中反而报错,且TestSuite类对象所组合的测试方法必须以“test”开头,不然不能正常执行。
实例:
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
 
 
public class TestLargest extends TestCase{
   
    static int i;
    static int j;
   
    public TestLargest(String method){
       super(method);
    }
    public void testSimple(){
       i = 1+2;
       System. out.println("i: "+ i);
    }
   
    public void testAddJ(){
       j = i + 2;
       System. out.println("j: "+ j);
    }
   
      static Test suite(){
       TestSuite suit = new TestSuite();
       suit.addTest( new TestLargest("testSimple"));
        suit.addTest( new TestLargest("testAddJ"));
       return suit;
    }
}
 
说明:右键进行Junit Test的时候,会先后执行suit对象所组合的两个方法“testSimple”,和“testAddJ”,所以结果为:
i: 3
j: 5
 
 
2.3 测试方法执行前和执行后操作
比如我们测试一个数据操作的方法,那么需要连接数据库,并在操作完后进行数据库连接释放。但如果该测试类中,多个测试方法都要进行数据库方面的测试,那么在每个测试方法里都写上数据库连接与释放的操作就太冗余了。
基于此原因, junit框架提供了setUp和tearDown方法,框架会在每个测试方法执行前自动执行setUp方法,并在测试方法执行后调用tearDown方法。这样,我们就可以把诸如数据库连接这些初始化操作放在setUp方法里,把数据库释放这种清理工作放在tearDown方法里。
setUp和 tearDown方法与测试方法执行的顺序图如下:
实例:
import junit.extensions.TestSetup;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
 
 
public class TestLargest extends TestCase{
   
    static int i;
    static int j;
   
    public TestLargest(String method){
       super(method);
    }
   
    @Override
    protected void setUp() throws Exception {
       // TODO Auto-generated method stub
       super.setUp();
       i++;
      
    }
 
    @Override
    protected void tearDown() throws Exception {
       // TODO Auto-generated method stub
       super.tearDown();
       j++;
    }
 
    public void testSimple(){
       i = i+2;
       System. out.println("i: "+ i);
       //System.out.println("j: "+j);
    }
   
    public void testAddJ(){
       j = j + i + 2;
       System. out.println("j: "+ j);
    }
   
      static Test suite(){
       TestSuite suit = new TestSuite();
       suit.addTest( new TestLargest("testSimple"));
       suit.addTest( new TestLargest("testAddJ"));
       return suit;
    }
}
 
 
结果:
i: 3
j: 7
说明:
    组合执行执行,先执行” testSimple”方法,执行前先执行“setUp”方法将i加1,i就变成1,于是执行“testSimple”方法时,i再加2,所以输出“i: 3”。该方法执行完后,框架执行“tearDown”方法将j自加1,于是j变成1。当接下来执行“testAddJ”方法时,框架有执行“setUp”方法,这样i就由3变为4,于是执行“testAddJ”方法时,j就等于1+4+2,于是j输出为“j: 7”,当然该方法执行完后,照例会执行tearDown方法。
 
3.    测试那些内容
上面讲了使用 JUnit进行测试的基本使用方法,但是在什么时候使用JUnit进行单元测试呢。应从以下六个方面进行考虑和测试,简称Right-BJCEP,分别是:
Right——结果是否正确
B(borderline)——是否所有的边界条件都正确
I(inverse)——能查一下反向关联吗?
C(cross)——能用其它手段交叉检验以下结果吗?
E(error)——你是否可以强制错误条件发生?
P(performance)——是否满足性能要求?
 
4.    解决依赖性测试(Mock对象)
某些方法依赖于其他一些难以控制的东西、诸如网络、数据库,甚至是 servlet引擎,如何在没有真实环境的情况下测试这些方法呢?采用Mock对象。
       其原理是,假设该方法依赖一个 HttpServletRequest类型的对象,用一个Mock类型去实现这个接口,并用Mock对象去做为真实类的替代完成一些工作。JUnit框架提供了一系列的Mock对象来模仿正式环境中才能获取的对象。
 

Junit4以后可以使用标注来代替基础TestCase,具体使用方法如下,转摘至:http://blog.csdn.net/fengbaoxp/archive/2009/07/08/4330540.aspx

这个周末我研究了一下junit 4,下面是一个简短介绍:

  1. @Test
    用@Test 注解标注你的测试用例集。测试用例不再需要“test"前缀。并且,你的测试用例集类不再需要继承”TestCase"类。

    1. @Test   
    2. public void addition() {  
    3.      assertEquals(12 , simpleMath.add( 7 5 ));  
    4. }  
    5.   
    6. @Test   
    7. public void subtraction() {  
    8.      assertEquals(9 , simpleMath.substract( 12 3 ));  
    9. }  
  2. @Before and @After 
    分别使用 @Before 和 @After 注解标注 “setup” 和 “tearDown” 方法。他们分别在每个测试用例执行前和结束后运行。

    1. @Before   
    2. public void runBeforeEveryTest() {  
    3.      simpleMath = new SimpleMath();  
    4. }  
    5.   
    6. @After   
    7. public void runAfterEveryTest() {  
    8.      simpleMath = null ;  
    9. }  
  3. @BeforeClass and @AfterClass
    分 别使用 @BeforeClass 和 @AfterClass 注解标注测试用例集范围的 “setup” 和 “tearDown” 方法。 把他们看做在测试用例集中只执行一次的 setup 和 tearDown 方法。他们分别在测试用例集中所有测试用例执行前和结束后执行一次。

    1. @BeforeClass   
    2. public static void runBeforeClass() {  
    3.     // run for one time before all test cases   
    4. }  
    5.   
    6. @AfterClass   
    7. public static void runAfterClass() {  
    8.     // run for one time after all test cases   
    9. }  
  4. 异常处理 
    使用带 “expected” 参数的 @Test 注解标注期望抛出指定异常的测试用例。“expected” 参数值为希望测试用例抛出的异常的类名。

    1. @Test (expected = ArithmeticException. class )  
    2. public void divisionWithException() {  
    3.     // divide by zero   
    4.      simpleMath.divide(1 0 );  
    5. }  
  5. @Ignore 
    使用 @Ignore 注解标注你希望忽略的测试用例。如果你愿意可以加一个字符串参数来解释忽略的原因。

    1. @Ignore ( "Not Ready to Run" )  
    2. @Test   
    3. public void multiplication() {  
    4.      assertEquals(15 , simpleMath.multiply( 3 5 ));  
    5. }  
  6. 超时 
    给 “timeout” 参数设置一个以毫秒为单位的时间段。当测试执行时间超过该时间段时,测试失败。

    1. @Test (timeout = 1000 )  
    2. public void infinity() {  
    3.     while ( true )  
    4.          ;  
    5. }  
  7. 新增断言 
    比较数组的新断言方法。如果两个数组长度相同,并且对应位置的元素相等,那么两个数组相等,否则不相等。

    public static void assertEquals(Object[] expected, Object[] actual);
    public static void assertEquals(String message, Object[] expected, Object[] actual);


    1. @Test   
    2. public void listEquality() {  
    3.      List<Integer> expected = new ArrayList<Integer>();  
    4.      expected.add(5 );  
    5.   
    6.      List<Integer> actual = new ArrayList<Integer>();  
    7.      actual.add(5 );  
    8.   
    9.      assertEquals(expected, actual);  
    10. }  
  8. JUnit4Adapter 
    使用Junit4Adapter在 Junit 3 下运行Junit 4的测试。

    1. public static junit.framework.Test suite() {  
    2.     return new JUnit4TestAdapter(SimpleMathTest. class );  
    3. }  

快乐编程。 :D

 

你可能感兴趣的:(继承,JUnit,职场,休闲,4,标注)