代码改变世界

JUnit之参数化测试、套件/成组测试的使用

2018-03-10 01:38  清风软件测试开发  阅读(503)  评论(0编辑  收藏  举报

原文地址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