Junit 4学习笔记(二)打包、参数化、规则、超时和异常等测试

本文深入讲解JUnit的高级特性,包括套件测试、参数化测试、规则测试、超时测试及异常测试,帮助开发者掌握更复杂的测试场景。

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

导入jar文件

junit-4.12.jar
//junit-4.11之后需要自己导入该包
hamcrest-core-1.3.jar

一、套件测试(打包测试)

测试套件意味着捆绑几个单元测试用例并且一起执行他们。在 JUnit 中,@RunWith 和 @Suite 注释用来运行套件测试。

当一个类被注解为@RunWith时, JUnit 将调用注解中的Suite,以便运行测试类,而不使用内置的 JUnit 运行方法。

示例:

我们有两个用于测试的类:Test_Assert和Test_test,现在我们想要这两个类在一起一块运行,而不是单独一个一个的测试。

Test_Assert

package test.java.TestJunit;

import org.junit.Test;

import static org.junit.Assert.*;

public class Test_Assert {
    @Test
    public void stuAssert(){
        String str1 = "testStr";
        String str2 = new String("testStr");

        //断言两个对象不相等
        assertNotSame("str1和str2不相等",str1,str2);

    }
}

Test_Test

package test.java.TestJunit;

import main.java.StuJunit.Calculator;
import org.junit.*;

public class Test_Test {
    Calculator calculator = new Calculator();
    @Test
    public void test1(){
        System.out.println(calculator.addtion(2,4));
    }
}

进行套件测试的类:

当我们运行该类时,就相当于同时运行上面两个测试类。

package test.java.TestJunit;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({Test_Test.class,Test_Assert.class})
public class Test_RunWith {
}

@RunWith 翻译成中文就是 测试运行器,JUnit所有的测试方法都是由测试运行器负责执行。

JUnit为单元测试提供了一个默认的测试运行器BlockJUnit4ClassRunner,但是没有限制必须使用默认的运行器。

常用的有参数运行器:

常用的有参数运行器描述
@RunWith(Suit.Class) 
@SuitClasses(MyTest.Class,MyTest2.Class)这个是打包测试功能,多个class 可以一起执行测试,不需要一个一个执行,这样节省时间,提高效率
@RunWith(Parameteried.Class)模拟不同的参数方法进行测试,如果为每个类型参数创建一个方法,那是很耗时,傻瓜式的。
@RunWith(SpringJUnit4ClassRunner.class)这个是用springmvc的容器
@RunWith(Parameterized.class) 

二、参数化测试

Junit 4 引入了一个新的功能参数化测试。参数化测试允许开发人员使用不同的值反复运行同一个测试。

创建参数化测试的步骤。

  • 用 @RunWith(Parameterized.class) 来注释 test 类。
  • 创建一个由 @Parameters 注释的公共的静态方法,它返回一个对象的集合(数组)来作为测试数据集合。
  • 创建一个公共的构造函数,它接受和一行测试数据相等同的东西。
  • 为每一列测试数据创建一个实例变量。
  • 用实例变量作为测试数据的来源来创建你的测试用例。

示例:

待测试的类:

package main.java.StuJunit;

public class Calculator {

    public int addtion(int a,int b){
        return a+b;
    }

}

测试类:

package test.java.TestJunit;

import main.java.StuJunit.Calculator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.Arrays;
import java.util.Collection;

@RunWith(Parameterized.class)
public class Test_Param {

    private int op_a;
    private int op_b;

    Calculator calculator = new Calculator();

    public Test_Param(int op_a, int op_b) {
        this.op_a = op_a;
        this.op_b = op_b;
    }

    @Parameters
    public static Collection testData(){
        return Arrays.asList(new Integer[][]{{1,2},{2,3},{3,4}});
    }

    @Test
    public void testCalculator(){
        System.out.println(calculator.addtion(op_a,op_b));
    }

}

三、规则测试

JUnit 4中叫新增了做规则(Rule)的新功能,它允许非常灵活在测试类重新定义每个测试方法的行为。

为了这个目的,@Rule注解被使用来标出测试类的公共字段。这些字段类型为MethodRule,定义测试方法如何运行并报告。JUnit4.9开始,MethodRule被deprecated,TestRule取代它。

多个MethodRules可以应用到一个测试方法。MethodRule接口有很多的实现:

具体规则描述
TemporaryFolder在测试过程中创建临时文件或者临时目录,当测试结束后,框架会自动删除。
ExternalResource设置测试前后需要做的事情(比如:文件、socket、服务、数据库的连接与关闭)。
ErrorCollector在出现一个错误后,还可以让测试继续进行下去。
Verifier在每个测试之后,甚至是在@After之后,可以使用Verifier这个Rule,进行检查。
TestWatcher对测试的每个步骤进行监控。
TestName以获取当前测试方法的名字。
Timeout设置某个测试类,所有测试方法的超时时间。
ClassRule该注解是级别的,而不是方法级别的。
RuleChain规则链
ExpectedException允许在测试规范预期的异常类型和消息

除了那些已经定义的规则,开发人员可以创建自己的自定义规则,并使用来测试自己用例。

示例:Testname规则

package test.java.TestJunit;

import main.java.StuJunit.Calculator;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;

import static org.junit.Assert.assertEquals;

public class Test_Rule {

    @Rule
    public TestName testName = new TestName();//获取测试方法的名称

    @Test
    public void test1(){
        System.out.println(testName.getMethodName());
        assertEquals("test1",testName.getMethodName());
    }

    @Test
    public void test2(){
        System.out.println(testName.getMethodName());
        assertEquals("test2",testName.getMethodName());
    }

}

四、超时测试

TimeOut这个规则已经在Junit 4.12中过时了。我们通常在@Test注解中使用timeout设置超时时间,如下:

@Test(timeout=1000) 表示该测试方法将在1000毫秒后超时,超时后测试不通过,并抛出异常。

    @Test(timeout = 1000)
    public void test1(){
        try {
            TimeUnit.MILLISECONDS.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(testName.getMethodName());
        assertEquals("test1",testName.getMethodName());
    }

五、异常测试

 异常测试允许在测试过程中出现指定的预期异常类型。

    @Test
    public void test3(){
        System.out.println(1/0);
    }

 上述代码直接测试会出现除数为零的异常:

java.lang.ArithmeticException: / by zero

此时测试不通过,如果我们想让一个测试方法在出现指定的异常时依旧能通过测试,我们可以如下修改测试方法:

    @Test(expected = ArithmeticException.class)
    public void test3(){
        System.out.println(testName.getMethodName());
        System.out.println(1/0);
    }

运行该方法,即使出现ArithmeticException异常,依旧可以通过测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值