文章

接口自动化测试

接口自动化测试

接口自动化测试是一种通过编写代码来自动化验证接口(通常是API)的功能、性能和安全性的过程。它有助于确保接口按预期工作,并且可以在开发周期的早期发现问题。以下是接口自动化测试的一些关键概念和步骤:

关键概念

  1. 接口(API):应用程序编程接口,允许不同软件系统相互通信。

  2. 测试用例:定义特定的输入、执行步骤和预期输出。

  3. 测试框架:组织和运行测试用例的结构,常用的测试框架包括JUnit、TestNG、PyTest等。

  4. 断言(Assertion):检查实际输出是否与预期输出匹配。

  5. 测试报告:记录测试结果,帮助识别和解决问题。

测试步骤

  1. 准备环境

    • 配置测试环境,确保所有依赖项和服务都可以正常工作。

  2. 选择工具

    • 选择合适的工具来进行接口自动化测试,例如Postman、SoapUI、RestAssured(Java)、Requests(Python)等。

  3. 编写测试用例

    • 定义测试场景,包括请求方法(GET、POST、PUT、DELETE等)、请求URL、请求头、请求体和预期响应。

    • 例如,使用 Java 的 RestAssured 库测试一个简单的GET请求:

       import io.restassured.RestAssured;
       import io.restassured.response.Response;
       import static io.restassured.RestAssured.*;
       import static org.hamcrest.Matchers.*;
       ​
       public class APITest {
           public static void main(String[] args) {
               RestAssured.baseURI = "https://api.example.com";
       ​
               // 发送GET请求并断言响应
               given().
                   header("Content-Type", "application/json").
               when().
                   get("/v1/resource").
               then().
                   assertThat().
                   statusCode(200).
                   body("key", equalTo("expected_value"));
           }
       }
    • 例如,使用Python的Requests库来编写一个简单的测试用例:

       import requests
       import json
       ​
       # 定义请求URL和请求头
       url = 'https://api.example.com/v1/resource'
       headers = {'Content-Type': 'application/json'}
       ​
       # 发送GET请求
       response = requests.get(url, headers=headers)
       ​
       # 断言响应状态码和响应内容
       assert response.status_code == 200
       assert json.loads(response.text)['key'] == 'expected_value'
  4. 执行测试

    • 使用测试框架运行测试用例,记录测试结果。

  5. 生成报告

    • 生成测试报告,帮助开发人员和测试人员了解测试结果。

  6. 持续集成

    • 将接口自动化测试集成到CI/CD管道中,例如使用Jenkins、GitLab CI等,确保每次代码变更后自动运行测试。

常用工具

  • Postman:支持创建和运行 API 测试,生成测试报告。

  • SoapUI:用于测试 SOAP 和 RESTful Web 服务。

  • RestAssured:一个 Java 库,用于简化REST API 的测试。

  • Requests:一个 Python 库,简化 HTTP 请求。

  • HttpRunner:一个开源的 API/UI 测试工具。

接下来介绍几种比较常用的 API 自动化测试的工具。

Postman

https://www.postman.com/downloads/

使用 Chai Assertion Library 增强测试能力

Postman 内置了 Chai Assertion Library 是一个功能强大的 JavaScript 断言库,可以帮助你编写更复杂、更具可读性的测试脚本。

以下是一些 Chai 断言方法的示例:

  • pm.expect(actual).to.be.equal(expected);:断言实际值等于预期值。

  • pm.expect(actual).to.be.above(expected);:断言实际值大于预期值。

  • pm.expect(actual).to.be.below(expected);:断言实际值小于预期值。

  • pm.expect(actual).to.include(expected);:断言实际值包含预期值。

  • pm.expect(actual).to.have.lengthOf(expected);:断言实际值具有指定的长度。

测试用例组织技巧

  • 将测试用例组织成不同的集合(Collection),以便于管理和运行。

  • 使用 Postman 的文件夹功能来组织测试用例。

  • 为每个测试用例编写清晰的描述,以便于理解其目的。

优化建议

  • 使用 Postman 的 Pre-request Scripts 来设置请求头和参数,而不是在每次请求中都重复设置。

  • 使用 Postman 的 Tests tab 来验证响应,而不是使用 console.log() 或其他方法。

  • 使用 Newman 来运行 Postman 测试,而不是使用 Postman GUI,可以提高性能。

  • 将 Postman 测试导出为 JSON 或 Collection 文件,便于 CLI 命令执行。

