
异常测试自动化流水线应包含三个阶段:
[接口元数据] → [规则匹配] → [用例生成] → [批量执行] → [断言分析] → [报告]
本集聚焦后三个环节的工程实现。
def generate_test_cases(endpoint: Endpoint, rules: List[Dict]):
base_request = build_valid_request(endpoint) # 先构造合法请求
test_cases = []
for field in endpoint.all_fields:
for rule in match_rules(field, rules):
case = copy.deepcopy(base_request)
bad_value = generate_value(rule['action'], field)
set_nested_value(case, field.path, bad_value)
test_cases.append({
'request': case,
'expected_status': rule['assertion']['status_code'],
'rule_name': rule['name']
})
return test_cases
import pytest
import requests
@pytest.mark.parametrize("case", load_all_test_cases())
def test_abnormal_input(case):
url = f"http://service{case['path']}"
resp = requests.request(
method=case['method'],
url=url,
json=case['request'].get('body'),
headers=case['request'].get('headers', {}),
timeout=10
)
assert resp.status_code == case['expected_status']
# 可选:检查错误信息
if 'response_contains' in case:
assert any(msg in resp.text for msg in case['response_contains'])
pytest -n auto(使用 pytest-xdist);@pytest.mark.flaky(reruns=2)(使用 pytest-rerunfailures);断言维度 | 检查点 | 工具实现 |
|---|---|---|
HTTP 状态 | 应为 4xx,不能是 5xx | assert 400 <= resp.status_code < 500 |
错误信息 | 包含可读业务错误 | assert "invalid" in resp.json().get("message", "") |
日志行为 | 服务端记录 WARN 日志 | (需对接 ELK,高级) |
性能影响 | 响应时间 < 1s | assert resp.elapsed.total_seconds() < 1.0 |
{
"endpoint": "/api/v1/orders",
"total_cases": 24,
"passed": 22,
"failed": 2,
"failures": [
{
"rule": "str_too_long",
"input": {"body": {"name": "x...x(255)"}},
"actual_status": 500,
"expected_status": 400
}
]
}
任务 | 是否完成 |
|---|---|
已实现单因子异常用例生成 | ☐ |
测试用例支持并发执行 | ☐ |
断言包含状态码 + 错误信息 | ☐ |
失败用例自动归类为缺陷 | ☐ |
每日生成异常测试覆盖率报告 | ☐ |
本集完成了从规则到执行再到分析的闭环,确保异常测试:
下一集将整合所有模块,构建可持续演进的异常测试平台。