顾老师一个基于文本生成playwright的工具Jerry诞生了,下载地址:https://github.com/xianggu625/Jerry
来源:www.51testing.com
每个 QA 工程师都曾遇到过这样的测试套件:测试通过了,但测试数据却毫无意义——订单在下单前就已送达、三岁的小孩下单、或者 1 美元的商品却收取 500 美元的运费。传统的验证器只能检查 JSON 的语法是否正确,但无法判断测试数据是否符合业务逻辑。
本文将教你如何使用 Claude AI 和 LangChain 构建一个 Python 语义验证器,自动捕捉这些逻辑不一致的问题。只需 150 行代码,你就能为测试数据验证流程添加一个“常识”层。
什么是基于规则的评估?
基于规则的评估使用预定义标准来判断数据是否满足特定的业务逻辑要求,超越了结构正确性,检查语义有效性。模式验证会问“这是有效的 JSON 吗?”,而基于规则的评估会问“这些数据在我们的业务领域中是否合理?”
例如,在电商订单中,模式验证会检查订单日期是否为有效时间字符串、客户年龄是否为整数。但如果订单日期是“2024-12-01”,客户年龄是 3 岁,它也会通过验证。而基于规则的评估会应用业务逻辑:客户必须年满 13 岁才能下单,配送日期必须晚于订单日期。这些规则可以捕捉模式验证遗漏的语义问题。
环境搭建
使用 LangChain 框架连接 Claude AI,安装以下依赖:
pip install langchain langchain-anthropic pydantic
设置 Anthropic API 密钥:
export ANTHROPIC_API_KEY='your-api-key-here'
核心验证器构建
定义验证结果结构:
class ValidationResult(BaseModel):
valid: bool = Field(description="测试数据是否有效")
violations: List[str] = Field(default_factory=list, description="发现的违规列表")
severity: Dict[str, str] = Field(default_factory=dict, description="每条违规的严重程度")
suggestions: List[str] = Field(default_factory=list, description="修复建议")初始化验证器:
class TestDataValidator:
def __init__(self, model: str = "claude-3-haiku-20240307"):
self.llm = ChatAnthropic(model=model, temperature=0, max_tokens=1000)定义验证规则(以电商订单为例):
def create_validation_rules(self, data_type: str) -> List[str]:
return [
"订单日期必须早于或等于当前日期",
"配送日期必须晚于或等于订单日期",
"客户年龄应真实合理(13-120岁)",
"订单总价必须大于0",
"运费应与订单总价成比例",
"商品数量应与商品数组长度一致",
"订单状态流转应合理"
]执行验证:
def validate_fixture(self, fixture: Dict, data_type: Optional[str] = None) -> ValidationResult:
rules = self.create_validation_rules(data_type)
prompt = ChatPromptTemplate.from_template("""
你是一个 QA 专家,负责验证测试数据的语义正确性。
测试数据:{fixture}
验证规则:{rules}
请识别可能导致测试失败的违规项,并返回 JSON 格式的结果。
""")实际案例:电商测试数据
以下是一个看似合法但充满语义错误的订单数据:
suspicious_order = {
"order_id": "ORD001",
"order_date": "2024-12-01",
"delivery_date": "2024-11-15", # 配送日期早于订单日期
"customer_age": 3, # 三岁小孩下单
"order_total": 0.01,
"items_count": 47, # 商品数量与数组不一致
"items": [{"id": "item1", "price": 0.01}],
"shipping_cost": 500.00 # 运费远高于订单金额
}验证结果:
✅Valid: False
·发现违规(3):
· 配送日期早于订单日期
· 客户年龄不真实
· 运费与订单金额不成比例
修复建议:
· 将配送日期设置为订单日期之后
· 将客户年龄设置为13至120岁之间的合理值
· 调整运费,使其与订单金额成比例
自定义规则
你可以为不同业务领域定义专属规则:
VALIDATION_RULES = {
"financial_transaction": [
"交易金额应符合货币精度规则",
"时间戳应按时间顺序排列",
"账户余额不得违反监管最低限额"
],
"user_subscription": [
"订阅结束日期应晚于开始日期",
"套餐功能应与订阅等级匹配",
"支付历史应与账单周期一致"
]
}性能与成本优化
- 缓存验证结果:避免重复验证相同数据,可节省 70% 以上的 API 调用。
- 批量并行处理:使用 `ThreadPoolExecutor` 并发验证多个测试数据。
- 智能验证时机:在代码提交前、夜间任务或 CI/CD 流程中触发验证,而非每次运行测试都执行。
成本估算:
- 每次验证约 $0.0005
- 验证 1,000 条数据约 $0.5
- 验证 10,000 条数据约 $5
总结
语义验证将测试数据从潜在风险转变为可靠的质量保障基础。通过为验证流程添加 AI 驱动的常识层,你可以捕捉传统验证器完全无法发现的逻辑不一致问题。
这套系统只需 150 行代码即可实现,能立即带来实际价值:订单不再提前送达、客户年龄保持真实、运费合理。最终,你的测试将验证真实场景,而非不可能的边缘情况。
顾翔凡言:AI时代,掌握已知的未知已非难事,关键在于如何发现未知的未知——而它往往就藏在探索已知之未知的过程中。