Newman 安装和执行

 ## 官网(https://nodejs.org/zh-cn)下载安装 NodeJS 或者Brew 安装安装
 brew install node@20
 node -v # should print `v20.15.0`
 npm -v # should print `10.7.0`
 ​
 ## 安装 Newman(报错的话,加上 sudo )
 npm install -g newman
 ​
 ## 执行测试文件
 newman run /path/to/your_postman_collection.json

GUI 运行测试

image-20240623183645722

如果你不熟悉 JavaScript 语言,可以参考右侧的一些Snippets,可以帮助你快速生成断言代码,如果语法报错,还可以通过 AI 自动帮你修复,如下图:

image-20240623183948713

通过 Postbot 来快速生成测试代码,以下是通过命令 Test for response 生成:

image-20240623184957592

整体使用下来,可以通过 Postman + JavaScript + Newman 的方式,导出项目 Collection 的脚本,newman cli 进行执行,也是可以集成到 CI 工具的。但是缺点还是比较明显的:

  1. 通过 GUI 进行接口维护,对于复杂项目不利于维护,没有 IDEA 来得方便,JavaScript 脚本都藏在每个 API Rquest 中

  2. 和 CI 集成不方便,每次在 GUI 界面维护后,重新导出 Collection 的 JSON 文件,还得上传到 CI 服务器能访问的目录中

对于个人项目或者 POC 项目还是可以快速地验证接口的可行性,非常的方便。

RestAssured

https://github.com/rest-assured/rest-assured

RestAssured 结合 SpringBoot,添加如下依赖:

 testImplementation("org.springframework.boot:spring-boot-starter-test")
 testImplementation("io.rest-assured:spring-mock-mvc:5.4.0")

RestAssured 测试代码:

image-20240623164922382

RestAssured 结合 SpringBoot 框架使用起来非常的简单,如果对于 Java 比较熟悉的话,建议两种方式进行维护:

  1. 由 Dev 人员进行维护,内置到后端微服务项目中,容器化启动数据库中间件,既能做到接口的自动化测试,又能结合 Jacoco 满足项目的测试覆盖率

  2. 由 QA 人员进行维护,单独新建一个Git Repository 进行维护,单独的 DB 数据库

在实际项目中还需要结合 dbunit + Yaml 来初始化数据到数据库,结合 Jacoco 生成测试报告。根据以上两种方式的选择,判断是否要新建一条新的 CI 流水线。

Http Runner

HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型。简单易用,功能强大,具有丰富的插件化机制和高度的可扩展能力。

flow chart

相比于其它 API 测试工具,HttpRunner 最大的不同在于设计理念。

  • 约定大于配置:测试用例是标准结构化的,格式统一,方便协作和维护

  • 标准开放:基于开放的标准,支持与 HAR/Postman/Swagger/Curl/JMeter 等工具对接,轻松实现用例生成和转换

  • 一次投入多维复用:一套脚本可同时支持接口自动化测试、性能测试、数字体验监测等多种 API 测试需求

  • 融入最佳工程实践:不仅仅是一款测试工具,在功能中融入最佳工程实践,实现面向网络协议的一站式测试解决方案

核心特性

  • 网络协议:完整支持 HTTP(S)/1.1 和 HTTP/2,可扩展支持 WebSocket/TCP/RPC 等更多协议

  • 多格式可选:测试用例支持 YAML/JSON/go test/pytest 格式,并且支持格式互相转换

  • 双执行引擎:同时支持 golang/python 两个执行引擎,兼具 go 的高性能和 pytest 的丰富生态

  • 录制 & 生成:可使用 HAR/Postman/Swagger/curl 等生成测试用例;基于链式调用的方法提示也可快速编写测试用例

  • 复杂场景:基于 variables/extract/validate/hooks 机制可以方便地创建任意复杂的测试场景

  • 插件化机制:内置丰富的函数库,同时可以基于主流编程语言(go/python/java)编写自定义函数轻松实现更多能力

  • 性能测试:无需额外工作即可实现压力测试;单机可轻松支撑 1w+ VUM,结合分布式负载能力可实现海量发压

  • 网络性能采集:在场景化接口测试的基础上,可额外采集网络链路性能指标(DNS 解析、TCP 连接、SSL 握手、网络传输等)

  • 一键部署:采用二进制命令行工具分发,无需环境依赖,一条命令即可在 macOS/Linux/Windows 快速完成安装部署

安装

 ## 安装最新版本
 bash -c "$(curl -ksSL https://httprunner.com/script/install.sh)"
 ​
 ## github下载对应版本
 https://github.com/httprunner/httprunner/releases?page=2
 $ tar -xzf hrp-xxx.tar.gz
 $ chmod +x hrp
 $ mv hrp /usr/local/bin/

