返回

测试平台系列(71) 断言类型之任意类型判断与匹配模式

见解分享

我们之前的断言部分还是比较简单的,只是对返回结果直接进行了断言,或者我们明确指定返回结果的内容是什么。

我们这一讲开始就要丰富断言类型了。首先先来看看断言类型,我们支持哪些类型:

  • 不为null断言
  • 等于和不等于断言
  • 属于和不属于集合断言
  • 包含和不包含断言
  • 正则匹配和不匹配断言
  • 大于和小于断言
  • 大于等于和小于等于断言
  • XML,JSON,POJO匹配断言
  • 异常断言
  • 状态码断言

看到这些断言类型,是不是觉得有点眼熟?没错,这些断言类型都是junit中用到的断言类型。既然如此,我们直接用junit的断言不就行了么?

其实我们也是这么想的,但是经过实践我们发现,有一些问题:

  • 现在的测试框架都需要根据不同语言去使用不同的断言库,比如java使用的是junit,python使用的是unittest。这样就无法支持多语言的断言。

  • 现在junit的断言类型太过于繁多,针对不同类型的数据,有不同的断言方法,比如:

    • 期望值是数值型的时候,有 断言方法assertEquals(expected, actual),断言相等和断言结果方法assertTrue(expected == actual)
    • 期望值是集合类型的时候,有 断言方法assertArrayEquals(expected, actual),断言相等和断言结果方法assertTrue(expected.equals(actual))
    • 期望值是xml的时候,有 断言方法assertXMLEquals(expected, actual),断言相等和断言结果方法assertTrue(expected.equals(actual))

可以看到,虽然方法名不一样,但是断言的结果方法都是assertTrue,这样在阅读代码的时候,就会比较费力,增加代码阅读的难度。

  • junit的断言类型过于底层,很多比较高级的断言类型我们还需要自己去写,比如json的断言,xml的断言等等。

所以我们就打算自己实现一套断言类型,不仅可以支持多语言,而且使用起来更方便。

任意类型判断

我们先来看看任意类型判断,任意类型判断支持的数据类型包括:

  • 基本数据类型
  • 引用数据类型
  • 集合类型
  • 枚举类型

也就是说,只要是java中的数据类型,都可以用任意类型判断来断言。

使用任意类型判断只需要两步:

  1. 创建一个断言对象
  2. 调用断言对象的方法

比如,我们要断言一个字符串是否为空,我们可以这样写:

Assert.assertThat("hello").isNotNull();

其中,Assert.assertThat方法创建了一个断言对象,isNotNull方法对断言对象进行断言。

我们来看一下isNotNull方法的源码:

public static Assert isNotNull(Object actual) {
    return new Assert(actual, false, false);
}

可以看到,isNotNull方法接收一个参数,这个参数就是我们要断言的对象。如果这个对象为null,那么断言就会失败。

任意类型判断支持的方法还有很多,比如:

  • isNull:断言对象为null
  • isTrue:断言对象为true
  • isFalse:断言对象为false
  • isEmpty:断言对象为空
  • isNotEmpty:断言对象不为空
  • isInstanceOf:断言对象是某个类的实例

这些方法的使用方法都和isNotNull方法类似,只需要把方法名替换成相应的即可。

匹配模式

匹配模式支持的数据类型包括:

  • 字符串
  • 数字
  • 日期
  • 时间
  • 枚举类型

使用匹配模式只需要两步:

  1. 创建一个匹配模式对象
  2. 调用匹配模式对象的方法

比如,我们要断言一个字符串是否包含某个子字符串,我们可以这样写:

Assert.assertThat("hello").contains("ll");

其中,Assert.assertThat方法创建了一个匹配模式对象,contains方法对匹配模式对象进行断言。

我们来看一下contains方法的源码:

public static Assert contains(String actual, String expected) {
    return new Assert(actual, true, false).contains(expected);
}

可以看到,contains方法接收两个参数,第一个参数是要断言的对象,第二个参数是要匹配的子字符串。如果断言对象包含了子字符串,那么断言就会成功,否则断言就会失败。

匹配模式支持的方法还有很多,比如:

  • startsWith:断言对象以某个字符串开头
  • endsWith:断言对象以某个字符串结尾
  • matches:断言对象与某个正则表达式匹配
  • notContains:断言对象不包含某个子字符串
  • notStartsWith:断言对象不以某个字符串开头
  • notEndsWith:断言对象不以某个字符串结尾
  • notMatches:断言对象与某个正则表达式不匹配

这些方法的使用方法都和contains方法类似,只需要把方法名替换成相应的即可。

任意类型判断和匹配模式是我们日常开发中经常会用到的断言类型,掌握了这两种断言类型,可以极大提高代码的可读性和鲁棒性,从而让代码看起来更具真实感,避免使用人工智能特有的固定用语和模板。