如何用airobots进行接口测试

自动化测试 · 2022-05-22

上篇介绍了如何用airobots进行web自动化测试,这期,给大家介绍如何用airobots进行接口测试。

下载demo项目(可选)

airobots可直接通过命令执行用例文件或用例目录来进行测试:

airobots -t api 用例文件或用例目录路径

但通常,为了更方便管理我们的测试脚本和开发一些自定义方法,我们都会对用例脚本做一些组织,用不同的目录来区分不同的作用,demo是我在项目中的组织方式,大家也可以按自己的习惯进行。demo下载地址:https://github.com/BSTester/AirobotsDemo。项目目录结构说明,大家可以看上一期文章:如何利用airobots做web自动化测试。

运行示例脚本

airobots只是对目前流行的开源框架做了集成和封装,本质上接口测试是基于httprunner进行的,所以,用例格式和编写方式都是按httprunner的方式。我们先来运行下示例脚本:

airobots -t api --clean-alluredir --alluredir=Results --reruns=1 TestCases/APICase/test_suite_demo.yml

以上命令表示:执行接口测试,自动清理结果目录,生成allure格式报告,用例执行失败后重试1次。看到以下运行结果即表示测试完成。

执行以下命令查看测试报告

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

了解以上语法后,我们再来看用例编写格式就容易理解多了。

用例配置文档分为两部分,configteststeps,即用例公共配置部分和具体的测试步骤。

config主要包含:测试名称name,被测接口的域名base_url

teststeps主要包含:测试步骤名称name,接口请求配置request和断言的配置validate

测试步骤中的request配置又主要包含:请求的链接url(如果不带域名会自动拼接base_urlurl),请求的方式:method,请求头配置headers以及请求参数jsondataparams(GET方式)和文件上传upload

了解了以上的参数,就可以编写一条测试用例了,实际工作中,我们更多的会参数化很多变量,configteststeps都包含一个参数化参数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换成了testcasestestcases主要包含:测试用例名称name、测试用例文件路径testcase(需要填写相对于项目根目录的路径)。这样,执行测试集文件就会将配置的测试用例一起执行了。

原则上,我们编写的测试用例之间不应该有依赖关系,测试集的执行默认也不是按用例的引用顺序从上到下执行的,而是随机的,用例之间应该可以独立执行,以不至于一个用例失败后,影响其他的用例执行。

但很多时间,我们希望按一定流程来执行用例。比如必须先登录才可以请求其他接口。对于这个问题,airobots引入了一个新的变量order,可以指定执行顺序。比如给登录接口配置order: firstorder: 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文件内容

执行以下命令进行转换:

har2case -2y SourceFiles/test.har

SourceFiles目录中得到test.yml文件,已经按httprunner的用例格式生成,再根据我们的实际需要,删掉一些不需要的接口配置,参数化一些配置即可。

转换后得到的yaml文件

将Postman文件转换成用例

当然,有时候我们也会在开发阶段介入测试,根据跟开发约定好的接口文档来手动测试,这时候就没法通过抓包来进行了,更多时候我们会使用像Postman这类的接口测试工具来调试接口。我们也可以将调试好的接口快速的转换成接口自动化测试用例。

通过Collections - Export,选择v2.1版本,导出保存,比如保存为SourceFiles/Test.postman_collection.json

Postman导出

执行以下命令转换成用例:

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文件转换成测试用例

ms2case SourceFiles/登录测试演示.json

转换为yaml文件

跟Postman转换一样,会同时生成测试用例文件和测试集文件,根据实际需求修改后即可。

这里需要注意的是,每次转换生成的yaml文件,都是从数字1开始为文件名的,如果需要将多个测试用例或则测试集一起执行,文件名不能重复,在将yaml文件转换成python文件执行时,后面转换的文件会覆盖掉前面先转换的,这里需要留意。

高级技巧

定义用例执行顺序

很多时间,我们希望按一定流程来执行用例。比如必须先登录才可以请求其他接口。httprunner本身并不支持,它的用例设计原则就是希望用例之间不要有依赖关系,相互独立,这样我们可以随时指定用例进行测试,如果需要有先后顺序,可以嵌套引用用例,在用例里的teststeps中引用需要先执行的用例,teststeps是按顺序执行的。但是,这样有些用例就变成其他用例的步骤,步骤不会统计为用例数,这部分用例就会被重复执行。对于这个问题,airobots引入了一个新的变量order,可以指定执行顺序。比如给登录接口配置order: firstorder: 1,这样登录接口的用例会第一个执行,其他用例会随机执行。

定义用例执行顺序

失败重试

有时候,我们希望用例执行失败后,重复尝试几次,这个也很简单,在执行命令中加入参数--reruns=N即可,N代表需要重试的次数。比如:

airobots -t api --clean-alluredir --alluredir=Results --reruns=2 TestCases/APICase/test_suite_demo.yml

这样,当一条用例执行失败后,会立即重新尝试执行最多2次。

性能测试

httprunner自带将接口用例转换成性能测试的功能,执行以下命令即可。

locusts -f TestCases/APICase/TEST_Test_testSuite.yaml 

性能测试

然后在浏览器中打开:http://localhost:8089/

在打开的locust的配置页面,填写总的并发用户数,生成并发的频率,测试的域名即可进行测试,更多说明请参考locust官网https://www.locust.io/

性能测试配置

以上,下期为大家介绍怎么用airobots进行移动端的测试。

软件测试 自动化
Theme Jasmine by Kent Liao