SpringBoot(20)---断言(Assert)

我们在写单元测试的时候,除了接口直接抛异常而导致该单元测试失败外,还有种是业务上的错误也代表着该单元测试失败。好比我们在测试接口的时候,

该接口返回是1代表成功,如果是0那就代表是失败的,这个时候可以考虑使用断言。

一、原理

我们知道,我们可以通过断言来校验测试用例的返回值和实际期望值进行比较,以此来判断测试是否通过。那我们先来看下如果失败的情况下它的流程是怎么样的。

对于断言而言,如果是错误最终都会进入下面的方法

    static public void fail(String message) {
if (message == null) {
throw new AssertionError();
}
throw new AssertionError(message);
}

很明显,这里有一个AssertionError对象,我们来看下这个对象。

public class AssertionError extends Error {
//......
}

我们很明显看到,它实继承是Error,而不是Exception。这说明什么,说明你无法通过try catch去捕获这个异常,只要进入断言fail中,一定会抛出异常。

二、Assert 源码

这里只展示Assert源码中常用的方法,一些不常用或者过期的方法这里就不展示了。

public class Assert {
/**
* 结果 = 预期 则正确
*/
static public void assertEquals(Object expected, Object actual)
/**
* 结果 != 预期 则正确
*/
static public void assertNotEquals(Object unexpected, Object actual)
/**
* condition == true 则正确
*/
static public void assertTrue(boolean condition)
/**
* condition == false 则正确
*/
static public void assertFalse(boolean condition)
/**
* 永远是错误
*/
static public void fail()
/**
* 结果不为空 则正确
*/
static public void assertNotNull(Object object)
/**
* 结果为空 则正确
*/
static public void assertNull(Object object)
/**
* 两个对象引用 相等 则正确(上面相当于equels 这里类似于使用“==”比较两个对象)
*/
static public void assertSame(Object expected, Object actual)
/**
* 两个对象引用 不相等 则正确
*/
static public void assertNotSame(Object unexpected, Object actual)
/**
* 两个数组相等 则正确
*/
public static void assertArrayEquals(Object[] expecteds, Object[] actuals)
/**
* 这个单独介绍
*/
public static <T> void assertThat(T actual, Matcher<? super T> matcher)
}

注意 上面每一个方法,都会有一个多一个参数的方法,这个参数为:String message。意思就是错误的情况下,我们可以输出我们自定义的message

示例

   //这个就表示 结果 != 预期 的情况下,抛出的AssertionError 信息是我们指定的message
static public void assertEquals(String message,Object expected, Object actual)

上面还有一个方法需要单独介绍,那就是assertThat方法。

三、assertThat方法

大家习惯把assertThat理解成新断言,因为上面所以的功能方法,都可以通过assertThat这一个方法来实现。

1、基本语法

assertThat 的基本语法如下:

assertThat( [value], [matcher statement] );

value 是接口返回信息中,我们想要测试的变量值

matcher statement: 是使用Hamcrest匹配符来表达的对前面变量所期望的值的声明,如果value值与matcher statement所表达的期望值相符,则测试成功,否则测试失败。

2、基本使用

字符串匹配符

  String n = "xiao";
// containsString:字符串变量中包含指定字符串时,测试通过
assertThat(n, containsString("xiao"));
// startsWith:字符串变量以指定字符串开头时,测试通过
assertThat(n, startsWith("xi"));
// endsWith:字符串变量以指定字符串结尾时,测试通过
assertThat(n, endsWith("ao"));
// euqalTo:字符串变量等于指定字符串时,测试通过
assertThat(n, equalTo("xiao"));
// equalToIgnoringCase:字符串变量在忽略大小写的情况下等于指定字符串时,测试通过
assertThat(n, equalToIgnoringCase("xiao"));
// equalToIgnoringWhiteSpace:字符串变量在忽略头尾任意空格的情况下等于指定字符串时,测试通过
assertThat(n, equalToIgnoringWhiteSpace(" xiao "));

int匹配符

