上篇介绍了如何用airobots进行web自动化测试,这期,给大家介绍如何用airobots进行接口测试。
下载demo项目(可选)
airobots可直接通过命令执行用例文件或用例目录来进行测试:
代码语言:javascript复制airobots -t api 用例文件或用例目录路径
但通常,为了更方便管理我们的测试脚本和开发一些自定义方法,我们都会对用例脚本做一些组织,用不同的目录来区分不同的作用,demo是我在项目中的组织方式,大家也可以按自己的习惯进行。demo下载地址:https://github.com/BSTester/AirobotsDemo
。项目目录结构说明,大家可以看上一期文章:如何利用airobots做web自动化测试。
运行示例脚本
airobots只是对目前流行的开源框架做了集成和封装,本质上接口测试是基于httprunner进行的,所以,用例格式和编写方式都是按httprunner的方式。我们先来运行下示例脚本:
代码语言:javascript复制airobots -t api --clean-alluredir --alluredir=Results --reruns=1 TestCases/APICase/test_suite_demo.yml
以上命令表示:执行接口测试,自动清理结果目录,生成allure格式报告,用例执行失败后重试1次。看到以下运行结果即表示测试完成。
执行以下命令查看测试报告
代码语言:javascript复制allure serve Results
测试报告
如何编写测试用例
httprunner支持三种格式的用例,python,json和yaml。airobots集成的是httprunner最新的V3版本,V3的特点是支持链式调用方式编写python脚本,但我还是喜欢yaml格式的方式编写用例,方便直观。
❝httprunner V3版帮助文档:https://docs.httprunner.org/ httprunner V2版帮助文档:https://v2.httprunner.org/ ❞
这里主要给大家介绍一下yaml格式用例文档的编写方式,以演示用例的登录接口为例。
用例文件:TestCases/APICase/api_demo/login.yml
config:
name: 登录演示测试
verify: false
base_url: $base_url
teststeps:
- name: /v1/login
request:
headers:
content-type: application/json;charset=UTF-8
json:
password: test1234
username: '13279297419'
method: POST
url: /v1/login
validate:
- eq:
- status_code
- 200
- eq:
- body.status
- 0
extract:
token: body.data.token
对于初次接触yaml文件的同学,可以先通过https://www.runoob.com/w3cnote/yaml-intro.html
了解yaml文件的基本语法。对于我们日常编写测试用例,记住以下几个点就足够用了。
- 三种数据类型
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量:单个的、不可再分的值
- 支持多层级,变量名称以
变量名:
开头,冒号后面有空格。 - 直接接在变量名后面的为纯量类型的值,比如:
name: test
代表name="test"
,name=123
代表name=123
。 - 以
-
开头的行表示构成一个数组, 注意需要换行,比如: name: - test - 123 - - key - value 表示name=["test", 123, ["key", "value"]]
- 对象键值对使用冒号结构表示
key: value
,冒号后面要加一个空格。比如: name: key: value key1: - test - 123 表示{"name":{"key":"value", "key1":["test", 123]}}
了解以上语法后,我们再来看用例编写格式就容易理解多了。
用例配置文档分为两部分,config
和teststeps
,即用例公共配置部分和具体的测试步骤。
config
主要包含:测试名称name
,被测接口的域名base_url
teststeps
主要包含:测试步骤名称name
,接口请求配置request
和断言的配置validate
测试步骤中的request
配置又主要包含:请求的链接url
(如果不带域名会自动拼接base_url
和url
),请求的方式:method
,请求头配置headers
以及请求参数json
、data
、params
(GET方式)和文件上传upload
。
了解了以上的参数,就可以编写一条测试用例了,实际工作中,我们更多的会参数化很多变量,config
和teststeps
都包含一个参数化参数variables
。更多的用法可以参考官方文档,这就不在赘述。
编写好用例后,我们可以单独执行这条用例,也可以将多条用例组合成一个测试集进行测试。
测试集文件:TestCases/APICase/test_suite_demo.yml
config:
name: 登录演示测试
variables:
base_url: https://td.dia03.com
testcases:
- name: 登录
order: first
testcase: TestCases/APICase/api_demo/login.yml
export: ['token']
- name: 获取菜单
order: second_to_last
testcase: TestCases/APICase/api_demo/menu.yml
- name: 获取个人信息
testcase: TestCases/APICase/api_demo/info.yml
跟测试用例的配置,不同在于将teststeps
换成了testcases
,testcases
主要包含:测试用例名称name
、测试用例文件路径testcase
(需要填写相对于项目根目录的路径)。这样,执行测试集文件就会将配置的测试用例一起执行了。
原则上,我们编写的测试用例之间不应该有依赖关系,测试集的执行默认也不是按用例的引用顺序从上到下执行的,而是随机的,用例之间应该可以独立执行,以不至于一个用例失败后,影响其他的用例执行。
但很多时间,我们希望按一定流程来执行用例。比如必须先登录才可以请求其他接口。对于这个问题,airobots引入了一个新的变量order
,可以指定执行顺序。比如给登录接口配置order: first
或order: 1
,这样登录接口的用例会第一个执行,其他用例会随机执行。
大家注意到了,登录接口用例中还有一个参数export
,这个是导出变量的参数,将变量导出给后续的用例引用。这里导出了token
这个变量,与之对应的是测试步骤中的extract
变量,用来给token
赋值。
extract:
token: body.data.token # {"data":{"token": "xxxxxxxxx"}}
以上配置表示,将接口响应body中的token赋值给token
变量。
如何录制脚本
以上,我们简单介绍了用例的编写格式,实际工作中,我们不可能每个用例都这样手工来配置,那效率就太低了。更多时候,我们都是通过工具来帮助我们快速生成用例,下面介绍几种常用的快速生成用例的方法。
将Har文件转换成用例
HAR,即HTTP存档格式(HTTP Archive format),是一种JSON格式的存档文件格式,用于记录网页浏览器与网站的交互过程。
一般,har文件可以通过抓包工具导出,也可以通过chrome浏览器保存得到。
通过Fiddler抓包工具抓取到接口后,选择需要导出的接口,通过如下路径导出har文件。
Fiddler抓包导出
F12,打开Chrome浏览器,切换到Network页,选择xhr后,操作页面,得到页面的请求接口后,在下方接口列表中右键,通过以下图示路径保存har文件。
Chrome开发者模式导出
比如,我们保存到了项目目录的SourceFiles/test.har
中。
har文件内容
执行以下命令进行转换:
代码语言:javascript复制har2case -2y SourceFiles/test.har
在SourceFiles
目录中得到test.yml
文件,已经按httprunner的用例格式生成,再根据我们的实际需要,删掉一些不需要的接口配置,参数化一些配置即可。
转换后得到的yaml文件
将Postman文件转换成用例
当然,有时候我们也会在开发阶段介入测试,根据跟开发约定好的接口文档来手动测试,这时候就没法通过抓包来进行了,更多时候我们会使用像Postman这类的接口测试工具来调试接口。我们也可以将调试好的接口快速的转换成接口自动化测试用例。
通过Collections - Export
,选择v2.1版本,导出保存,比如保存为SourceFiles/Test.postman_collection.json
。
Postman导出
执行以下命令转换成用例:
代码语言:javascript复制pm2case SourceFiles/Test.postman_collection.json
在生成测试用例文件的同时,会自动化生成测试集文件。
Postman转换成yml文件
测试用例文件
测试集文件
得到生成好的测试用例文件后,再根据实际需求编辑即可。
通过插件录制接口
除了以上两种方式外,我比较喜欢也是推荐的一种方式。通过chrome插件MeterSphere JMX Recorder进行录制。MeterSphere是一款优秀的开源测试全周期管理平台,支持接口测试和性能测试。感兴趣的同学可以了解一下。插件下载地址:https://github.com/metersphere/chrome-extensions/releases
安装好插件后,就可以通过插件进行录制了。
修改测试名称和录制内容,启动测试
MeterSphere JMX Recorder插件
修改测试用例名称,进行页面功能操作,此时会看到右边括号中的数字在变化,表示已经录制到了请求。
录制接口
停止录制后,选择编辑
停止录制
在编辑器中,删除不需要的接口。
编辑接口
将编辑好的接口列表导出为json格式文件。
导出为json文件
例如,保存为SourceFiles/登录测试演示.json
文件。
导出的json文件
执行以下命令将json文件转换成测试用例
代码语言:javascript复制ms2case SourceFiles/登录测试演示.json
转换为yaml文件
跟Postman转换一样,会同时生成测试用例文件和测试集文件,根据实际需求修改后即可。
❝这里需要注意的是,每次转换生成的yaml文件,都是从数字1开始为文件名的,如果需要将多个测试用例或则测试集一起执行,文件名不能重复,在将yaml文件转换成python文件执行时,后面转换的文件会覆盖掉前面先转换的,这里需要留意。 ❞
高级技巧
定义用例执行顺序
很多时间,我们希望按一定流程来执行用例。比如必须先登录才可以请求其他接口。httprunner本身并不支持,它的用例设计原则就是希望用例之间不要有依赖关系,相互独立,这样我们可以随时指定用例进行测试,如果需要有先后顺序,可以嵌套引用用例,在用例里的teststeps
中引用需要先执行的用例,teststeps
是按顺序执行的。但是,这样有些用例就变成其他用例的步骤,步骤不会统计为用例数,这部分用例就会被重复执行。对于这个问题,airobots引入了一个新的变量order
,可以指定执行顺序。比如给登录接口配置order: first
或order: 1
,这样登录接口的用例会第一个执行,其他用例会随机执行。
定义用例执行顺序
失败重试
有时候,我们希望用例执行失败后,重复尝试几次,这个也很简单,在执行命令中加入参数--reruns=N
即可,N代表需要重试的次数。比如:
airobots -t api --clean-alluredir --alluredir=Results --reruns=2 TestCases/APICase/test_suite_demo.yml
这样,当一条用例执行失败后,会立即重新尝试执行最多2次。
性能测试
httprunner自带将接口用例转换成性能测试的功能,执行以下命令即可。
代码语言:javascript复制locusts -f TestCases/APICase/TEST_Test_testSuite.yaml
性能测试
然后在浏览器中打开:http://localhost:8089/
在打开的locust的配置页面,填写总的并发用户数,生成并发的频率,测试的域名即可进行测试,更多说明请参考locust官网https://www.locust.io/
。
性能测试配置