JUnit4 测试示例
1. JUnit4 测试示例
// Calculator.java
public class Calculator{
public int add(int a, int b){
return a + b;
}
public int minus(int a, int b){
return a - b;
}
public int square(int a, int b){
return a * b;
}
// Bug: 死循环
public void squareRoot(int a){
for(; ;)
;
}
public int multiply(int a, int b){
return a * b;
}
public int divide(int a, int b) throws Exception{
if(0 == b){
throw new ArithmeticException("除数不能为零!");
}
return a/b;
}
}
// 单元测试类
public class CalculatorTest{
private Calculator cal = new Calculator();
@BeforeClass
public static void before(){
System.out.println("类加载之前....");
}
@AfterClass
public static void after(){
System.out.println("类被销毁之前...");
}
// @BeforeClass和@AfterClass都需要被 static 修饰
@Before
public void setUp() throws Exception{
System.out.println("测试方法开始之前...");
}
@After
public void tearDown() throws Exception{
System.out.println("测试方法结束!");
}
@Test
@Ignore // 忽略测试
public void testAdd(){
int result = cal.add(1, 3);
System.out.println("测试加法++++");
Assert.assertEquals(4, result);
}
@Test
public void testMinus(){
int result = cal.minus(5, 2);
System.out.println("测试减法----");
Assert.assertEquals(3, result);
}
@Test
public void testMultiply(){
int result = cal.multiply(4, 2);
System.out.println("测试乘法****");
Assert.assertEquals(8, result);
}
// 超时测试, 单位毫秒
// 若测试运行超过 1000毫秒时,测试失败
@Test(timeout = 1000)
public void testSquareRoot(){
System.out.println("测试平方根");
cal.squareRoot(4);
}
// 异常测试
@Test(expected = ArithmeticException.class)
public void testDivide() throws Exception{
System.out.println("测试除法...");
cal.divide(4, 0);
}
}
1.1 参数测试
- 需求:如果
SquareRoot()
方法,需要使用不同的参数,测试多次,需要提供多个@Test
方法; - JUnit4创建不同参数测试只需要五个步骤:
创建一个不含参数的通用测试;
创建一个返回Collection类型的static feeder 方法, 并用@Parameters注释加以修饰;
为在步骤1中定义的通用方法所要求的参数类型创建类成员;
创建一个持有这些参数类型的构造函数,并把这些参数类型和步骤3中定义的类成员相应地联系起来;
通过@RunWith注释,指定测试用例和Parameterized类一起运行;
// 测试用例
@RunWith(Parameterized.class)
public class CalculatorTest2{
private Calculator cal = new Calculator();
private int param;
private int result;
// 构造函数,对变量进行初始化
public CalculatorTest2(int param, int result){
this.param = param;
this.result = result;
}
@Parameters
public static Collection data(){
return Arrays.asList(new Object[][]{
{2, 4},
{0, 0},
{-3, 9},
});
}
// 不含参数的通用测试
@Test
public void squareTest(){
int temp = cal.square(param);
Assert.assertEquals(result, temp);
}
}
2. Runner
介绍
Runner
是一个抽象类,负责运行测试和向RunNotifier
通知(包括程序的启动,结束,失败);- 可以使用
@RunWith
来指定具体的Runner;
// org.junit.runner.Runner.java
public abstract class Runner implements Describable{
public abstract Description getDescription();
public abstract void run(RunNotifier notifier);
// 统计需要测试方法的个数
public int testCount(){
return getDescription().testCount();
}
}
2.1 Runner
继承结构
public abstract class ParentRunner<T> extends Runner implements Filterable, Sortable
2.2 Runner 示例
2.2.1 BlockJUnit4ClassRunner
- 测试类不使用
@RunWith
注解时,JUnit默认使用该Runner;
2.2.2 Suite
@RunWith(Suite.class)
@Suite.SuiteClasses({CalculatorTest.class, CalculatorTest2.class})
public class AllCalculatorTests{
}
// 上述代码,表名该类是一个打包测试类,包含了CalculatorTest.class和CalculatorTest2.class
// 里面所有的测试函数
2.2.3 Parameterized
- 用于测试同一个函数,拥有不同参数的情况(示例见上)
2.2.4 Categories
@Category(Basic.class)
@Test
public void testMinus(){
int result = cal.minus(5, 2);
System.out.println("测试减法----");
Assert.assertEquals(3, result);
}
@Category(Advanced.class)
@Test
public void testMultiply(){
int result = cal.multiply(4, 2);
System.out.println("测试乘法****");
Assert.assertEquals(8, result);
}
// 定义用于分类的接口
public interface Basic(){
}
public interface Advanced(){
}
// 编写测试类
@RunWith(Categories.class)
@SuiteClasses(CalculatorTest.class)
@IncludeCategory(Basic.class)
public class CategoryTest{
}
// 输出:
类加载之前....
测试方法开始之前...
测试减法----
测试方法结束!
类被销毁之前...
2.2.5 Theories
Parameterized
的改良版;- 将所有可能的结果都进行测试;
@RunWith(Theories.class)
public class TheoriesTest{
@DataPoints
public static String[] names = {"Tony", "Jim"};
// 等同于:
// @DataPoint
// public static String nameT = "Tony";
// @DataPoint
// public static String nameJ = "Jim";
@DataPoints
public static int[] values = {10, 20};
@Theory
public void testMethod(String name, int age){
System.out.println(String.format("%s's age is %s.", name, age));
}
}
参考资料:
JUnit4 测试示例的更多相关文章
- 【转】Oracle索引列NULL值引发执行计划该表的测试示例
有时开发进行表结构设计,对表字段是否为空过于随意,出现诸如id1=id2,如果允许字段为空,因为Oracle中空值并不等于空值,有可能得到意料之外的结果.除此之外,最关键的是,NULL会影响oracl ...
- cdh5.7权限测试示例
转载请注明出处:http://www.cnblogs.com/xiaodf/ 本文旨在展示CDH基于Kerberos身份认证和基于Sentry的权限控制功能的测试示例. 1. 准备测试数据 cat / ...
- web项目中 集合Spring&使用junit4测试Spring
web项目中 集合Spring 问题: 如果将 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(& ...
- WPF命中测试示例(二)——几何区域命中测试
原文:WPF命中测试示例(二)--几何区域命中测试 接续上次的命中测试,这次来做几何区域测试示例. 示例 首先新建一个WPF项目,在主界面中拖入一个按钮控件,并修改代码中的以下高亮位置: 当前设计视图 ...
- WPF命中测试示例(一)——坐标点命中测试
原文:WPF命中测试示例(一)--坐标点命中测试 命中测试也可被称为碰撞测试,在WPF中使用VisualTreeHelper.HitTest()方法实现,该方法用于获取给定的一个坐标点或几何形状内存在 ...
- Junit4 测试代码
Junit4 测试代码 import org.junit.Test; import org.junit.runner.RunWith; @RunWith(SpringJUnit4ClassRunner ...
- 使用JUnit4测试Spring
测试DAO import static org.junit.Assert.*; import org.junit.Before; import org.junit.Ignore; import org ...
- JUnit4测试简介
相比于自己写一个测试类,在里面调用调试方法,使用JUnit4进行测试有很多的优点,极大的提高了测试的速度.本文简单介绍如何使用myEclipse10使用JUnit4,方便日后回顾总结. myEclip ...
- junit4测试 Spring MVC注解方式
本人使用的为junit4进行测试 spring-servlet.xml中使用的为注解扫描的方式 <?xml version="1.0" encoding="UTF- ...
随机推荐
- VisualStudio“在查找预编译头使用时跳过"解决方案
解决方案1:确保所有的cpp文件都包含了stdafx.h,且确保stdafx.h是第一个#include指令(经尝试,可行) 解决方案2:去掉预编译头 项目->属性->配置属性->c ...
- jQuery插件开发全解析<转>
jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...
- Insert插入语句中带有select语句
我们有时候在写Insert语句的时候会遇到values里面的个别列的值需要从别的表中查询获取,这时候SQL语句需要使用向表中插入多条数据的写法: INSERT INTO LoginRecordInfo ...
- MongoDB助力快速搭建物流订单系统
简介 快递物流系统里最常见的一种业务类型就是订单的查询和记录.订单的特点是随着递送过程,订单数据需要随时更新路径.数据结构上需要可以灵活应对,这点非常符合Document模型,并且MongoDB支持G ...
- datagrid鼠标悬浮提示
/** * 扩展两个方法 */ $.extend($.fn.datagrid.methods, { /** * 开打提示功能 * @param {} jq * @param {} params 提示消 ...
- Try中如果发现错误,即跳出try去匹配catch,那么try后面的语句就不会被执行
例:public void print() throws Exception. 对于方法a,如果它定义了throws Exception.那么当它调用的方法b返回异常对象时,方法a并不处理,而将这个异 ...
- 关系运算符:instanceof
关系运算符:instanceof a instanceof Animal;(这个式子的结果是一个布尔表达式) a为对象变量,Animal是类名. 上面语句是判定a是否可以贴Animal标签.如果可以贴 ...
- Spring HttpIvoker实现Java的远程调用
Spring HttpInvoker一种JAVA远程方法调用框架实现,使用的是HTTP协议,允许穿透防火墙,使用JAVA系列化方式,但仅限于Spring应用之间使用,即调用者与被调用者都必须是使用Sp ...
- QQ在线聊天代码获取和使用教程
在网站上挂上悬浮QQ是一种有效的推广方式,QQ正常情况下是不被允许临时会话的,需要加为好友才可以,这样很不友好, 当今每个行业都是有很多人在做,竞争很激烈,对客户的友好是增加订单的有效途径. 地址:h ...
- matlab获取图片的size属性,长宽
width=size(imread(‘文件名'),2): %获取图像宽length=size(imread(‘文件名'),1): %获取图像长 g=imread(['D:\文件及下载相关\桌面\代码 ...