如何用实用脚本自动测试API接口?

wen 实用脚本 2

如何用实用脚本自动测试API接口?从入门到实战全指南

📖 目录导读

  1. 为什么要用脚本自动测试API?
  2. 核心工具选型:Python vs cURL vs Postman脚本
  3. 手写第一个API测试脚本(Python示例)
  4. 常见异常场景的脚本处理技巧
  5. 集成CI/CD:让脚本自动跑起来
  6. Q&A:你可能会问的5个问题

为什么要用脚本自动测试API?

场景痛点:你刚写完一个用户注册接口,手动在浏览器或Postman里点了几次,感觉没问题,但上线后用户反馈“手机号格式不对时系统报空指针”。——手动测试只能覆盖几十种输入,而脚本可以模拟10万种组合。

如何用实用脚本自动测试API接口?

核心优势

  • 可重复性:脚本可以在每次代码提交后自动运行,发现回归问题
  • 覆盖面广:能测试边界值、异常参数、并发请求
  • 节省时间:一个脚本跑千次测试只需几秒,而手动测试需数小时

真实案例:某电商团队用脚本每天自动测试下单接口3000次,提前发现“双11高并发下库存超卖”问题,避免了数百万元损失。


核心工具选型:Python vs cURL vs Postman脚本

工具 适用场景 学习成本 维护成本
Python+requests 复杂逻辑、对接CI/CD 中等
cURL+Shell 快速验证、服务器测试
Postman Runner+Newman 可视化调试、非技术人员 高(依赖UI)

推荐方案:Python + requests库 + unittest框架
原因:生态完善,支持断言、数据驱动、报告生成,且能轻松接入Jenkins/GitLab CI。


手写第一个API测试脚本(Python示例)

1 环境准备

pip install requests pytest

2 基础脚本:测试一个登录API

import requests
import json
def test_login_success():
    url = "https://api.example.com/v1/login"
    headers = {"Content-Type": "application/json"}
    payload = {
        "username": "test_user",
        "password": "test_pass123"
    }
    response = requests.post(url, headers=headers, json=payload)
    # 断言状态码
    assert response.status_code == 200, f"预期200,实际{response.status_code}"
    # 断言响应体包含期望字段
    data = response.json()
    assert "token" in data, "响应体缺少token字段"
    assert data["code"] == 0, f"业务逻辑错误:{data['message']}"
    print(f"登录测试通过,token前10位:{data['token'][:10]}")

3 进阶:参数化测试(一次测100个场景)

import pytest
import requests
# 测试数据:正常用户、特殊字符密码、超长用户名、空值
test_cases = [
    ("test_user", "valid_pass", 200),
    ("test_user", "弱口令", 400),
    ("A" * 200, "pass123", 400),  # 超长用户名
    ("", "pass123", 400),         # 空用户名
]
@pytest.mark.parametrize("username,password,expected_code", test_cases)
def test_login_various(username, password, expected_code):
    url = "https://api.example.com/v1/login"
    payload = {"username": username, "password": password}
    response = requests.post(url, json=payload)
    assert response.status_code == expected_code, f"预期{expected_code},实际{response.status_code}"

运行命令

pytest test_login.py -v -k "test_login_various"

常见异常场景的脚本处理技巧

1 超时与重试

import requests
from requests.adapters import HTTPAdapter
session = requests.Session()
session.mount('https://', HTTPAdapter(max_retries=3))
try:
    response = session.get("https://api.example.com/slow_endpoint", timeout=5)
except requests.exceptions.Timeout:
    print("接口超时,请检查服务端性能")

2 接口依赖:先获取token再调其他接口

def get_token():
    login_resp = requests.post("https://api.example.com/login", json={"username":"admin","password":"admin123"})
    return login_resp.json()["token"]
def test_get_user_info():
    token = get_token()
    headers = {"Authorization": f"Bearer {token}"}
    response = requests.get("https://api.example.com/user/123", headers=headers)
    assert response.status_code == 200

3 数据清理:测试后恢复原始数据

# 使用fixture确保每个测试后回滚
@pytest.fixture
def created_user():
    # 前置:创建一个测试用户
    create_resp = requests.post("https://api.example.com/user", json={"name":"temp_user"})
    user_id = create_resp.json()["id"]
    yield user_id
    # 后置:删除测试用户
    requests.delete(f"https://api.example.com/user/{user_id}")
def test_update_user(created_user):
    response = requests.put(f"https://api.example.com/user/{created_user}", json={"name":"new_name"})
    assert response.status_code == 200

集成CI/CD:让脚本自动跑起来

1 在GitLab CI中配置(.gitlab-ci.yml示例)

stages:
  - api-test
api-test:
  stage: api-test
  image: python:3.10-slim
  before_script:
    - pip install -r requirements.txt
  script:
    - pytest api_tests/ --junitxml=report.xml  # 生成JUnit报告
  artifacts:
    reports:
      junit: report.xml
    paths:
      - report.xml
  only:
    - main
    - develop

2 结果通知与可视化

  • 失败告警:在CI中配置Slack/钉钉webhook,失败时自动通知
  • HTML报告:使用pytest-html生成带截图、日志的测试报告
    pip install pytest-html
    pytest api_tests/ --html=report.html --self-contained-html

3 性能基准线

在脚本中记录每次的响应时间,并与基线对比:

def test_response_time():
    start = time.time()
    requests.get("https://api.example.com/search?q=hello")
    elapsed = time.time() - start
    assert elapsed < 0.5, f"响应时间{elapsed:.2f}s,超过0.5s阈值"

Q&A:你可能会问的5个问题

Q1:测试环境数据和线上数据混了怎么办?

A:脚本中统一使用环境变量来控制目标URL,推荐方案:开发环境https://dev-api.example.com,测试环境https://test-api.example.com,通过os.environ["API_URL"]动态切换,每次测试前创建临时测试数据,测试后强制删除。

Q2:接口返回500时脚本是否要全停?

A:不要,应该记录失败详情并继续执行其他测试用例,使用pytest的--continue-on-collection-errors或try/except捕获异常,更推荐的做法:使用pytest-rerunfailures插件让失败的用例自动重试一次,排除偶发网络抖动。

Q3:脚本需要维护哪些内容?

A:需要维护三部分:测试数据(推荐用Excel/CSV或YAML文件管理)、接口请求模板(用类封装)、断言规则(随业务变更),建议将API端点、预期响应结构写成配置文件,避免硬编码。

Q4:脚本测试跟Postman的Collection Runner有什么区别?

A:Postman适合单人快速验证和简单场景,但脚本测试优势明显:能实现复杂逻辑(如循环、条件判断)、集成到CI流水线、生成定制化报告、进行性能基准测试,如果团队超过3人,建议从Postman迁移到脚本测试。

Q5:如何测试需要验证码或OAuth2.0的接口?

A:测试环境建议关闭验证码或使用万能码;OAuth2.0可以单独编写获取token的helper函数,更安全的做法:在测试脚本中模拟登录流程获取access_token,而不是直接硬编码token,避免token过期后测试全部失效。


从今天开始行动

  1. 第一步:选一个最简单的API(比如健康检查/health),用Python写一个返回状态码的测试
  2. 第二步:增加一个参数化测试用例,覆盖成功和失败场景
  3. 第三步:集成到GitLab CI,设置每天定时运行

自动测试的价值不在于一次写多完美,而在于持续运行和迭代,每周花30分钟优化脚本,三个月后你会发现团队发布新版本时再也不用提心吊胆了。

现在就去你的项目里挑一个接口,敲出第一行import requests吧!

抱歉,评论功能暂时关闭!