JUnit4的一些常用注解

本文详细介绍了JUnit4中常用的测试注解,包括@Before、@After、@BeforeClass、@AfterClass、@Test、@Test(timeout)、@Test(expected)、@Ignore,以及如何打包测试Suite、参数化测试、控制执行顺序和自定义Rule的使用方法,并给出了相应的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. JUnit4.x 测试用例相关的注解

1.1 @Before

1.2 @After

1.3 @BeforeClass

1.4 @AfterClass

1.5 @Test(timeout = xxx)

1.6 @Test(expected = Exception.class)

1.7 @Ignore

2. 打包测试Suite相关的注解

2.1 @RunWith(Suite.class)

2.2 @Suite.SuiteClasses(...{xx.calss, xx.calss, ...})

2.3 示例

3. 参数化测试相关的注解

3.1 @RunWith(Parameterized.class)

3.2 @Parameters

3.3 示例

4. 控制用例执行顺序相关的注解

4.1 @FixMethodOrder注解

4.2 示例

5. 自定义规则Rule相关的注解

5.1 @Rule和@ClassRule

5.2 JUnit提供了以下几个Rule实现,必要时也可以自己实现Rule

5.3 示例

1. JUnit4.x 测试用例相关的注解

1.1 @Before

与junit3.x中的setUp()方法功能一样,在每个测试方法之前执行。

1.2 @After

与tearDown()方法一样。

1.3 @BeforeClass

在所有方法执行之前执行

1.4 @AfterClass

在所有方法执行之后执行

1.5 @Test(timeout = xxx)

设置当前测试方法在一定时间内运行完,否则返回错误

1.6 @Test(expected = Exception.class)

设置被测试的方法是否有异常抛出。抛出异常类型为: Exception.class

1.7 @Ignore

注释掉一个测试方法或者一个类,被注释的方法或类,不会被执行。

补充:

JUnite4的执行顺序:@BeforeClass > @Before > @Test1 > @After > @Before > @Test2 > @After ...... > @AfterClass

2. 打包测试Suite相关的注解

2.1 @RunWith(Suite.class)

需要一个特殊的Runner, 因此需要向@RunWith注解传递一个参数Suite.calss。

2.2 @Suite.SuiteClasses(...{xx.class, xx.class, ...})

用来表明这个类是一个打包测试类,把需要打包的类作为参数传递给该注解即可。

小结:

有了这两个注解之后,就已经完整的表达了所有的含义,因此下面的类无关紧要,随便起个类名,内容为空。

2.3 示例

 

3. 参数化测试相关的注解

3.1 @RunWith(Parameterized.class)

首先要为这种测试专门生成一个新的类,而不能与其他测试共用同一个类。 

这里不使用默认的Runner了,使用带有参数化功能的Runner。

@RunWith(Parameterized.class)这条语句就是为这个类指定了ParameterizedRunner。

3.2 @Parameters

放在方法上。 

定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果。

定义测试数据的结合,就是下方的prepareData()方法,该方法可以任意命名,但是必须使用@Parameters标注进行修饰。

这里需要注意:其中的数据是一个二维数组,数据两两一组,每组中的这两个数据,一个是参数,一个是预期的结果。比如第一组{2,4}中:2是参数,4是预期结果。这两数据顺序无所谓。

然后,是构造函数,其功能就是对先前定义的两个参数进行初始化。这里要注意参数的顺序,要和上面的数据集合的顺序保持一致。(比如都是先参数后结果)

3.3 示例

package com.my.junit4.demo;
 
import static org.junit.Assert.*;
 
import java.util.Arrays;
import java.util.Collection;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
 
//这里不能使用默认的Runner了,特殊功能要用特殊Runner
@RunWith(Parameterized.class) 
public class MyJUnit4ParaTest {
 
    private int input1; 
    private int input2; 
    private int expected; 
   
