JUnit该参数测试和一组测试使用简单
参数测试
作为替代阵列int a0,a1,a2喜欢,当测试加法assertEquals(3.0, h.add(1, 2), 0.1);相当于声明一个变量,要測试100个怎么办。
所以,有了參数化測试,使用一个Collection收集全部的数据——加法时每一次測试须要的几个数据构成一组,n个组构成Collection。
然后依照JUnit的使用方法要求,写出单元測试类。(偷懒一下,不想写被測试的业务类X了。
以下的样例中如果要測试的方法是,推断一个数是否奇数。)
package myTest.param; import java.util.Arrays; import java.util.Collection; import org.junit.Test; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.junit.runner.RunWith; import static org.junit.Assert.assertEquals; @RunWith(Parameterized.class)//1.必须 public class ParametTestUnit { private int input; private boolean expected;//expected result /** * 2.public 构造器赋值一组測试数据 */ public ParametTestUnit(int input,boolean expected ) { this.input = input; this.expected = expected; } /** * 3.由@Parameterized.Parameters修饰一个 * public static Collection xxx() */ @Parameterized.Parameters public static Collection data() { return Arrays.asList(new Object[][] { { 1, true }, { 3, true },// { 6, false }, { 11, true }, { 22, false }, { 23, true } }); } /** * 4.JUnit循环地使用各组数据 */ @Test public void testOdd() { System.out.println("Parameterized Number is : " + input); assertEquals(expected, input%2!=0); } }如今这个单元測试类编写完毕,可是在BlueJ中不可以直接执行它(不支持?)。自己写一个Main好了。
package myTest.param; import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class Main { public static void go() { Result result = JUnitCore.runClasses(ParametTestUnit.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }执行结果:
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。大家一起測试。
比如新写了两个单元測试类:
package myTest.param; import static org.junit.Assert.assertEquals; public class AddUnit1 { @org.junit.Test public void testAdd() { System.out.println("Inside AddUnit1"); assertEquals(3, 1+2); } } package myTest.param; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; public class AddUnit2 { @org.junit.Test public void testSth() { System.out.println("Inside AddUnit2"); assertThat("Zero is one", 0, is(not(1))); // passes assertThat("Zero is one", 0, is(1)); //fail } }将它们组成一个Suite,须要写捆绑代码,清晰起见。单独用一个类。
package myTest.param; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses({ AddUnit1.class, AddUnit2.class, //ParametTestUnit.class }) 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
版权声明:本文博客原创文章。博客,未经同意,不得转载。