1、首先第一步需要导入对应的jar包

我们来看下面的一个例子

OK,在前面的一系列博客里面,我整理过了Assert类下面常用的断言方法,比如assertEquals等等,但是org.junit.Assert类下还有一个方法也用来断言,而且更加强大。这就是我们这里要这里的:

Assert的AssertThat()方法和Hamcrest匹配器

1,断言抛出的异常

明显的,有的时候我们想测试我们的代码在某种情况下抛出异常。比如说对于无效输入,我们希望代码抛出IllegalArgumentException。前面我也已经说过了,可以使用Test注解的一个expected属性来遇见我们抛出的异常。代码如下:

package test.junit4test;

import org.junit.Test;

public class LinkinTest
{

@Test(expected=NullPointerException.class)
public void test()
{
String str = null;
System.out.println(str.toString());
}
}

这是一种检查异常的简洁方式。但是有时候我们想更加具体的了解抛出的具体异常。考虑如下情景:现在我们除了想知道我们抛出的异常属于那种类型,我们还想检查抛出的异常中“message”中携带的信息。那么怎么办呢?
那么没办法,让我们返回到古老的try和catch吧。然后在catch块中我们来使用Assert类的assertThat()方法和强大的Hamcrest匹配器来处理吧。代码如下:
package test.junit4test;

import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test; public class LinkinTest
{ @Test
public void test()
{
try
{
throw new Exception("吆西,这里应该抛出异常的呢。。。");
}
catch (Exception e)
{
Assert.assertThat(e.getMessage(), Matchers.containsString("吆西"));
}
}
}
代码写成下面的形式
package com.weiyuan.test;

import java.security.AlgorithmParameterGenerator;
import java.security.AlgorithmParameters; import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import static org.junit.Assert.*; public class TestCalcuate {
private Calcuate calcuate; /**
*
* 执行任何测试方法之前都会调用该方法
* */
@Before
public void setUp(){
calcuate = new Calcuate();
} /**
* 为了兼容junit3
* 按照testXX方法命名
* public int (int a,int b){
* */ @Test
public void testAdd(){
int result = calcuate.add(12, 20);
assertEquals("加法有问题", result, 32);
} @Test(expected=ArithmeticException.class)
public void testDivide(){
int result = calcuate.divide(12, 0);
assertEquals("触发有问题", result, 4);
} /**
* 如果测试方法执行超过200毫秒
* 就会报错
* */ @Test(timeout=200)
public void testTimeout(){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} @Test
public void testException(){
try
{
throw new Exception("吆西,这里应该抛出异常的呢。。。");
}
catch (Exception e)
{
Assert.assertThat(e.getMessage(), Matchers.containsString("555"));
}
} }

因为上面抛出的异常的message不包含555字符串所以运行失败,我们可以通过hamcrest包提供的Matches来增加junit的测试功能

需要注意点:hamcrest需要静态导入对应的包

import static org.hamcrest.Matchers.*;

案例2:使用hamcrest判断一个数的大小
package com.weiyuan.test;

import java.security.AlgorithmParameterGenerator;
import java.security.AlgorithmParameters; import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test; import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
public class TestCalcuate {
private Calcuate calcuate; /**
*
* 执行任何测试方法之前都会调用该方法
* */
@Before
public void setUp(){
calcuate = new Calcuate();
} /**
* 为了兼容junit3
* 按照testXX方法命名
* public int (int a,int b){
* */ @Test
public void testAdd(){
int result = calcuate.add(12, 20);
assertEquals("加法有问题", result, 32);
} @Test(expected=ArithmeticException.class)
public void testDivide(){
int result = calcuate.divide(12, 0);
assertEquals("触发有问题", result, 4);
} /**
* 如果测试方法执行超过200毫秒
* 就会报错
* */ @Test(timeout=200)
public void testTimeout(){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} @Test
public void testHamcrest(){
/*
* 判断10是否大于20*/
assertThat(10, greaterThan(20));
} }

使用了hamacet提供的greaterThan功能

程序运行的结果如下
 
hamcrest还定义了下面的很多规则

我们判断10是否大于5,小于12

@Test
public void testHamcrest(){ assertThat(10, allOf(greaterThan(5),lessThan(12)));
}

在运行的时候报错

这是由于junit4的java包和hamcijava冲突引起的,如何解决了

需要把ham的jar包移动到juint的上面

我们在运行的时候,就不会报错了

TestSuite:测试集合,即一组测试。一个test suite是把多个相关测试归入一组的快捷方式。如果自己没有定义,Junit会自动提供一个test suite ,包括TestCase中的所有测试。

依赖性指的是每个测试方法都是独立的,执行测试方法2之前,才能执行测试方法3,测试的时候必须保证测试类的独立性

我们以前执行每个测试类都是独立的,我们现在有很多测试类,我们能不能使用一个组件在管理执行测试类,当然可以

package com.weiyuan.test;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses; //说明这个测试类,是一个组件测试类,用来管理所有的测试类
@RunWith(Suite.class)
//指定管理那些测试类
@SuiteClasses({TestA.class,TestB.class,TestCalcuate.class})
public class TestSuite { }
package com.weiyuan.test;

import org.junit.Test;

public class TestA {

