在一个测试类中,所有被@Test注解修饰的public,void方法都是testcase,可以被JUNIT执行。
@Retention(value=RUNTIME) @Target(value=METHOD) public @interface Test
Test中的属性(可选的):1.expected:如果被期待的指定的异常抛出,则表示成功。
2.timeout:执行失败的时间
测试的方法名不用以test开头,但规范来写还是以test开头
1.setup方法在3.8中是在每个测试的方法前初始化,在4.0中要采用注解的方式@Before,与tearDown对应的@After
2.4.0中新加入@BeforeClass,@AfterClass.相当于全局初始化和销毁 修饰的方法必须为public static void no-arg.
以Calculator的testAdd测试timeout属性
先让add方法睡眠500ms;
以Calculator的testDivide测试expected属性
1 import static org.junit.Assert.assertEquals; 2 3 import org.junit.Before; 4 import org.junit.BeforeClass; 5 import org.junit.Test; 6 7 public class CalculatorTest { 8 private Calculator cal; 9 @BeforeClass 10 public static void globalInit(){ 11 System.out.println("全局初始化"); 12 } 13 14 @Before 15 public void init(){ 16 cal=new Calculator(); 17 } 18 19 @Test(timeout=200) 20 public void testAdd(){ 21 22 int result=cal.add(3, 1); 23 assertEquals(4, result); 24 } 25 26 @Test(expected=Exception.class) 27 public void testDivide() throws Exception{ 28 cal.divide(3, 0); 29 } 30 }
@Retention(value=RUNTIME) @Target(value={METHOD,TYPE}) public @interface Ignore 可以修饰方法也可以修饰类,表示忽略
@RunWith 运行哪个运行器
Parameterized:参数化运行器
参数化测试(Parameters)需要在类的声明处加上@RunWith(Parameterized.class),在提供参数的方法上要使用@Parameters注解修饰,同时在构造方法中为各个参数赋值(构造方法由junit调用),最后编写测试类,它会根据组数来运行测试次数。
1 import static org.junit.Assert.*; 2 3 import java.util.Arrays; 4 import java.util.Collection; 5 6 import org.junit.Before; 7 import org.junit.Test; 8 import org.junit.runner.RunWith; 9 import org.junit.runners.Parameterized; 10 import org.junit.runners.Parameterized.Parameters; 11 12 13 @RunWith(Parameterized.class) 14 public class ParameterizedTest { 15 //设定参数 预计值, 参数1 参数2 16 private int expected; 17 private int input1; 18 private int input2; 19 private Calculator cal; 20 21 @SuppressWarnings("rawtypes") 22 @Parameters 23 public static Collection prepareData(){ 24 Object[][] object={{5,4,1},{8,2,6},{9,4,5}}; 25 //数组转换为集合 26 return Arrays.asList(object); 27 } 28 29 @Before 30 public void setUp(){ 31 cal=new Calculator(); 32 } 33 34 public ParameterizedTest(int expected,int input1,int input2){ 35 this.expected=expected; 36 this.input1=input1; 37 this.input2=input2; 38 } 39 40 @Test 41 public void testAdd(){ 42 assertEquals(this.expected, cal.add(this.input1, this.input2)); 43 } 44 }
Suite(运行器)
@RunWith(Suite.class)
@Suite.SuiteClasses({要运行的类(数组)})
自动化测试
1 import org.junit.runner.RunWith; 2 import org.junit.runners.Suite; 3 4 5 @RunWith(Suite.class) 6 @Suite.SuiteClasses({CalculatorTest.class,LargestTest.class,ParameterizedTest.class}) 7 public class TestAll { 8 9 }