如何杀死for循环的“Changed conditional boundary”变异体?
杀死该条件边界变异体的方法
该变异的本质是把循环条件i < 100修改为i <= 100,只要构造出能区分原始代码和变异代码行为差异的测试用例,就可以杀死该变异。
测试用例构造方案
- 准备
getAccounts()返回的数组:设置数组长度为101,将下标0到100的所有位置都存入非空的BankAccount实例,确保数组没有空位 - 调用
addAccount()方法,传入新的BankAccount对象 - 断言方法返回值为100,且运行过程中不会抛出数组越界异常
差异原理
原始代码运行逻辑:
循环只会遍历下标0到99的位置,所有位置都非空不会触发break,循环结束后i的值为100,直接执行getAccounts()[100] = acc,覆盖该位置原有值后返回100,不会出现数组越界。
变异后代码运行逻辑:
循环会执行到i=100的位置,判断该位置非空不触发break,i自增到101后才退出循环,后续执行getAccounts()[101] = acc时会直接抛出ArrayIndexOutOfBoundsException,和原始代码行为完全不同,测试用例会直接识别出该变异。
如果你的业务逻辑本身限制最多只能存100个账户,也可以先修改原始代码补全边界校验:在循环结束后增加判断if(i >= 100) throw new IllegalStateException("账户数量已达上限");,再编写测试用例断言数组存满100个账户时抛出IllegalStateException。此时变异后的代码会在循环内部访问下标100时抛出数组越界异常,和预期异常类型不一致,也可以杀死该变异。
内容的提问来源于stack exchange,提问作者Programmer2B
相关产品推荐
相关产品推荐

