assert 作为 java 中的一个关键字,已经可以起到断言的作用了,如下例子
assert true;
assert false;
testng 自带有断言类 Assert 类,其中有各种静态的断言方法可供使用,下面列出一些常用的
// 断言真假
Assert.assertTrue(true);
// 断言匹配,前一个参数是期望值,后一个参数是实际值
Assert.assertEquals(1, 1);
但是 testng 中没有函数式接口的传参,所以没法使用 lambda 表达式进行多个值的校验,所以测试中如果在一个测试用例中做多个值校验, 我们可以考虑通过设置一个 flag 标志变量来做,或者使用可以校验多个值的 junit 断言机制
目前本人使用的是 junit5 断言,非常灵活,使用了 Assertions 类,这个类在org.junit.jupiter.api
包下,这里也列出一些常用的断言
// 判断真假
Assertions.assertTrue(true);
// 断言匹配
Assertions.assertEquals(1, 1);
// 使用 lambda 表达式断言多个,其中只要有一个错了,该断言就位 false
Assertions.assertAll(
() -> {Assertions.assertTrue(true);},
() -> {Assertions.assertEquals(1, 1);},
() -> {Assertions.assertEquals("a", "a");}
);
值得注意的是 junit 4.4 版本以后引入了 hamcrest 的 assertThat 断言,可以很方便人性化的断言了
Hamcrest 是一个书写匹配器对象时允许直接定义匹配规则的框架.有大量的匹配器是侵入式的,例如 UI 验证或者数据过滤,但是匹配对象在书写灵活的测试是最常用
另外值得一提的是 hamcrest 依赖已经被 springboot web 开发框架和 restassured 接口测试框架所集成
hamcrest 参数中前面是实际值,后面是期望值,后面是 matcher 比较器
// 判断相同
MatcherAssert.assertThat("b", Matchers.is("a"));
// equalto 可以比较对象
MatcherAssert.assertThat("a", Matchers.equalTo("a"));
还有许多各种比较器,比如 hasItem,,hasItems 测试一个集合包含一个元素等等
when().
get("/store").
then().
body("store.book.findAll { it.price < 10 }.title", hasItems("Sayings of the Century", "Moby Dick"));
RESTassured 是一个接口测试框架,可以通过 mvn 依赖引入
在写 RESTassured 接口测试时候通常使用两种方式断言
方式一:直接使用 RESTassured 的 body 方法结合 hamcrest 中的比较器即可,这样不需要将断言写进 test 中也可以起到断言作用
when().
get("/store").
then().
body("store.book.findAll { it.price < 10 }.title", hasItems("Sayings of the Century", "Moby Dick"));
方式二:使用 extract().response()
方法提取出 Response 类,之后在测试类中通过对 Response 进行操作结合一些断言方法即可
// 返回的是 Response
when().
get("/store").
then().log().
body().
extract().response();
// 在测试类中断言,提取 json 中的 user 进行对比断言
Assert.assertEquals("xxx", response.path("user"));
最后不得不提的是 REST assured 中提供非常灵活丰富的断言机制,这里不做细讲,还需要大家自行查看官网探索!