`
haibin369
  • 浏览: 60110 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JUnit4学习笔记(二):参数化测试与假定(Assumption)

    博客分类:
  • Java
阅读更多

一、一个简单的测试

编写一个只有一种运算的计算器:

 

public class Calculator {
    public static double divide(int dividend, int divisor) {
        return dividend / divisor;
    }
}

 为这个方法编写测试:

 

public class CalculatorTest {
    //允许误差
    private static final double DELTA = 0.01;

    @Test
    public void testAdd() throws Exception {
        assertEquals(3, Calculator.divide(9, 3), DELTA);
    }
}

 这个测试中使用9除以3测试了方法,但是我们希望使用多组数据进行测试,并且不需要编写多个方法,这时候可以使用JUnit的参数化测试。

 

二、参数化测试

在JUnit中,参数化测试有两种形式,第一种形式是构造函数形式,即JUnit遍历所提供的所有参数调用构造函数并执行测试方法:

//使用Parameterized Runner执行参数化测试
@RunWith(Parameterized.class)
public class CalculatorTest {
    //允许误差
    private static final double DELTA = 0.01;

    private int dividend;
    private int divisor;
    private int result;

    public CalculatorTest(int dividend, int divisor, int result) {
        this.dividend = dividend;
        this.divisor = divisor;
        this.result = result;
    }

    // 用@Parameterized.Parameters注解标注该方法是返回所有参数,被注解的方法必须返
    // 回装载数组的Iterable对象,同时必须为public,static,当测试执行时,系统会遍历
    // 每组参数(数组)调用构造函数并执行测试。
    @Parameterized.Parameters
    public static Iterable<Object[]> getParameters() {
        return Arrays.asList(new Object[][]{
                {9, 3, 3}, {5, 1, 5}, {12, 4, 3}
        });
    }

    //当执行测试后,该方法会运行3次
    @Test
    public void testDevide throws Exception {
        assertEquals(result, Calculator.divide(dividend, divisor), DELTA);
    }
}

 

第二种是变量注入形式,变量的值不通过构造函数初始化,而是通过JUnit注入:

 

//使用Parameterized Runner执行参数化测试
@RunWith(Parameterized.class)
public class CalculatorTest {
    //允许误差
    private static final double DELTA = 0.01;

    //使用@Parameter标注public变量,JUnit会遍历每组参数进行注入
    //注解中的整数参数表示注入参数组中的第几个参数
    @Parameter(0)
    public int dividend;
    @Parameter(1)
    public int divisor;
    @Parameter(2)
    public int result;

    // 用@Parameterized.Parameters注解标注该方法是返回所有参数,被注解的方法必须返
    // 回装载数组的Iterable对象,同时必须为public,static,当测试执行时,系统会遍历
    // 每组参数(数组)调用构造函数并执行测试。
    @Parameterized.Parameters
    public static Iterable<Object[]> getParameters() {
        return Arrays.asList(new Object[][]{
                {9, 3, 3}, {5, 1, 5}, {12, 4, 3}
        });
    }

    //当执行测试后,该方法会运行3次
    @Test
    public void testDivide() throws Exception {
        assertEquals(result, Calculator.divide(dividend, divisor), DELTA);
    }
}
 

 

三、Assumption

在上面参数化的例子中,如果我们提供的参数为{9, 3, 3}, {15, 0, 0}, {12, 4, 3},那第二组参数则会导致测试失败(15除以0会抛出异常),但是在参数化测试中并不应该使用0为除数作为测试,所以应该是测试数据的问题,不应该导致测试失败。使用org.junit.Assume下的各种assume方法能对测试的数据或者环境做出假设,当这种假设不满足时跳过该测试,这样就可以保证在正确的测试环境下执行测试。

 

@Test
public void testDivide() throws Exception {
    //假定除数不为0,若为0跳过该测试
    assumeTrue("Divisor can't be 0", divisor != 0);
    assertEquals(result, Calculator.divide(dividend, divisor), DELTA);
}

 使用上述参数执行该测试,第二组参数所对应的测试会被忽略,而不是失败。

 

分享到:
评论

相关推荐

    junit参数化测试的使用方法

    4. **为测试类声明一个使用注解** `org.junit.runners.Parameterized.Parameters` **修饰的,返回值为** `java.util.Collection` **的公共静态方法**,并在该方法中初始化所有需要测试的参数对。 5. **编写测试方法*...

    Junit参数化测试源代码

    4. **Service测试类**:使用Junit参数化测试验证Service类的各个方法。 在Service测试类中,你可能会看到类似如上的参数化测试结构,测试数据可能是从数据库查询的结果、固定的数组或文件读取的数据。每个测试用例...

    JUnit4学习笔记

    @RunWith:这个元数据允许我们指定一个测试运行器(Runner),可以自定义测试执行的方式,例如参数化测试、分类测试等。@FixMethodOrder:用于控制测试方法的执行顺序,可以指定按照字母顺序或者其他方式执行测试。@...

    Junit4学习笔记—入门篇.pdf

    ### JUnit4学习笔记——入门篇 #### 一、配置MyEclipse在项目中引入JUnit4.jar包 在使用JUnit4进行单元测试之前,首先需要确保开发环境已正确配置JUnit库。对于使用MyEclipse IDE的开发者来说,可以通过以下步骤...

    Junit4完整源码

    JUnit4源码的完整版本包含了整个框架的实现细节,对于理解其工作原理、学习测试驱动开发(TDD)以及进行自定义扩展非常有帮助。 1. **JUnit核心概念**: - **Test Case**:在JUnit4中,测试用例是通过继承`org....

    junit4学习文档

    ### JUnit4 学习知识点详解 #### 一、JUnit4 概述 JUnit4 是 JUnit 测试框架的一个重大更新版本,它充分利用了 Java 5 的注解(Annotation)特性来简化测试用例的编写过程。注解是一种元数据,用于描述程序中的...

    JUnit学习笔记

    JUnit4引入了注解驱动的测试,比如`@Before`和`@After`,分别在每个测试方法执行前和执行后运行,通常用于初始化和清理资源。此外,`@BeforeClass`和`@AfterClass`则只在类级别的开始和结束时执行一次。 对于更复杂...

    Junit学习笔记

    2. 创建测试类和方法:创建一个新的Java类,添加`@RunWith(JUnit4.class)`注解,然后在类中编写测试方法,每个方法都添加`@Test`注解。 3. 运行测试:在IDE中选择测试类或单个测试方法右键运行,查看测试结果,绿色...

    junit4测试jar包

    JUnit4测试框架是Java开发中广泛使用的单元测试工具,它为开发者提供了编写和运行可重复、可靠的测试用例的能力。这个“junit4测试jar包”包含了一切你需要在项目中集成JUnit4进行测试的库文件。只需将其复制到你的...

    JUnit-Parameterized-Test:参数化测试是使用不同的值一次又一次地执行相同的测试。 它可以帮助开发人员节省执行相同测试的时间,该测试仅在输入内容和预期结果上有所不同

    JUnit参数化测试是一种高效的方法,尤其适用于需要对多种输入数据进行相同逻辑验证的场景。它允许测试用例根据预定义的数据集动态生成,这样就可以在单个测试方法中执行多次,而无需为每组输入创建单独的测试方法。...

    Junit 4.0 学习笔记

    5. 运行器(Runner):JUnit 4.0支持自定义运行器,如`BlockJUnit4ClassRunner`是默认的运行器,还有`Parameterized`用于参数化测试,`Suite`用于测试套件。 三、实战应用 1. 创建测试类:创建一个名为`MyTest`的...

    junit-platform-launcher-1.8.0-M1-API文档-中文版.zip

    赠送jar包:junit-platform-launcher-1.8.0-M1.jar; 赠送原API文档:junit-platform-launcher-1.8.0-M1-javadoc.jar; 赠送源代码:junit-platform-launcher-1.8.0-M1-sources.jar; 赠送Maven依赖信息文件:junit-...

    单元测试利器JUnit4.docx

    本文主要介绍了如何使用JUnit 4提供的各种功能开展有效的单元测试,并通过一个实例演示了如何使用Ant执行自动化的单元测试。下面是从中生成的相关知识点: 1. JUnit 4简介:JUnit是Java社区中知名度最高的单元测试...

    junit4单元测试报错:method initializationerror not found

    junit4单元测试报错:method initializationerror not found 缺少jar包导致,总共需要三个jar包:junit-4.11.jar,hamcrest-core-1.3.rc2.jar,hamcrest-library-1.3.rc2.jar,都在压缩包里了。

    Junit学习.rar

    4. **参数化测试**:JUnit 4引入了参数化测试,允许用不同的参数多次运行同一个测试。 5. **分类测试(Category)**:JUnit 4.9开始支持分类测试,可以将测试分组,便于管理和运行特定类型的测试。 6. **测试规则...

    junit-libs:junit测试包

    JUnit是Java编程语言中最常用的单元测试框架之一,它为开发者提供了编写和运行可重复的、自动化的测试用例的能力。这个“junit-libs”压缩包文件很显然是一个包含JUnit库及相关依赖的集合,用于支持Java项目的测试...

    单元测试利器JUnit4

    JUnit4相较于早期版本引入了许多改进,如注解、参数化测试和测试套件等,使得测试代码更加简洁和灵活。 2. 注解(Annotations): JUnit4的核心特点是广泛使用注解,这使得测试类和方法的声明更清晰。例如: - `@...

    Junit良葛格学习笔记

    - **注解(Annotation)**:JUnit4引入了注解,如@Test、@Before、@After、@BeforeClass、@AfterClass,简化了测试代码的编写。 - **分类(Category)**:允许将测试分为不同的类别,便于管理和执行。 - **参数化...

    Junit4测试总结

    JUnit4的`@Parameters`注解和`Parameterized`测试类可以实现参数化的测试,即用不同的输入数据多次运行同一个测试。 ```java @RunWith(Parameterized.class) public class ParameterizedTest { @Parameters ...

Global site tag (gtag.js) - Google Analytics