测试用例自动生成中的假阳性和假阴性

📅 2026/7/2 5:40:49
测试用例自动生成中的假阳性和假阴性
已有的测试用例自动生成技术采用的测试准绳大多属于以下两类第一类基于属性的准绳AFL、Sapienz、Recsim等用的都是这种方案。我们知道所谓属性即被测对象默认应该具备的某些不变特性比如运行过程中不闪退、HTTP响应返回200、内存消耗低于阈值等。这类准绳的优点是简单缺点是过于简单包含的冗余信息太少检出缺陷能力不足。第二类基于冗余实现的准绳EvoSuite、ACH、Austin、Klee等走的就是这条技术路线。设被测对象为其上一个版本为。将视为的冗余实现即在生成用例时用的实际输出作为的预期输出。这种方法的局限性在于生成的用例只能用于回归测试不能用于新增特性的测试。顺带一提回归测试regression testing更准确的中文叫法应该是“退化测试”“退化”比“回归”更能反映这种测试的目标即防止已有特性的退化。正常情况下测试准绳应该来自被测对象期望的冗余分解其中的信息完全继承自期望“准绳成立”是“期望成立”的必要不充分条件如果被测对象的实现符合期望那么一定符合准绳但如果实现符合准绳并不一定就符合期望。反过来说如果实现不符合准绳那么一定不符合期望但如果不符合期望并不一定就不符合准绳。借用信息检索和医药卫生领域的概念我们将实现不符合准绳即用例执行失败的测试结果视为阳性实现符合准绳即用例执行成功的测试结果视为阴性。如果实现不符合准绳但实现符合期望则测试结果为假阳性如果实现符合准绳但实现不符合期望则测试结果为假阴性。如果采用第一类测试准绳那么用例的执行结果一般不会出现假阳性也就是说查准率Precision会是100%但查全率Recall可能很低如果采用第二类测试准绳那么假阳性和假阴性都有可能出现。假阳性的典型例子是已有特性确实受到了版本变更的影响但只是输出形式发生了改变功能和性能并未发生退化。由于回归用例的结果校验部分未进行相应调整导致用例执行失败。实际上假阳性的根源一般都指向测试准绳自身的问题。另一方面已有的测试用例自动生成技术在测试选择上大多遵循语句覆盖、分支覆盖等结构覆盖准则。而随着大语言模型的兴起变异充分准则等基于缺陷的充分准则开始进入用例自动生成领域的视野因为针对变异体的用例生成、等价变异体识别等传统难题有了新的解题思路。代表性的实践如Meta的ACH以及更聚焦于当前版本代码变更的diff-aware workflow利用大语言模型、以杀死变异体为目的生成的用例显然无法避免假阳性或假阴性的问题。但是大语言模型使得自动化冗余分解成为可能于是我们可以更方便地向测试准绳中注入更多的冗余信息减小假阴性的发生概率。当然这样做也会产生负面效应其一是增加用例执行成本其二是拉低查准率。