测试平台系列(71) 断言类型之任意类型判断与匹配模式
2024-01-29 18:15:44
我们之前的断言部分还是比较简单的,只是对返回结果直接进行了断言,或者我们明确指定返回结果的内容是什么。
我们这一讲开始就要丰富断言类型了。首先先来看看断言类型,我们支持哪些类型:
- 不为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中的数据类型,都可以用任意类型判断来断言。
使用任意类型判断只需要两步:
- 创建一个断言对象
- 调用断言对象的方法
比如,我们要断言一个字符串是否为空,我们可以这样写:
Assert.assertThat("hello").isNotNull();
其中,Assert.assertThat
方法创建了一个断言对象,isNotNull
方法对断言对象进行断言。
我们来看一下isNotNull
方法的源码:
public static Assert isNotNull(Object actual) {
return new Assert(actual, false, false);
}
可以看到,isNotNull
方法接收一个参数,这个参数就是我们要断言的对象。如果这个对象为null,那么断言就会失败。
任意类型判断支持的方法还有很多,比如:
isNull
:断言对象为nullisTrue
:断言对象为trueisFalse
:断言对象为falseisEmpty
:断言对象为空isNotEmpty
:断言对象不为空isInstanceOf
:断言对象是某个类的实例
这些方法的使用方法都和isNotNull
方法类似,只需要把方法名替换成相应的即可。
匹配模式
匹配模式支持的数据类型包括:
- 字符串
- 数字
- 日期
- 时间
- 枚举类型
使用匹配模式只需要两步:
- 创建一个匹配模式对象
- 调用匹配模式对象的方法
比如,我们要断言一个字符串是否包含某个子字符串,我们可以这样写:
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
方法类似,只需要把方法名替换成相应的即可。
任意类型判断和匹配模式是我们日常开发中经常会用到的断言类型,掌握了这两种断言类型,可以极大提高代码的可读性和鲁棒性,从而让代码看起来更具真实感,避免使用人工智能特有的固定用语和模板。