21、正则表达式驱动的自动化测试案例
2000/1/21大约 2 分钟
正则表达式驱动的自动化测试案例
在自动化测试中,正则表达式常被用来生成输入、验证输出以及分析日志。本篇展示多个典型案例,帮助你构建更健壮的测试体系。
API 响应断言
await request(app)
.get('/api/v1/users/42')
.expect(200)
.expect(res => {
expect(res.body.email).toMatch(/^[\w.-]+@[\w.-]+\.[A-Za-z]{2,}$/);
});正则用于校验邮箱格式,同时保留对字段其他属性的断言。
Snapshot 测试中的正则替换
const normalized = output
.replace(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z/g, '<timestamp>')
.replace(/requestId":"[\w-]+"/g, 'requestId":"<id>"');
expect(normalized).toMatchSnapshot();通过正则替换动态字段,确保快照测试稳定可靠。
属性值生成
结合 faker、chance 等库,可以使用正则派生数据生成器:
import RandExp from 'randexp';
const phoneGenerator = new RandExp(/^1(?:3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/);
const fakePhone = phoneGenerator.gen();randexp 根据正则表达式生成符合要求的随机字符串,非常适合覆盖边界情况。
日志与监控验证
import regex as re
pattern = re.compile(r"ERROR\s+(?<code>\d{4})\s+-\s+(?<message>.+)")
def assert_error_logged(logs, expected_code):
matches = [m for m in map(pattern.search, logs) if m]
assert any(m.group('code') == expected_code for m in matches), '缺少对应错误码日志'测试通过日志中的模式判断系统是否正确记录关键事件。
合约测试中的模式
契约测试常用正则定义可接受的响应范围:
expectations:
body:
id: "^user_[0-9a-f]{8}$"
createdAt: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"通过 YAML/JSON 描述正则约束,可与提供者、消费者共享。
构建可维护的测试正则
- 将复杂模式提取为常量或函数,减少复制粘贴。
- 为正则添加注释,如
/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u // YYYY-MM-DD。 - 保持测试数据与生产规则同步,避免漂移。
小结
正则表达式在自动化测试领域拥有广泛适用性,从结果验证到数据生成都能发挥作用。通过合理封装与复用,可以让测试套件更具表达力和可维护性。