提到软件测试,传统的测试方法就是比较程序预期输出和实际输出是否一致。但在很多情况下,被测程序的预期输出难以确定,难以确定执行结果与期望结果是否相同。蜕变测试(metamorphic testing)能够有效地解决此类问题的一种特殊的黑盒测试方法。
蜕变测试理论
蜕变测试(Metamorphic Testing,MT),依据被测软件的领域知识和软件的实现方法建立蜕变关系,利用蜕变关系来生成新的测试用例,通过验证蜕变关系是否被保持来决定测试是否通过。
蜕变关系(Metamorphic Relation,MR) 是指多次执行目标程序时,输入与输出之间期望遵循的关系。文章源自玩技e族-https://www.playezu.com/194101.html
早在1998,澳大利亚斯威本科大学的Chen等人提出了蜕变测试的概念。2009年,董国伟等人发表的《蜕变测试技术综述》提到,经过近十年的研究,蜕变测试技术已经在测试过程的优化、与其他验证或测试方法的结合等方面取得了巨大的进展,并被广泛地应用于各个领域中[1]。文章源自玩技e族-https://www.playezu.com/194101.html
orale问题,是程序的执行结果不能预知的现象,即预期结果不知道。为了解决oracle问题,澳大利亚斯威本科大学的Chen等人提出了蜕变测试的概念。该方法认为测试过程中没有发现错误的测试用例,即执行成功的测试用例,同样蕴涵着有用的信息,它们可以用来构造新的用例以对程序进行更加深入的检测,蜕变测试技术通过检查这些成功用例及由它们构造的新用例所对应的程序执行结果之间的关系来测试程序,无需构造预期输出。文章源自玩技e族-https://www.playezu.com/194101.html
蜕变测试可用于机器学习模型黑盒测试
机器学习模型的情况也是一样,预先没有预期值。输出是某种预测。鉴于机器学习模型的结果是预测,难以通过比较或验证预测与预先未知的某种预期值来测试。如果机器学习模型的输入和输出之间能建立某种蜕变关系,那么可以运用蜕变测试来进行机器学习模型的黑盒测试。文章源自玩技e族-https://www.playezu.com/194101.html
蜕变测试具有三个显著的特点文章源自玩技e族-https://www.playezu.com/194101.html
- 为了检验程序的执行结果,测试时需要构造蜕变关系;
- 为了从多个方面判定程序功能的正确性,通常需要为待测程序构造多条蜕变关系;
- 为了获得原始测试用例,蜕变测试需要与其他测试用例生成策略结合使用。
一般而言,蜕变测试过程可以划分为以下几个阶段:文章源自玩技e族-https://www.playezu.com/194101.html
- 使用其他测试用例生成策略为待测程序生成 原始测试用例;
- 若这些原始用例均通过测试,则为 待测程序构造一组蜕变关系;
- 基于上述关系计算 衍生测试用例;
- 检查原始和衍生用例的输出是否 满足相应的蜕变关系,得出测试结果。
制定机器学习模型的蜕变测试用例,需要以下几个过程:文章源自玩技e族-https://www.playezu.com/194101.html
- 数据科学家QA需要与产品经理合作,以了解使用机器学习模型解决的业务问题。
- 测试工程师需要与数据科学家合作,以了解模型的细节,例如学习类型、学习算法的高级细节、特性等。
- 基于以上,测试用例需要经过思考,并成为测试计划的一部分。同样的情况需要产品经理和数据科学家确认/审查。
- 然后可以使用一些编程语言或脚本来自动化测试计划。
举例认识蜕变测试
假设一个模型的特征,比如年龄(x),机器学习模型(y)的输出是疾病患者的可能性估计,输入参数是年龄(x)。随着年龄的增长和其他重要特征的出现,患此病的可能性也随之增加。因此,在输入(年龄)和输出(疾病发生的可能性估计)之间建立了一种蜕变关系。
可以按以下方式计划一组测试用例:文章源自玩技e族-https://www.playezu.com/194101.html
- 假设年龄为x1=40,输出(y1)为0.36。
- 下一个测试用例:对于年龄x2=50,y2的值应该大于y1。
- 下一个测试用例:对于年龄x3=45,y3的值应该大于y1小于y2。
- 下一个测试用例:对于年龄x4=30,y4的值应小于y1。
假设,一个模型要输出两点间的最短路径,又有m到n的最短路径和n到m的最短路径是一样的。因此,
可以按以下方式设计一组测试用例:文章源自玩技e族-https://www.playezu.com/194101.html
测试用例P(A, B) = 后续测试用例为P(B, A)
测试用例P(C, D) = 后续测试用例为P(D, C)文章源自玩技e族-https://www.playezu.com/194101.html
比如,在测试sin函数的程序P,t=57.30°是根据诸如分支覆盖之类的测试准则生成的测试用例,且t对应的输出结果为P(t)=0.8415,由于sin(57.30°)的值难以确定,所以P(t)的正确性不易判定。使用蜕变测试的方法检验程序P的正确性。显然,根据sin(x)= sin(180°-x)的性质可以构造出一条蜕变关系,所以设计一组测试用例:
sin(57.3°) = sin(122.7°)
sin(140°)= sin(40°)
总之,其原理就是,待测程序的原始测试用例通过蜕变关系衍生出新的测试用例,然后,执行测试用例,原始测试用例和新测试用例相对应的结果满足蜕变关系,说明程序正确,如果发现它们之间不满足蜕变关系,可见程序中存在错误。
蜕变测试工具
蜕变测试工具需要根据用户提供的原始测试用例和蜕变关系,自动地生成衍生用例,并判定原始和衍生用例所对应的输出是否满足相应的蜕变关系。蜕变测试工具可以帮助测试人员提高测试效率,避免重复的工作。
在2018年5的发表的《基于线性蜕变关系的蜕变测试工具设计及应用研究》一文中提到蜕变测试工具的设计思络是:待测程序的原始测试用例调用蜕变关系求解生成衍生测试用例,然后,执行测试用例并得到与原始测试用例和衍生测试用例相对应的运行结果,最后,验证两个运行结果是否满足某种线性蜕变关系。如下图[6]。
作者:李春辉
链接:https://www.jianshu.com/p/70ad8b3d86e2
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。