1. 概览
在本文中我们将了解如何在 Groovy 中使用 REST-assured。
由于 REST-assured 底层使用 Groovy,我们实际上可以使用原始 Groovy 语法来创建更强大的测试用例。这才是框架真正发挥作用的地方。
有关 REST-assured 所需的设置,可以查看 REST-assured Framework 指北。
2. Groovy 集合 API
接下来通过几个简单的例子来快速了解 Groovy 的一些基本概念。
2.1 findAll 方法
在接下来的这个例子中,我们将重点关注方法、闭包和 it 隐式变量。让我们首先创建一个 Groovy 的单词集合:
def words = ['ant', 'buffalo', 'cat', 'dinosaur'] 复制代码
现在,让我们使用上面的集合获取长度超过四个字母的单词来创建另一个集合:
def wordsWithSizeGreaterThanFour = words.findAll { it.length() > 4 } 复制代码
findAll() 是一个作用在集合上的方法,并将闭包应用于该方法。该方法定义了作用于集合的逻辑,闭包为该方法提供了一个谓词来定制逻辑。
上述代码告诉 Groovy 循环遍历集合,找到所有长度大于 4 的单词,并将结果返回到一个新的集合中。
2.2 it 变量
隐式变量 it 当前循环中的一个单词。新的集合 wordsWithSizeGreaterThanFour 包含了 buffalo 和 dinosaur.
['buffalo', 'dinosaur'] 复制代码
除了 findAll() 方法,还有一些其他的 Groovy 方法。
2.3 collect 迭代器
collect 方法它对集合中的每个元素调用闭包函数,并返回一个新集合,其中包含每个元素调用闭包函数的结果。让我们根据单词集合中每个元素的长度创建一个新集合:
def sizes = words.collect{it.length()} 复制代码
结果如下:
[3,7,3,8] 复制代码
我们使用 sum 函数,即将集合中的所有元素相加。我们可以这样获取元素长度集合的总长度:
def charCount = sizes.sum() 复制代码
单词长度集合中所有项目的总和为 21。
2.4 max/min 操作符
max/min 操作符可以查找集合中的最大或最小数:
def maximum = sizes.max() 复制代码
结果为 8。
2.5 find 迭代器
我们使用 find 只搜索一个匹配的集合值。
def greaterThanSeven=sizes.find{it>7} 复制代码
结果 8 是第一个满足条件的集合项。
3. 使用 Groovy 断言 JSON
假设我们在本地有一个服务 http://localhost:8080/odds 该服务会返回最喜欢的足球比赛的赔率列表,如下所示:
{ "odds": [{ "price": 1.30, "status": 0, "ck": 12.2, "name": "1" }, { "price": 5.25, "status": 1, "ck": 13.1, "name": "X" }, { "price": 2.70, "status": 0, "ck": 12.2, "name": "0" }, { "price": 1.20, "status": 2, "ck": 13.1, "name": "2" }] } 复制代码
如果我们想验证大于 1 的赔率分别为 1.20 和 5.25,那么我们可以这样做:
@Test public void givenUrl_whenVerifiesOddPricesAccuratelyByStatus_thenCorrect() { get("/odds").then().body("odds.findAll { it.status > 0 }.price", hasItems(5.25f, 1.20f)); } 复制代码
上述代码表示使用 Groovy 语法在获取 odds 服务响应的 JSON 数组。因为它有多个项目,所以我们获得了一个 Groovy 集合。然后我们在此集合上调用 findAll 方法。
闭包谓词({}
中的内容)告诉 Groovy 使用 status 大于零的 JSON 对象创建一个新的集合。
以 price 结束,price 告诉 Groovy 在之前的 JSON 对象列表中创建另一个只有赔率的价格列表。然后将 hasItems Hamcrest 匹配器应用于此列表。
4. 使用 Groovy 断言 XML
假设一个本地服务 http://localhost:8080/teachers 返回了一个包含 teachers 和 id、department 以及 subject 属性的 XML 格式的数据:
<teachers> <teacher department="science" id=309> <subject>math</subject> <subject>physics</subject> </teacher> <teacher department="arts" id=310> <subject>political education</subject> <subject>english</subject> </teacher> </teachers> 复制代码
现在,我们可以验证在 department 属性为 science 的 teacher 教授的课程为 math 和 physics:
@Test public void givenUrl_whenVerifiesScienceTeacherFromXml_thenCorrect() { get("/teachers").then().body( "teachers.teacher.find { it.@department == 'science' }.subject", hasItems("math", "physics")); } 复制代码
上述代码中使用了 XML 路径 teachers.teacher 来获取 department 为 science 的 teacher 列表。然后在此列表上调用 find 方法。
我们要查找的闭包谓词确保我们最终只能找到 department 为 science 的 teacher。我们的 XML 路径终止于 subject。
由于有不止一个 subject,我们将得到一个 subject 列表,并使用 hasItems Hamcrest 匹配器进行验证。
5. 总结
在本文中,我们了解了如何将 REST-assured 与 Groovy 语言一起使用。
有关文章中的完整源代码,请查看 GitHub.