zoukankan      html  css  js  c++  java
  • JUnit之参数化测试、套件/成组测试的使用

    原文地址http://blog.csdn.net/yqj2065/article/details/39967065

    参数化测试

    正如数组替代int a0,a1,a2一样,测试加法时assertEquals(3.0, h.add(1, 2), 0.1);相当于声明一个变量,要测试100个怎么办。

    所以,有了参数化测试,使用一个Collection收集所有的数据——加法时每一次测试需要的几个数据构成一组,n个组构成Collection。

    然后按照JUnit的用法要求,写出单元测试类。(偷懒一下,不想写被测试的业务类X了。下面的例子中假设要测试的方法是,判断一个数是否奇数。)

    [java] view plain copy
     
    1. package myTest.param;  
    2. import java.util.Arrays;  
    3. import java.util.Collection;  
    4.   
    5. import org.junit.Test;  
    6. import org.junit.runners.Parameterized;  
    7. import org.junit.runners.Parameterized.Parameters;  
    8. import org.junit.runner.RunWith;  
    9. import static org.junit.Assert.assertEquals;  
    10.   
    11. @RunWith(Parameterized.class)//1.必须  
    12. public class ParametTestUnit {  
    13.     private int input;  
    14.     private boolean expected;//expected result  
    15.     /** 
    16.      * 2.public 构造器赋值一组测试数据 
    17.      */  
    18.     public ParametTestUnit(int input,boolean expected ) {  
    19.         this.input = input;  
    20.         this.expected = expected;  
    21.     }  
    22.   
    23.     /** 
    24.      * 3.由@Parameterized.Parameters修饰一个 
    25.      * public static Collection xxx() 
    26.      */  
    27.     @Parameterized.Parameters  
    28.     public static Collection data() {  
    29.         return Arrays.asList(new Object[][] {  
    30.             { 1, true },  
    31.             { 3, true },//  
    32.             { 6, false },  
    33.             { 11, true },  
    34.             { 22, false },  
    35.             { 23, true }  
    36.         });  
    37.     }  
    38.   
    39.     /** 
    40.      * 4.JUnit循环地使用各组数据 
    41.      */  
    42.     @Test  
    43.     public void testOdd() {  
    44.         System.out.println("Parameterized Number is : " + input);  
    45.         assertEquals(expected, input%2!=0);  
    46.     }  
    47. }  

    现在这个单元测试类编写完成,但是在BlueJ中不能够直接运行它(不支持?),自己写一个Main好了。

    [java] view plain copy
     
    1. package myTest.param;  
    2. import org.junit.runner.JUnitCore;  
    3. import org.junit.runner.Result;  
    4. import org.junit.runner.notification.Failure;  
    5.   
    6. public class Main {  
    7.    public static void go() {  
    8.       Result result = JUnitCore.runClasses(ParametTestUnit.class);  
    9.       for (Failure failure : result.getFailures()) {  
    10.          System.out.println(failure.toString());  
    11.       }  
    12.       System.out.println(result.wasSuccessful());  
    13.    }  
    14. }  

    运行结果:

    Parameterized Number is : 1
    Parameterized Number is : 3
    Parameterized Number is : 6
    Parameterized Number is : 11
    Parameterized Number is : 22
    Parameterized Number is : 23
    true

    现在,将某个数据修改一下,如{ 11, true }改成{ 10, true },运行结果:
    Parameterized Number is : 1
    Parameterized Number is : 3
    Parameterized Number is : 6
    Parameterized Number is : 10
    Parameterized Number is : 22
    Parameterized Number is : 23
    testOdd[3](myTest.param.ParametTestUnit): expected:<true> but was:<false>
    false

    表示第3个数据(基于0)有问题。

    成组测试

    有很多单元测试类需要测试,将它们组成一个Suite,大家一起测试。例如新写了两个单元测试类:

    [java] view plain copy
     
    1. package myTest.param;  
    2. import static org.junit.Assert.assertEquals;  
    3. public class AddUnit1 {  
    4.     @org.junit.Test  
    5.     public void testAdd() {   
    6.         System.out.println("Inside AddUnit1");      
    7.         assertEquals(3, 1+2);       
    8.     }  
    9. }  
    10. package myTest.param;  
    11. import static org.hamcrest.CoreMatchers.*;  
    12. import static org.junit.Assert.*;  
    13. public class AddUnit2 {  
    14.     @org.junit.Test  
    15.     public void testSth() {   
    16.         System.out.println("Inside AddUnit2");      
    17.         assertThat("Zero is one", 0, is(not(1))); // passes     
    18.         assertThat("Zero is one", 0, is(1)); //fail  
    19.     }  
    20. }  

    将它们组成一个Suite,需要写捆绑代码,清晰起见,单独用一个类。

    [java] view plain copy
     
    1. package myTest.param;  
    2. import org.junit.runner.RunWith;  
    3. import org.junit.runners.Suite;  
    4. @RunWith(Suite.class)  
    5. @Suite.SuiteClasses({  
    6.    AddUnit1.class,  
    7.    AddUnit2.class,  
    8.    //ParametTestUnit.class  
    9. })  
    10. public class SuiteUnit {}  

    还是用上面的Main,修改为runClasses(SuiteUnit.class); 运行结果:
    Inside AddUnit1.testAdd()
    Inside AddUnit2.testSth()
    testSth(myTest.param.AddUnit2): Zero is one
    Expected: is <1>
         got: <0>


    false

    可以把对ParametTestUnit.class的测试也加进来。运行结果:

    Inside AddUnit1.testAdd()
    Inside AddUnit2.testSth()
    Parameterized Number is : 1
    Parameterized Number is : 3
    Parameterized Number is : 6
    Parameterized Number is : 10
    Parameterized Number is : 22
    Parameterized Number is : 23
    testSth(myTest.param.AddUnit2): Zero is one
    Expected: is <1>
         got: <0>


    testOdd[3](myTest.param.ParametTestUnit): expected:<true> but was:<false>
    false

  • 相关阅读:
    列表导航栏实例(01)
    点阵图形的高效旋转算法
    7种健康食物助抗初秋干燥
    打造自己的reset.css
    如何点击链接直接跳转到app store指定应用下载页面
    【iOSiap防护】验证用户付费收据!拒绝iap Cracker!拒绝iap Free!让iphone越狱用户无从下手!【2012年5月2日更新防护iap Free的方法】
    如何自定义协议从自己的一个app打开另一个app
    传统网站与Web标准——DIV+CSS布局实例
    ANSI、Unicode、Unicode big endian、UTF8编码
    良好的XHTML规则
  • 原文地址:https://www.cnblogs.com/111testing/p/8537169.html
Copyright © 2011-2022 走看看