PiTest变异覆盖问题:无法杀死条件边界变异的解决方案求助
问题原因
你遇到的存活变异是PiTest对valueStr.length() > 2做了边界变更,也就是将>变异为>=。由于当字符串长度等于2时,substring(length - 2)等价于substring(0),返回的还是原字符串,和else分支的返回结果完全一致,所以仅校验返回长度的测试用例无法感知到这个变异,导致变异存活。
调整方案
- 第一步:修改测试断言,从校验长度改为校验实际返回值
原测试仅校验返回长度的逻辑覆盖率不足,比如业务代码如果固定返回长度为2的空串也能通过测试。修改后的测试用例如下:
package com.example.demo; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; public class RunTest { @Test public void run(){ Run r=new Run(); // 长度大于2的正整数 Assertions.assertEquals("23", r.check(123)); // 长度等于2的正整数 Assertions.assertEquals("12", r.check(12)); // 长度等于1的正整数 Assertions.assertEquals("1", r.check(1)); // 长度等于2的负整数 Assertions.assertEquals("-9", r.check(-9)); // 长度大于2的负整数 Assertions.assertEquals("23", r.check(-123)); } }
这个调整可以杀死绝大多数边界变异,比如将>2变异为>3的情况,输入123时会返回"123",和预期"23"不符,直接杀死变异。
- 第二步(可选):消除等价变异
上述调整后仍然存活的>2变>=属于等价变异,因为两种条件下的业务表现完全一致,无法通过测试用例杀死。如果要彻底消除这个存活记录,可以将业务代码的条件判断修改为等价的if (valueStr.length() >= 3),修改后边界变异会变为将>=3改为>3,此时输入长度为3的用例就能感知到差异,直接杀死变异。
内容的提问来源于stack exchange,提问作者Thejas
相关产品推荐
相关产品推荐