初始化项目

 hrp startproject eric-http-runner-demo
 hrp -h
 ​
 ██╗  ██╗████████╗████████╗██████╗ ██████╗ ██╗   ██╗███╗   ██╗███╗   ██╗███████╗██████╗
 ██║  ██║╚══██╔══╝╚══██╔══╝██╔══██╗██╔══██╗██║   ██║████╗  ██║████╗  ██║██╔════╝██╔══██╗
 ███████║   ██║      ██║   ██████╔╝██████╔╝██║   ██║██╔██╗ ██║██╔██╗ ██║█████╗  ██████╔╝
 ██╔══██║   ██║      ██║   ██╔═══╝ ██╔══██╗██║   ██║██║╚██╗██║██║╚██╗██║██╔══╝  ██╔══██╗
 ██║  ██║   ██║      ██║   ██║     ██║  ██║╚██████╔╝██║ ╚████║██║ ╚████║███████╗██║  ██║
 ╚═╝  ╚═╝   ╚═╝      ╚═╝   ╚═╝     ╚═╝  ╚═╝ ╚═════╝ ╚═╝  ╚═══╝╚═╝  ╚═══╝╚══════╝╚═╝  ╚═╝
 ​
 HttpRunner is an open source API testing tool that supports HTTP(S)/HTTP2/WebSocket/RPC
 network protocols, covering API testing, performance testing and digital experience
 monitoring (DEM) test types. Enjoy! ✨ 🚀 ✨
 ​
 License: Apache-2.0
 Website: https://httprunner.com
 Github: https://github.com/httprunner/httprunner
 Copyright 2017 debugtalk
 ​
 Usage:
   hrp [command]
 ​
 Available Commands:
   adb          simple utils for android device management
   boom         run load test with boomer
   build        build plugin for testing
   completion   Generate the autocompletion script for the specified shell
   convert      convert multiple source format to HttpRunner JSON/YAML/gotest/pytest cases
   help         Help about any command
   ios          simple utils for ios device management
   pytest       run API test with pytest
   run          run API test with go engine
   startproject create a scaffold project
   wiki         visit https://httprunner.com
 ​
 Flags:
   -h, --help               help for hrp
       --log-json           set log to json format (default colorized console)
   -l, --log-level string   set log level (default "INFO")
       --venv string        specify python3 venv path
   -v, --version            version for hrp
 ​
 Use "hrp [command] --help" for more information about a command.

测试用例快速转换

hrp convert 转换流程图

官方说当前的支持度仅为 1/3,很可惜没有支持 Swagger如下:

from \ to

JSON

YAML

GoTest

PyTest

HAR

Postman

JMeter

Swagger

curl

Apache ab

JSON

YAML

GoTest

PyTest

新建测试用例

Edge 浏览器导出 HAR 文件(同理 Chrome 浏览器):

image-20240623191428126

 # 4.1.0 版本
 ## HAR 格式转换
 $ hrp convert locale.har --to-yaml --output-dir testcases
 ​
 ## Postman 用例转换
 ### 创建输出目录
 $ mkdir -p testcases/from/postman
 ​
 ### 建议先使用 4.1.0 版本,postman 导出 2.1 版本 json
 ### 将输入的 eric_postman_collection.json 转换为 YAML 测试用例 postman_collection_test.yaml,并导出到 testcases/from/postman 目录下
 $ hrp convert eric_postman_collection.json --to-yaml --output-dir testcases/from/postman
 ​
 # 4.3.6 版本
 ## HAR 格式转换
 $ hrp convert --from-har locale.har --to-yaml --output-dir testcases

image-20240623200002999

执行用例

 $ hrp run testcases/locale_test.yaml --gen-html-report

image-20240623200410816

如果要从接口测试切换到性能测试,可以使用(缺点是还不支持测试报告,只能在终端显示):

 $ hrp boom testcases/locale_test.yaml --spawn-count 100 --spawn-rate 10 --loop-count 1000

image-20240623200946607

更多其他功能和语法还在学习和试用中。

总结

接口自动化测试是确保API可靠性和功能性的关键步骤,通过使用合适的工具和框架,可以高效地编写和执行测试用例,从而提升软件质量。

结合项目的实际情况来选择,个人比较建议:

  1. Dev 人员使用类似于基于代码的框架进行 API 自动化测试,如:RestAssured

  2. QA 人员使用类似于基于配置/代码的框架进行 API 自动化测试,如:HttpRunner、go4api 等工具

License:  CC BY 4.0