    @Test
public void testA(){
System.out.println("testA is called");
}
}
package com.weiyuan.test;

import org.junit.Test;

public class TestB {

    @Test
public void testB(){
System.out.println("testB is called");
}
}

整个项目的工程代码如下所示

我们在组件的java类上面运行测试

我们可以看到控制台的打印

先执行TestA中的所有方法,然后是TestB中的,然后是TestCalcuate的


02.Hamcrest和TestSuite介绍的更多相关文章

  1. JUnit学习之hamcrest、testSuite介绍及测试原则

    [转自] http://huihai.iteye.com/blog/1994270 上一节说了junit的一些基本概念,主要使用assert做一些基本的判断.但很多时候使用assert做判断,并不方便 ...

  2. ClickHouse(02)ClickHouse架构设计介绍概述与ClickHouse数据分片设计

    ClickHouse核心架构设计是怎么样的?ClickHouse核心架构模块分为两个部分:ClickHouse执行过程架构和ClickHouse数据存储架构,下面分别详细介绍. ClickHouse执 ...

  3. 02 Memcache add详细介绍

    一:Memcached add 命令参数 ()add key flag expire length [增] key: 键名(起一个独立的名字) flag 标志,要求为一个正整数 备注:()当Memca ...

  4. scratch少儿编程第一季——02、scratch界面介绍

    各位小伙伴大家好: 上期我们简单的介绍了Scratch的一些基本信息,和scratch软件的下载. 今天我们一起来了解一下Scratch的编程界面的介绍. 关于版本我考虑之后还是决定基于Scratch ...

  5. TypeScript——02——TS基本数据类型介绍和使用

    一,TS的数据类型 ES6的数据类型: 6种基本数据类型 Boolean Number String Symbol undefined null 3种引用类型 Array Function Objec ...

  6. 02编程语言与python介绍

    编程语言分类 机器语言:直接用计算机能理解的二进制指令去编写程序,是直接在控制计算机硬件 优点:运行效率高 缺点:开发效率低 1.开发一个简单的小功能都要哟个到非常多条数的二进制指令 2.二进制指令非 ...

  7. 【Java 语言生态篇】Junit 测试单元

    01 概述   JUnit是一个由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework).Junit测试是白盒测试.JUn ...

  8. xamarin之 安装工具介绍

    原文:xamarin之 安装工具介绍 思考: 1,  一定要按照顺序安装吗? 先装JDK,再装Android SDK 原因:Android SDK采用了Java语言 先装Android SDK,再装A ...

  9. fiddler教程:抓包带锁的怎么办?HTTPS抓包介绍。

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍Fiddler的HTTPS抓包功能." 这里首先回答下标题中的疑问,fiddler抓包带锁的原因是HTTPS流量抓包功能开启, ...

随机推荐

  1. XMLHttpRequest实现Ajax &数据格式JSON

    GET请求 index <%@ page language="java" contentType="text/html; charset=utf-8" p ...

  2. java方式实现希尔排序

    一.希尔排序简述和基本思想 希尔排序也称递减增量排序算法,是插入排序的一种更高效的改进版本.但是希尔排序是非稳定排序的算法.希尔排序比一般插入排序有以下几点改进: 一般插入排序每次只能将数据移动一位, ...

  3. & 异步使用场景

    异步的使用场景: 1.不涉及共享资源,或对共享资源只读,即非互斥操作 2.没有时序上的严格关系 3.不需要原子操作,或可以通过其他方式控制原子性 4.常用于IO操作等耗时操作,因为比较影响客户体验和使 ...

  4. 实用教程丨使用K3s和MySQL运行Rancher 2.4

    本文转自Rancher Labs 简 介 本文将介绍在高可用K3s Kubernetes集群上安装Rancher 2.4的过程并针对MySQL利用Microsoft Azure数据库的优势,该数据库消 ...

  5. Chisel3 - util - Math vs. CircuitMath

    https://mp.weixin.qq.com/s/8lC8vQnBdKW9C39H0QFFkA     对数相关的辅助方法,Math通过软件方法实现,CircuitMath通过硬件方法实现.   ...

  6. Java实现 LeetCode 306 累加数

    306. 累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ...

  7. Java实现蓝桥杯打印图形

    标题:打印图形 如下的程序会在控制台绘制分形图(就是整体与局部自相似的图形). 当n=1,2,3的时候,输出如下: 请仔细分析程序,并填写划线部分缺少的代码. n=1时: o ooo o n=2时: ...

  8. Java中Iterator 和ListIterator的区别

    1.Iterator Iterator的定义如下: public interface Iterator {} Iterator是一个接口,它是集合的迭代器.集合可以通过Iterator去遍历集合中的元 ...

  9. java实现顺时针螺旋填入

    从键盘输入一个整数(1~20) 则以该数字为矩阵的大小,把 1,2,3-n*n 的数字按照顺时针螺旋的形式填入其中.例如: 输入数字 2,则程序输出: 1 2 4 3 输入数字 3,则程序输出: 1 ...

  10. Nlog打印日志到Influxdb数据库

    1.安装和使用Influxdb 安装部分网上资料比较多,也讲的比较详细,请自行百度. 下面大概讲下InfluxDB的写入和读取数据的方法. 我使用了InfluxData.Net包. 工具->Nu ...