参数化测试
和创建Test Case差不多,不过需要:
为测试类添加@RunWith(Parameterized.class),@RunWith 用来运行套件测试
否则Junit的默认执行无参构造方法,右键直接运行就难了:
java.lang.Exception: Test class should have exactly one public zero-argument constructor
…
创建一个公共的构造函数,用于接受测试数据
这里还是三角形判断方法为例,则参数a、b、c对应三边,result为预期结果
public TestTriangle(Integer a, Integer b, Integer c, Integer result) {
this.a = a;
this.b = b;
this.c = c;
this.result = result;
}**
创建一个公共的静态方法,带有@Parameters (或@Parameterized.Parameters),它返回一个Collection来作为测试数据集合
这里的顺序和构造方法的参数列表顺序一样,所以依次为a、b、c、result
@Parameterized.Parameters
public static Collection primeNumbers() {
return Arrays.asList(new Object[][] {
{ 3, 3, 3, 3 },
{ 3, 3, 4, 2 },
{ 3, 4, 5, 1 },
{ 3, 4, 9, 1 },
{ 3, 4, -1, -1 }
});
}
为每组测试数据创建一个实例变量,以此创建你的测试用例
所以修改测试方法如下,被测试类也可以作为测试用例的field
/**
* Test method for {@link Triangle#judgeTrangle(int, int, int)}.
*/
@Test
public void testJudgeTrangle() {
//fail("Not yet implemented"); // TODO
System.out.println("Parameterized Number is : " + a +", "+b+", "+c);
Triangle t = new Triangle();
assertEquals(this.result, t.judgeTrangle(this.a, this.b, this.c));
}
运行结果
因为{ 3, 4, 9, 1 }这一组的结果(测试为0)和预期的1不一样,所以会有Failure
试过直接在测试方法内测试所有数据,结果覆盖率较低
Ant运行测试
测试用例的测试结果与预期相同时
不相同时
附:完整代码
package test;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import test.Triangle;
import junit.framework.TestCase;
/**
*
*/
/**
* @author bottomheater Email:1264276009@qq.com
* @version 创建时间:2016年6月14日 下午9:06:13
* 类说明
*/
/**
* @author Administrator
*
*/
@RunWith(Parameterized.class)
public class TestTriangle{
private Integer a;
private Integer b;
private Integer c;
private Integer result;
@Parameterized.Parameters
public static Collection primeNumbers() {
return Arrays.asList(new Object[][] {
{ 3, 3, 3, 3 },
{ 3, 3, 4, 2 },
{ 3, 4, 5, 1 },
{ 3, 4, 9, 1 },
{ 3, 4, -1, -1 }
});
}
public TestTriangle(Integer a, Integer b, Integer c, Integer result) {
this.a = a;
this.b = b;
this.c = c;
this.result = result;
}
/**
* Test method for {@link Triangle#judgeTrangle(int, int, int)}.
*/
@Test
public void testJudgeTrangle() {
//fail("Not yet implemented"); // TODO
System.out.println("Parameterized Number is : " + a +", "+b+", "+c);
Triangle t = new Triangle();
assertEquals(this.result, t.judgeTrangle(this.a, this.b, this.c));
}
}