    //参数化,方法的名字可随意取,但是这个结构基本是固定的,这么使用就行。
    //有时参数不是直接赋值,而是从一个文件中读出,也是类似的格式,返回Collection<Object[]>
    @Parameters 
    public static Collection<Object[]> prepareData(){ 
        Object [][] object = {{3,1,3},{36,6,6},{0,4,7}}; 
        return Arrays.asList(object); 
    }    
    
    //构造方法
    public MyJUnit4ParaTest(int input1,int input2,int expected){ 
        this.input1 = input1; 
        this.input2 = input2; 
        this.expected = expected; 
    }   
     
    //测试方法
    @Test 
    public void testDiv(){ 
        Calc calc = new Calc(); 
        int result = calc.div(input1,input2);   //input1,input2,expected分别对应二维数组元素的第一个,第二个和第三个元素
        assertEquals(expected,result); 
    } 
 
}
 

4. 控制用例执行顺序相关的注解

4.1 @FixMethodOrder注解

(1)控制测试方法的执行顺序的。

(2)该注解的参数是org.junit.runners.MethodSorters对象。

(3)枚举类org.junit.runners.MethodSorters中定义三种顺序类型:

MethodSorters.JVM:按照JVM得到的方法顺序,即代码中定义的方法顺序。

MethodSorters.DEFAULT:默认的顺序,以确定但不可预期的顺序执行。

MethodSorters.NAME_ASCENDING:按方法名字母顺序执行。

4.2 示例

 

5. 自定义规则Rule相关的注解

5.1 @Rule和@ClassRule

(1) 什么是Rule实现

Rule是一组实现了TestRule接口的共享类,提供了验证,监视TestCase和外部资源管理等能力。

即,提供了测试用例执行过程中一些通用功能的共享能力,使不必重复编写一些功能类似的代码。

(2)JUnit4中包含两个注解:@Rule和@ClassRule

用于修饰Field或返回Rule的Method。

两者作用域不同:

@Rule的作用域是测试方法。

@ClassRule则是测试Class。

5.2 JUnit提供了以下几个Rule实现,必要时也可以自己实现Rule

(1)Verifier:验证测试执行结果的正确性。

(2)ErrorCollector:收集测试方法中出现的错误信息,测试不会中断,如果有错误发生,测试结束后会标记失败。

(3)ExpectedException:提供灵活的异常验证功能。

(4)Timeout:用于测试超时的Rule。

(5)ExternalResource:外部资源管理。

(6)TemporaryFolder:在JUnit的测试执行前后,创建和删除新的临时目录。

(6)TestWatcher:监视测试方法生命周期的各个阶段。

(7)TestName:在测试方法执行过程中提供获取测试名字的能力。

5.3 示例

package com.my.junit4.demo;
 
import static org.junit.Assert.*;
 
import java.util.Arrays;
 
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.rules.MethodRule;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
 
//实现MethodRule接口
public class MyJUnit4RepeatableRule implements MethodRule{
 
    int times=1;
    String[] testMethods = null;
    
    //构造方法
    MyJUnit4RepeatableRule(int times, String[] testMethods){
        this.times = times;
        this.testMethods = testMethods;
    }
    
    //重写规则
    @Override
    public Statement apply(final Statement base, final FrameworkMethod method, Object target) {
      return new Statement() { //匿名方法
         @Override
         public void evaluate() throws Throwable {
            int loopTime = 1;
            if(Arrays.asList(testMethods).contains(method.getName())){
                loopTime = times;
            }  
            for(int i=0;i<loopTime;i++)
                base.evaluate();
         }
      };
    }
}
package com.my.junit4.demo;
 
import static org.junit.Assert.*;
 
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.MethodRule;
 
public class RepeatableRuleTest {
 
    //引入自定义的规则
    @Rule
    public MethodRule rule = new MyJUnit4RepeatableRule(5, new String[]{"test1"});
 
    @Before
    public void setUp() throws Exception {
    }
 
    @After
    public void tearDown() throws Exception {
    }
 
    @Test
    public void test() {
        //assertTrue(false); //一旦断言失败,断言后的代码就不会再执行
        System.out.println("test");
    }
    @Test
    public void test1() {
        System.out.println("test1");
    }
 
}
 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值