首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊一聊接口测试是如何进行的?

聊一聊接口测试是如何进行的?

原创
作者头像
漫谈测试
发布2025-04-16 11:36:34
发布2025-04-16 11:36:34
40900
代码可运行
举报
文章被收录于专栏:漫谈测试漫谈测试
运行总次数:0
代码可运行

在进行接口测试前,需要对涉及的接口文档进行熟悉,明确接口功能、输入输出参数、协议类型(HTTP/RPC等)、数据格式(JSON/XML)、鉴权方式等。

还有工具(如Swagger、OpenAPI)生成可视化接口文档,便于团队协作。其次就要对测试环境进行搭建,确保依赖服务(如数据库、第三方API)可用,配置Mock工具(如WireMock)模拟未就绪的依赖服务。

不管是进行手动接口测试,还是自动化工具进行接口,或者放在持续集成工具里,都要依据不同类型的项目选择合适的工具。手动测试的工具可以选择Postman、curl,自动化测试工具可以选择JMeter、Python(Requests+pytest)、RestAssured(Java),持续集的工具可以选择Jenkins、GitLab CI集成接口测试流程。

比如需求分析、设计测试用例、执行测试、结果分析等

紧接着就要对涉及的接口设计测试用例,通过正向的用例,异常的用例,边界值用例,性能用例思路来完善测试用例。用例完成后开启对测试用例的评审流程。

执行测试时,要手动和自动化结合,强调自动化的重要性,尤其是回归测试。结果验证不仅要看响应数据,还要检查数据库和日志。

一、需求分析与文档理解

明确接口规范:获取接口文档(如Swagger、OpenAPI),确认请求方法(GET/POST/PUT/DELETE)、URL、请求头、请求参数(Query/Body)、响应格式(JSON/XML)及状态码。

业务逻辑分析:理解接口在业务流程中的角色,例如用户注册接口如何与数据库、其他服务交互。

二、 设计测试用例

正常场景

验证参数合法时接口返回正确结果(如HTTP 200)。

示例:GET /users?id=123 返回用户数据。

异常场景

错误参数:缺失必填参数、类型错误、越界值(如年龄=150)。

边界值测试:字符串长度超限、数值极限(如分页参数page=0)。

安全测试:未授权访问(401)、Token失效、SQL注入尝试。

性能测试:高并发下的响应时间、吞吐量(如JMeter模拟1000用户)。

依赖验证:接口是否正确处理第三方服务故障(如支付网关不可用)。

三、选择测试工具

手动测试工具

Postman:图形化界面,支持预脚本(Pre-request Script)和结果断言。

cURL:命令行工具,适合快速调试。

自动化测试框架

Python:requests库 + pytest

示例 1:基础 GET/POST 请求测试

代码语言:javascript
代码运行次数:0
运行
复制
import pytest
import requests
# 定义基础 URL(可在 conftest.py 中全局配置)
BASE_URL = "https://jsonplaceholder.typicode.com"
# 测试类形式(推荐)
class TestUserAPI:
    # 测试 GET 请求:获取用户列表
    def test_get_users(self):
        url = f"{BASE_URL}/users"
        response = requests.get(url)
        # 断言状态码
        assert response.status_code == 200
        # 断言返回数据长度
        data = response.json()
        assert len(data) > 0
        # 断言数据结构
        assert "name" in data[0]
        assert "email" in data[0]
    # 测试 POST 请求:创建用户
    def test_create_user(self):
        url = f"{BASE_URL}/users"
        headers = {"Content-Type": "application/json"}
        payload = {
            "name": "John Doe",
            "email": "john@example.com",
            "username": "johndoe"
        }
        response = requests.post(url, json=payload, headers=headers)
        assert response.status_code == 201
        # 验证返回数据包含生成的 ID
        assert "id" in response.json()
# 函数形式测试示例
def test_get_single_user():
    user_id = 1
    url = f"{BASE_URL}/users/{user_id}"
    response = requests.get(url)
    assert response.status_code == 200
    assert response.json()["id"] == user_idimport pytestimport requests# 定义基础 URL(可在 conftest.py 中全局配置)BASE_URL = "https://jsonplaceholder.typicode.com"# 测试类形式(推荐)class TestUserAPI:    # 测试 GET 请求:获取用户列表    def test_get_users(self):        url = f"{BASE_URL}/users"        response = requests.get(url)        # 断言状态码        assert response.status_code == 200        # 断言返回数据长度        data = response.json()        assert len(data) > 0        # 断言数据结构        assert "name" in data[0]        assert "email" in data[0]    # 测试 POST 请求:创建用户    def test_create_user(self):        url = f"{BASE_URL}/users"        headers = {"Content-Type": "application/json"}        payload = {            "name": "John Doe",            "email": "john@example.com",            "username": "johndoe"        }        response = requests.post(url, json=payload, headers=headers)        assert response.status_code == 201        # 验证返回数据包含生成的 ID        assert "id" in response.json()# 函数形式测试示例def test_get_single_user():    user_id = 1    url = f"{BASE_URL}/users/{user_id}"    response = requests.get(url)    assert response.status_code == 200    assert response.json()["id"] == user_id

