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

一、一个简单的测试

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

1 public class Calculator {
2     public static double divide(int dividend, int divisor) {
3         return dividend / divisor;
4     }
5 }  

为这个方法编写测试:

1 public class CalculatorTest {
2     //允许误差
3     private static final double DELTA = 0.01;
4
5     @Test
6     public void testAdd() throws Exception {
7         assertEquals(3, Calculator.divide(9, 3), DELTA);
8     }
9 }  

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

二、参数化测试

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

 1 //使用Parameterized Runner执行参数化测试
 2 @RunWith(Parameterized.class)
 3 public class CalculatorTest {
 4     //允许误差
 5     private static final double DELTA = 0.01;
 6
 7     private int dividend;
 8     private int divisor;
 9     private int result;
10
11     public CalculatorTest(int dividend, int divisor, int result) {
12         this.dividend = dividend;
13         this.divisor = divisor;
14         this.result = result;
15     }
16
17     // 用@Parameterized.Parameters注解标注该方法是返回所有参数,被注解的方法必须返
18     // 回装载数组的Iterable对象,同时必须为public,static,当测试执行时,系统会遍历
19     // 每组参数(数组)调用构造函数并执行测试。
20     @Parameterized.Parameters
21     public static Iterable<Object[]> getParameters() {
22         return Arrays.asList(new Object[][]{
23                 {9, 3, 3}, {5, 1, 5}, {12, 4, 3}
24         });
25     }
26
27     //当执行测试后,该方法会运行3次
28     @Test
29     public void testDevide throws Exception {
30         assertEquals(result, Calculator.divide(dividend, divisor), DELTA);
31     }
32 }
33  

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

 1 //使用Parameterized Runner执行参数化测试
 2 @RunWith(Parameterized.class)
 3 public class CalculatorTest {
 4     //允许误差
 5     private static final double DELTA = 0.01;
 6
 7     //使用@Parameter标注public变量,JUnit会遍历每组参数进行注入
 8     //注解中的整数参数表示注入参数组中的第几个参数
 9     @Parameter(0)
10     public int dividend;
11     @Parameter(1)
12     public int divisor;
13     @Parameter(2)
14     public int result;
15
16     // 用@Parameterized.Parameters注解标注该方法是返回所有参数,被注解的方法必须返
17     // 回装载数组的Iterable对象,同时必须为public,static,当测试执行时,系统会遍历
18     // 每组参数(数组)调用构造函数并执行测试。
19     @Parameterized.Parameters
20     public static Iterable<Object[]> getParameters() {
21         return Arrays.asList(new Object[][]{
22                 {9, 3, 3}, {5, 1, 5}, {12, 4, 3}
23         });
24     }
25
26     //当执行测试后,该方法会运行3次
27     @Test
28     public void testDivide() throws Exception {
29         assertEquals(result, Calculator.divide(dividend, divisor), DELTA);
30     }
31 }  

三、Assumption

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

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

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

此文转载,如有版权限制,愿意自动放弃

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

时间: 2024-08-01 22:14:20

JUnit4学习笔记(二):参数化测试与假定(Assumption)的相关文章

JUnit4学习笔记(四):利用Rule扩展JUnit

一.Rule简介 Rule是JUnit4中的新特性,它让我们可以扩展JUnit的功能,灵活地改变测试方法的行为.JUnit中用@Rule和@ClassRule两个注解来实现Rule扩展,这两个注解需要放在实现了TestRule借口的成员变量(@Rule)或者静态变量(@ClassRule)上.@Rule和@ClassRule的不同点是,@Rule是方法级别的,每个测试方法执行时都会调用被注解的Rule,而@ClassRule是类级别的,在执行一个测试类的时候只会调用一次被注解的Rule 二.JU

JUnit4学习笔记(三):assertThat语法与Matcher

一.使用JUnit的一般测试语法 org.junit.Assert类里有各种断言方法,大部分情况下我们会像下面这个例子一样编写测试: 1 public class AssertThatTest { 2 private int id = 6; 3 private boolean trueValue = true; 4 private Object nullObject = null; 5 private String msg = "Hello World"; 6 7 @Test 8 pu

Junit4学习笔记--方法的执行顺序

package com.lt.Demo.TestDemo; 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; im

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

Ajax学习笔记(二)

二.prototype库详解 1.prototype库的使用 //导入下载好的prototype.js文件 <script type="text/javascript" src="prototype.js"></script> //在自己的js中直接使用Prototype对象 <script type="text/javascript"> document.writeln("Prototype库的版本

NFC学习笔记二——Libnfc简介与安装

一直想把自己对过的英文文章做一下翻译记录下来,趁着学习NFC,现将libnfc首页的对libnfc介绍和在不同操作系统上对libnfc安装的文章做一下翻译,一方面提高一下自己的英语,另一方面学习一下libnfc. 原文地址:http://nfc-tools.org/index.php?title=Libnfc 公共平台独立的近场通讯(NFC)库 libnfc是GNU公共许可正下发布的第一个免费的底层的NFC开发包和编程API.它对任何人事完全免费和公开的.这个列表显示了libnfc支持的功能.l

Spring视频学习笔记(二)

Spring视频学习笔记(二) XML配置里的Bean自动装配(三个来测试实现) /** * Person类 * */ public class Person { private String name; private Address address; private Car car; public String getName() { return name; } public void setName(String name) { this.name = name; } public Ad

WPF的Binding学习笔记(二)

原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的皮毛, 然后就做别的事去了, 等回头再来看WPF的时候, 哈忘记了~ 于是写个例子补一下, 在继续学习Binding. 1, 首先准备好一个类 public class Hero { public Hero(int id, string name, string skill, bool hasM)

ninject学习笔记二:单例模式singleton pattern

今天准备学习singleton pattern,顾单词思含义,就是一个实例的意思.单例的实现思路是:私有化构造函数,提供公有方法获取类的实例.下面定义一个音乐播放器类MusicPlayer,观察单例的实现方法 class MusicPlayer { private static readonly MusicPlayer player = new MusicPlayer(); private MusicPlayer() { } public static MusicPlayer GetInstan