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 测试示例的更多相关文章

  1. 【转】Oracle索引列NULL值引发执行计划该表的测试示例

    有时开发进行表结构设计,对表字段是否为空过于随意,出现诸如id1=id2,如果允许字段为空,因为Oracle中空值并不等于空值,有可能得到意料之外的结果.除此之外,最关键的是,NULL会影响oracl ...

  2. cdh5.7权限测试示例

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 本文旨在展示CDH基于Kerberos身份认证和基于Sentry的权限控制功能的测试示例. 1. 准备测试数据 cat / ...

  3. web项目中 集合Spring&使用junit4测试Spring

    web项目中 集合Spring 问题: 如果将 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(& ...

  4. WPF命中测试示例(二)——几何区域命中测试

    原文:WPF命中测试示例(二)--几何区域命中测试 接续上次的命中测试,这次来做几何区域测试示例. 示例 首先新建一个WPF项目,在主界面中拖入一个按钮控件,并修改代码中的以下高亮位置: 当前设计视图 ...

  5. WPF命中测试示例(一)——坐标点命中测试

    原文:WPF命中测试示例(一)--坐标点命中测试 命中测试也可被称为碰撞测试,在WPF中使用VisualTreeHelper.HitTest()方法实现,该方法用于获取给定的一个坐标点或几何形状内存在 ...

  6. Junit4 测试代码

    Junit4 测试代码 import org.junit.Test; import org.junit.runner.RunWith; @RunWith(SpringJUnit4ClassRunner ...

  7. 使用JUnit4测试Spring

    测试DAO import static org.junit.Assert.*; import org.junit.Before; import org.junit.Ignore; import org ...

  8. JUnit4测试简介

    相比于自己写一个测试类,在里面调用调试方法,使用JUnit4进行测试有很多的优点,极大的提高了测试的速度.本文简单介绍如何使用myEclipse10使用JUnit4,方便日后回顾总结. myEclip ...

  9. junit4测试 Spring MVC注解方式

    本人使用的为junit4进行测试 spring-servlet.xml中使用的为注解扫描的方式 <?xml version="1.0" encoding="UTF- ...

随机推荐

  1. Hive入门笔记---1.Hive简单介绍

    1. Hive是什么 Hive是基于Hadoop的数据仓库解决方案.由于Hadoop本身在数据存储和计算方面有很好的可扩展性和高容错性,因此使用Hive构建的数据仓库也秉承了这些特性.这是来自官方的解 ...

  2. ms17010漏洞复现-2003

    先使用Smbtouch模块检测一下是否有漏洞. 然后使用Doublepulsar写一个shellcode到本地. 生成成功后的截图: 再使用EternalRomance植入Doublepulsar后门 ...

  3. shell中日期操作

    1. date -d操作 date +"%Y%m%d" -d "+n days" #今天的后n天日期 date +"%Y%m%d" -d & ...

  4. 在MySQL应用上的挑战

    本期采访的讲师是来自腾讯高级软件工程师 雷海林,他有着10年以上的Linux后台Server开发经验,目前主要从事分布式Cache.实时大数据处理引擎,分布式MySQL(TDSQL)设计和开发工作. ...

  5. QQ会员活动运营平台架构设计实践——高效自动化运营

    QQ会员活动运营平台(AMS),是QQ会员增值运营业务的重要载体之一,承担海量活动运营的Web系统.在过去四年的时间里,AMS日请求量从200-500万的阶段,一直增长到日请求3-5亿,最高CGI日请 ...

  6. gitolite

    gitolite: https://github.com/sitaramc/gitolite https://github.com/sitaramc/gitolite/tags

  7. hdu6125 Free from square 分组背包+状态压缩

    /** 题目:hdu6125 Free from square 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6125 题意: 从不大于n的所有正整数中选出 ...

  8. 科技巨头们以 "A" 取名的时尚潮流

    科技巨头们以 "A" 取名的时尚潮流 from 公众号  WebHub  世界上有许多巨头公司喜欢以字母 a 打头作公司起名.改名,这主要是因为电话薄是以字母排序的(外国人习惯家里 ...

  9. 使用JAVASCRIPT进行数据完整性验证

    页面输入完整性是编写BS经常遇到的问题,如果那里需要就到那里写,那可是要花不少的时候,并且造成不必要的浪费,下面是一个通过校验脚本,使用非常方便,通过传入FORM名就可以进行校验,通过在页面控件中增加 ...

  10. 子级用css float浮动 而父级div没高度不能自适应高度

    子级对象使用css float浮动 而父级div不能自适应高度. 对父级div标签闭合</div>前加一个clear清除浮动对象. <!DOCTYPE html> <ht ...