示例 2:参数化测试(多组输入)

代码语言:javascript
代码运行次数:0
运行
复制
import pytest
# 参数化测试:验证不同查询参数
@pytest.mark.parametrize("user_id, expected_name", [
    (1, "Leanne Graham"),
    (2, "Ervin Howell"),
    (3, "Clementine Bauch")
])
def test_user_names(user_id, expected_name):
    url = f"{BASE_URL}/users/{user_id}"
    response = requests.get(url)
    assert response.json()["name"] == expected_nameimport pytest# 参数化测试:验证不同查询参数@pytest.mark.parametrize("user_id, expected_name", [    (1, "Leanne Graham"),    (2, "Ervin Howell"),    (3, "Clementine Bauch")])def test_user_names(user_id, expected_name):    url = f"{BASE_URL}/users/{user_id}"    response = requests.get(url)    assert response.json()["name"] == expected_name

示例 3:异常测试(错误参数/权限)

代码语言:javascript
代码运行次数:0
运行
复制
def test_invalid_user_id():
    # 测试不存在的用户 ID
    url = f"{BASE_URL}/users/9999"
    response = requests.get(url)
    assert response.status_code == 404
def test_unauthorized_access():
    # 测试未授权的接口(需要 Token)
    url = "https://api.example.com/protected"
    response = requests.get(url)
    assert response.status_code == 401
    assert "Unauthorized" in response.json()["message"]def test_invalid_user_id():    # 测试不存在的用户 ID    url = f"{BASE_URL}/users/9999"    response = requests.get(url)    assert response.status_code == 404def test_unauthorized_access():    # 测试未授权的接口(需要 Token)    url = "https://api.example.com/protected"    response = requests.get(url)    assert response.status_code == 401    assert "Unauthorized" in response.json()["message"]

Java:RestAssured

链式断言

代码语言:javascript
代码运行次数:0
运行
复制
then().statusCode(200).body("data.size()", equalTo(10))

性能工具:JMeter(线程组配置)、Gatling(高并发场景)。

Mock工具:WireMock(模拟未完成的后端服务)、Postman Mock Server。

四、搭建测试环境

测试环境:独立于生产的环境,使用测试数据库(如Docker容器化的MySQL)。

Mock服务:当依赖接口未就绪时,模拟返回预设响应(如使用JSON Server模拟GET /users返回静态数据)。

五、执行测试

手动测试:在Postman中逐条运行用例,检查响应体和状态码。

自动化脚本:

代码语言:javascript
代码运行次数:0
运行
复制
# pytest示例
def test_get_user():
    response = requests.get("https://api.example.com/users/1")
    assert response.status_code == 200
    assert response.json()["name"] == "John"# pytest示例def test_get_user():    response = requests.get("https://api.example.com/users/1")    assert response.status_code == 200    assert response.json()["name"] == "John"

性能测试:在JMeter中配置线程组(100并发)、HTTP请求、监听器(查看聚合报告)。

六、验证与结果分析

响应验证:

状态码(如403表示无权限)。

数据结构(JSON Schema验证)。

业务逻辑(如创建订单后数据库订单表新增记录)。

日志与监控:检查服务日志是否有错误堆栈(如Nginx日志中的500错误),结合ELK(Elasticsearch, Logstash, Kibana)分析。

七、缺陷管理与回归测试

Bug提交:使用JIRA、禅道记录问题(附请求/响应截图和日志)。

回归测试:修复后通过自动化脚本重新执行相关用例,确保无回归问题。

八、 持续集成(CI/CD)

集成到流水线:Jenkins/GitLab CI自动触发接口测试。

代码语言:javascript
代码运行次数:0
运行
复制
# GitLab CI示例
test_api:
  image: python:3.8
  script:
    - pip install -r requirements.txt
    - pytest tests/api/# GitLab CI示例test_api:  image: python:3.8  script:    - pip install -r requirements.txt    - pytest tests/api/

质量门禁:设置测试通过率阈值(如95%),未达标则阻断部署。

接口测试的核心是验证数据交互的正确性、健壮性和安全性,需结合手工与自动化手段,贯穿开发全生命周期。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、需求分析与文档理解
  • 二、 设计测试用例
    • 正常场景
    • 异常场景
  • 三、选择测试工具
    • 手动测试工具
    • 自动化测试框架
  • 四、搭建测试环境
  • 五、执行测试
  • 六、验证与结果分析
  • 七、缺陷管理与回归测试
  • 八、 持续集成(CI/CD)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档