1、 蜕变测试的出发点
判断软件是否存在缺陷的基本方法是将软件实际的运行结果和软件预期结果进行比较,所以软件运行的预期结果是构造软件测试用例最重要的因素之一。但在实际测试过程中,测试工程师无法构造或者说很难构造程序的预期结果。
2、蜕变测试的基本理论
蜕变关系:软件实际运行结果约束关系,称为蜕变关系。
蜕变测试(metamorphic testing)利用程序执行结果之间的关系来测试程序,无需构造预期输出。
蜕变测试的结果:蜕变关系的选择和构造是影响测试效果的最重要因素。在实际测试中,可能存在三种情况: (1)程序实现正确,蜕变测试通过。 (2)程序实现不正确,蜕变测试未通过。 (3)程序实现不正确,但是蜕变测试通过。
蜕变测试的评价:有效的蜕变测试,应该使用尽可能少的测试用例发现其中的错误,可以通过变异分析等方法来验证蜕变测试用例的效果
3.典型例子
例1:对于一个任意的角度(除30°、45°等义务教育阶段常见角度),要判断其运用三角函数的预期输出是非常困难的。故而考虑其特殊的关系:
对于程序而言,这些等式就是蜕变关系。蜕变关系可能有多个。上述四个等式均是蜕变关系。
例2:若程序P实现函数f,那么P必须遵守函数f的约束条件,否则程序P是不正确的。 例如,若程序P实现了余弦函数cos(x)的功能,若其输入变元x1,x2满足关系: x1+x2 = 0,那么P的输出值必须满足关系:P(x1) = P(x2)。
4.蜕变测试的例子
一个字符串的子序列,是指从该字符串中去掉任意多个字符后剩下的字符在不改变顺序的情况下组成的新字符串。
一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列LCS((Longest Common Subsequence)。 例如有两个序列分别cnblogs和belong,那么他们的最长公共子序列为blog。在这两个序列中,n、b、b、l、o、g、ng、bl、bo、bg、blo、blg、log、blog等等都是原序列的两个公共子序列,显然blog是所有子序列的中的最长子序列。
假设序列A共有m个字符,序列B共有n个字符, 如果A[m]==B[n],那么A[1:m]和B[1:n]的最长公共子序列长度就是A[1:m-1]和B[1:n-1]的最长公共子序列长度+1; 如果A[m]!=B[n],那么A[1:m]和A[1:n]的最长公共子序列长度就是MAX(A[1:m-1]和B[1:n]的最长公共子序列长度,A[1:m]和B[1:n-1]的最长公共子序列长度)。 用c[i,j] 表示A中长度为i的字符串和B中长度为j的字符串的公共子序列:
两个字符串的最长公共子序列具有如下关系:
若字符串A和B的前面增加1个不相同字符,A’=aA, B’=bB,且a,b均不出现在A或者B中,那么: LCS长度不变。
在字符串A和B的结尾增加1个不相同字符,A’=Aa, B’=Bb,且a,b均不出现在A或者B中: LCS长度不变。
在字符串A和B中的前面增加1个相同的字符LCS长度增加1。
在字符串A和B中的结尾增加1个相同的字符: LCS长度增加1。
若字符串A和B中的第1个字符不相同,A=aA’,B=bB’且a≠b(a和b表示不同的字符),那么: LCS(A,B)=max(LCS(A’,B),LCS(A,B’))。
在程序输入参数中,交换字符串A和B的输入顺序,那么:LCS长度不变。 将序列A和B中的 字符逆序以后作为程序的输入,那么:LCS长度不变。
根据上述关系,可以构造最长公共子序列蜕变测试的用例。例如