可以抛弃postman啦, API测试工具Bruno实用教程(二):进阶篇

在前两篇介绍中,我们分别对Bruno 这个近来备受关注的接口测试工具的优缺点和基本使用方法进行了介绍,本文我们会继续在上一篇的基础上,介绍 Bruno 和自动化测试相关的进阶用法

Bruno的六层变量作用域

postman 类似,Bruno 中也同样对接口测试中的变量使用提供了多层设计,可以通过不同层级的作用域区分,为接口测试和自动化提供了更多灵活性和应用场景。

Bruno中提供了6类不同的变量,其作用范围次序如下:

全局变量

全局变量是作用范围最大的变量类型。设置全局变量是通过 Bruno 的 global Environments 设置,位置如下:

然后比如增加一个全局变量,配置并启用:

这时我们获取Github API中的用户信息,可以获取userid = 1 的用户

Collection变量

在设置了全局变量后,再设置 collection 集合变量

然后发送请求,此时生效的就是集合变量

环境变量

下一层是可以设置不同的环境,在如下位置配置:

此时生效的是 userid = 3

Folder变量

在collection下一层,可以创建目录,这里设置变量, 生效的就是目录变量

请求变量

再下一层,则是具体的请求当中设置的变量

运行时变量

除了预设变量的情况,Bruno也支持通过脚本,在执行时设置运行时变量,使用如下代码设置

1
bru.setVar("userid", 6)

在执行请求后,查看当前runtime变量,还可以通过工具栏中的对应按钮进入显示界面查看。

通过以上实例,可以看到,Bruno的多层变量体系及其作用范围,同样的变量名,生效优先次序依次为:

运行时变量 -> 请求变量 -> 目录变量 -> 环境变量 -> 集合变量 -> 全局变量

流程环境变量

除了上面这些多层变量设计外,在我们处理接口时,像token、API Key或一些账号密码等比较敏感的数据变量,可能并不希望在接口及相关配置文件( *.bru )中体现。针对这类变量,Bruno 也提供了一个针对性的处理方式,就是通过 .env 文件来存储。.env 文件需放置在collection的根目录下,变量定义采用key-value 形式,如:

1
userid = 7

这时,我们在配置变量时就可以通过{{process.env.userid}} 来实现引用,避免相关敏感数据,直接出现在接口定义文件中

Bruno脚本及执行顺序

Bruno的脚本功能,使用的是标准JavaScript语法。可以在Collection、Folder、Request三个不同层级上定义请求前(Pre)和请求后(Post)要执行的脚本。并且Bruno提供了两种脚本执行顺序模型(主要区别是post脚本的执行顺序)

1. Sandwich Flow (默认)

这种模式下,不同层级脚本的执行顺序如下

  • Collection Pre Script
    • Folder Pre Script
      • Request Pre Script
  • Request Post Script
    • Folder Post Script
      • Collection Post Script

和各类单元测试框架的分层执行顺序类似。

2. Sequential (Natural) Flow

这种执行顺序,和Postman的脚本执行顺序类似,完全按层级顺序来执行。

  • Collection Pre Script
    • Folder Pre Script
      • Request Pre Script
  • Collection Post Script
    • Folder Post Script
      • Request Post Script

要采用这种顺序,需要在Bruno的配置文件 bruno.json 中配置 flow 参数,形如:

1
2
3
4
5
6
7
8
9

{
  "scripts": {
    "filesystemAccess": {
      "allow": true
    },
    "flow": "sequential" // Or "sandwich"
  }
}

执行示例

在各个层级的脚本中分别添加对应的脚本日志,打开Bruno集成的Dev Tool控制台,可看到对应执行顺序的不同。

修改 bruno.json, 配置flow模式为 sequential,可以看到post部分的输出顺序发生了变化。

流程依赖处理

在我们实际的接口测试时,一个经常遇到的场景,就是后续的请求,会需要依赖之前请求的返回数据,比如最常见的动态token获取等场景。

而利用Bruno的变量和脚本,我们可以通过脚本实现这种接口的关联操作。

在Bruno的官方文档中,他内置的bru对象,提供了 setNextRequestrunRequest 这样的方法,使我们可以根据自己的需要,确定在执行某个接口请求时,指定下一条需要执行的请求(不再按默认顺序执行),或者也可以直接在当前请求的脚本中,运行其他接口请求。

通过这种方式,我们就可以通过设置变量,并将变量进行接口间的传递,以此完成流程依赖场景的实现。

比如这里我们获取github用户下的repo清单,这个接口。 这里的 {{username}} 变量,我们希望通过指定 userid 来获取。也就是先执行前面的 getUserInfo 这个接口,根据 userid 来获取 username

这里我们定义getUserRepos,使用变量{{username}}, 但此时该变量未定义,所以显示为红色

然后在 getUserInfo 这个接口中,我们定义脚本,提取当前响应的username,并进行变量赋值。然后直接调用 getUserRepos 接口(注意这里调用的接口路径,应该以collection根路径进行定义)

1
2
3
4
5
6

bru.setVar("username",res.body.login)

const response = await bru.runRequest("variables/getUserRepos")

console.log(response.status)

执行getUserInfo, 可以看到,执行成功,脚本中执行的 getUserRepos 接口也成功得到了 200OK 的响应状态

Runner执行器

除了在脚本中执行指定接口, Bruno其实也提供了一个Runner的执行器,从工具栏打开执行器,也可以批量地依次运行Collection中的所有接口

比如上例,我们如果只是在 getUserInfo 中获取并定义变量 username, 而不执行。 只要getUserReposgetUserInfo 之后执行,也同样可以执行成功。

Runner运行效果如下:

但这里Bruno默认的功能,是运行collection中的所有请求,且调整顺序的功能,虽然有提供,但只包含在付费的高级版中,包括基于csv或json的数据驱动功能,免费版本中也不包含。稍显鸡肋。

Bruno命令行 Bruno CLI

上面 Runner执行器 的功能因为受限,在我们要进行接口自动化时,比较鸡肋,基本无法使用。但Bruno这里的高级版本功能,其实只是针对界面上触发进行了限制。

我们要执行自动化,也可以利用它提供的命令行功能来实现。

这里的CLI程序,需要单独安装

1
npm install -g @usebruno/cli

安装后,能正确显示版本号表示安装成功, 如:

1
2
C:\qiucao>bru --version
2.1.0

通过命令行执行,我们就可以根据自己的需要,比如执行指定目录下的接口。

这里携带的两个参数 --env 指定需要使用的环境, --reporter-html 会在完成执行后生成一个html格式的测试报告。(详细的参数,可参考文档 https://docs.usebruno.com/bru-cli/commandOptions

生成的测试报告:


以上就是关于Bruno中使用脚本和自动化执行相关功能的进阶说明。欢迎继续关注后续文章。

回复大纲 可查看秋草测试技能全栈提升课详细目录。回复 进群可进入测试交流群和小伙伴们分享测试技术、交换资讯。

使用 Hugo 构建
主题 StackJimmy 设计