int s = 1;
// allOf:所有条件必须都成立,测试才通过(大于1同时小于3)
assertThat(s, allOf(greaterThan(1), lessThan(3)));
// anyOf:只要有一个条件成立,测试就通过 (大于1或者小于2)
assertThat(s, anyOf(greaterThan(1), lessThan(2)));
// anything:无论什么条件,测试都通过
assertThat(s, anything());
// is:变量的值等于指定值时,测试通过
assertThat(s, is(2));
// not:和is相反,变量的值不等于指定值时,测试通过
assertThat(s, not(1));

double匹配符

double d = 1D;
// closeTo:浮点型变量的值在3.0±0.5范围内,测试通过
assertThat(d, closeTo(3.0, 0.5));
// greaterThan:变量的值大于指定值时,测试通过
assertThat(d, greaterThan(3.0));
// lessThan:变量的值小于指定值时,测试通过
assertThat(d, lessThan(3.5));
// greaterThanOrEuqalTo:变量的值大于等于指定值时,测试通过
assertThat(d, greaterThanOrEqualTo(3.3));
// lessThanOrEqualTo:变量的值小于等于指定值时,测试通过
assertThat(d, lessThanOrEqualTo(3.4));

集合匹配符

List<String> list = new ArrayList();
// hasItem:Iterable变量中含有指定元素时,测试通过
assertThat(list, hasItem("xiao"));
Map<String, String> m = new HashMap<>();
// hasEntry:Map变量中含有指定键值对时,测试通过
assertThat(m, hasEntry("xi", "xiao"));
// hasKey:Map变量中含有指定key时,测试通过
assertThat(m, hasKey("x"));
// hasValue:Map变量中含有指定value值时,测试通过
assertThat(m, hasValue("x"));

四、测试

这里对于老断言,和新断言各测试5个。

1、老断言

示例

public class TestServiceImplTest {

    @Test
public void test1() {
String str = "xiao";
assertEquals(str, "xiaoniao");//不相等,所以错误
}
@Test
public void test2() {
assertFalse(Boolean.TRUE); //不是false,所以错误
}
@Test
public void test3() {
fail("直接是错误"); //直接是错误
}
@Test
public void test4() {
assertNull("xiao"); //不为空所以为错误
}
@Test
public void test5() {
assertNotNull("xiao");//不为空,所以为正确
}
}

这里应该只有第5个测试用例通过,前面4个都不通过的,我们在来看实际运行结果

与实际相符,前面4个,测试用例不通过。而且可以看到第3个是我们自定义错误信息,在控制台也打印出来了。

2、新断言

示例

import org.assertj.core.util.Lists;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.hamcrest.CoreMatchers.anyOf;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat; public class TestServiceImplTest { @Test
public void test1() {
String str = "xiao";
assertThat("这两字符串不相等",str, is("xiaoniao"));//不相等,所以错误
}
@Test
public void test2() {
int s = 1;
assertThat(s, anyOf(greaterThan(1), lessThan(2)));//满足 大于1或者小于2 所以正确
}
@Test
public void test3() {
double d = 1D;
assertThat(d, allOf(greaterThanOrEqualTo(1D),lessThan(2D)));//满足大于等于1 并且 小于2 所以正确
}
@Test
public void test4() {
List<String> list = Lists.newArrayList("xiao","zhong","da");
assertThat(list, hasItem("xiao")); //包含xiao 所以正确
}
@Test
public void test5() {
Map<String, String> map = new HashMap<>();
map.put("xiao", "xiao");
assertThat(map, hasKey("xiao")); //该map包含该key,所以正确
}
}

这里应该只有第1个测试用例不通过,其它都是通过的,我们在来看实际运行结果

符合预期。

好了,整篇文章到这里就结束了,下面把该项目的具体代码放到github上。

GitHub地址 :07-test

别人骂我胖,我会生气,因为我心里承认了我胖。别人说我矮,我就会觉得好笑,因为我心里知道我不可能矮。这就是我们为什么会对别人的攻击生气。
攻我盾者,乃我内心之矛(31)

