1. 概述

本教程将探讨如何在 REST-assured 中结合使用 Groovy 语言。由于 REST-assured 底层依赖 Groovy,我们有机会直接使用 Groovy 语法构建更强大的测试用例——这正是该框架真正的魅力所在。

关于 REST-assured 的基础配置,请参考我们的前一篇文章

2. Groovy 集合 API

快速了解几个核心 Groovy 概念,通过简单示例掌握所需技能。

2.1. findAll 方法

重点关注方法、闭包和隐式变量 it。首先创建一个单词集合:

def words = ['ant', 'buffalo', 'cat', 'dinosaur']

现在筛选长度超过 4 个字母的单词:

def wordsWithSizeGreaterThanFour = words.findAll { it.length() > 4 }

findAll() 是集合方法,接收闭包作为参数 ✅ 方法定义集合操作逻辑 ✅ 闭包提供自定义谓词

Groovy 会遍历集合,将满足长度 > 4 的单词存入新集合。

2.2. it 隐式变量

it 代表循环中的当前元素。新集合 wordsWithSizeGreaterThanFour 将包含:

['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 操作符

直观查找集合中的最大/最小值:

def maximum = sizes.max()

结果显然是 8。

2.5. find 迭代器

find 仅返回首个满足条件的元素:

def greaterThanSeven=sizes.find{it>7}

结果为 8(首个大于 7 的元素)。

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"
    }]
}

验证 status > 1 的赔率 price 为 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));
}

⚠️ 执行流程:

  1. 通过 odds 键获取 JSON 数组(Groovy 集合)
  2. 调用 findAll 筛选 status > 0 的对象
  3. 提取这些对象的 price 值组成新列表
  4. 使用 Hamcrest 的 hasItems 验证列表内容

4. 使用 Groovy 验证 XML

服务 http://localhost:8080/teachers 返回教师数据:

<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>

验证科学系教师教授数学和物理:

@Test
public void givenUrl_whenVerifiesScienceTeacherFromXml_thenCorrect() {
    get("/teachers").then().body(
      "teachers.teacher.find { it.@department == 'science' }.subject",
        hasItems("math", "physics"));
}

⚠️ 执行流程:

  1. 通过 XML 路径 teachers.teacher 获取教师列表
  2. 使用 find 筛选 department="science" 的教师
  3. 提取该教师的 subject 标签值(返回列表)
  4. hasItems 验证列表包含 "math" 和 "physics"

5. 总结

本文展示了如何结合 REST-assured 与 Groovy 语言进行高效测试验证。通过 Groovy 的集合操作和闭包特性,我们可以:

  • ✅ 简化复杂 JSON/XML 的断言逻辑
  • ✅ 用链式调用提升代码可读性
  • ✅ 利用 Groovy 语法糖减少样板代码

掌握这些技巧后,编写 API 测试将变得更加简单粗暴且高效。


原始标题:REST-assured with Groovy | Baeldung