SpringBoot(20)---断言(Assert)的更多相关文章

  1. 断言(assert)的用法

    我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”. 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解 ...

  2. C语言中断言ASSERT

    我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错". 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种&qu ...

  3. 使用断言assert

    之前有看过关于Assert的书,但是不懂得如何去用,最近看别人写的代码有用这个断言(assert),今天自己动手看看如何使用断言. 断言(assert)的语义如下:如果表达式的值为0(假),则输出错误 ...

  4. 断言Assert的使用

     转载地址:http://www.cnblogs.com/moondark/archive/2012/03/12/2392315.html 我一直以为assert仅仅是个报错函数,事实上,它居然是个宏 ...

  5. K:java 断言 assert 初步使用:断言开启、断言使用

    @转自天地悠悠的个人博客 主要总结一下在eclipse中如何使用断言. (一)首先明确: java断言Assert是jdk1.4引入的. jvm 断言默认是关闭的. 断言是可以局部开启的,如:父类禁止 ...

  6. java的断言(assert)

    概述 在C和C++语言中都有assert关键,表示断言.在Java中,同样也有assert关键字,表示断言,用法和含义都差不多.在Java中,assert关键字是从JAVA SE 1.4 引入的,为了 ...

  7. C# 断言 Assert

    重构-断言 现象:某一段代码需要对程序状态做出某种假设 做法:以断言明确表现这种假设 动机: 常常有这种一段代码:只有某个条件为真是,该改名才能正常运行. 通常假设这样的假设并没有代码中明确表现出来, ...

  8. JavaScript之调试工具之断言assert

    1.单点断言 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  9. 断言(assert)

    断言(assert):用来调试.测试代码. 格式: assert 布尔表达式: 字符串 (如果布尔表达式为false时,这个字符串才会显示). 注意: assert默认是关闭的,使用时需要使用&quo ...

随机推荐

  1. PAT 2-05. 求集合数据的均方差(15)

    题目意思:求N个给定整数的均方差. 求平均值需要先转化为double类型,如果没转化会损失精度,造成错误. 代码如下: #include<iostream> #include<cma ...

  2. python基础 Day9

    python Day9 函数的初识 #代码的可读性较好 s=[1,2,3,4,5,5] def list_len(S): count=0 for i in s: count+=1 print(coun ...

  3. 第1章 RDD概念 弹性分布式数据集

    第1章 RDD概念  弹性分布式数据集 1.1 RDD为什么会产生 RDD是Spark的基石,是实现Spark数据处理的核心抽象.那么RDD为什么会产生呢? Hadoop的MapReduce是一种基于 ...

  4. Kubernetes入门(二)——Dashboard 安装

    Kubernetes集群搭建完成后,可以通过命令行方式可以了解集群资源的使用情况,但是这种方式比较笨拙且不直观,因此考虑给集群安装Dashboard,这样能更直观了解集群状态.本文Dashboard的 ...

  5. LG P6788 「EZEC-3」四月樱花

    Description 在樱花盛开的四月,Muxii 望着满天飘落的樱花,向身旁的 ZZH 问道: “究竟有多少朵樱花在这个四月飘落?” ZZH 答道:“樱花飘落的朵数  $s$与时间 $t$ 有如下 ...

  6. JS学习阶段性总结-1

    各种函数的声明 /** * 函数的声明 */ // 声明一个方法,任意调用 function aaa(args){...} // 声明一个函数并以变量的形式展示出去,因此无法再声明前调用 var fn ...

  7. 从request中获取文件流的两种方式,配置文件上传大小

    原文地址:https://blog.csdn.net/xyr05288/article/details/80692132

  8. Javascript数组与函数初识

    1 - 数组 1.1 数组的概念 数组可以把一组相关的数据一起存放,并提供方便的访问(获取)方式. 数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素.数组是一种将一组数 ...

  9. Laravel Facade原理及使用

    Laravel Facade原理及使用 laravel过于庞大,加之笔者水平有限,所以后面的源码解读会按模块功能介绍,希望能帮大家稍微捋顺下思路,即使能够帮助大家回顾几个函数也好.如发现错误,还望指正 ...

  10. 10行Python代码自动清理电脑内重复文件,解放双手!

    大家好,又到了Python办公自动化系列. 今天分享一个系统层面的自动化案例: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做 ...