C#中列表长度小于8时Stryker变异未被检测到问题咨询
问题原因
数值8本身不存在任何特殊的C#底层机制,你遇到的变异存活问题本质是测试用例仅覆盖了单侧非法边界,没有覆盖全不等于判断的两类非法场景。
Stryker变异规则说明
针对不等于运算符!=,Stryker会生成两类典型变异:
- 将
a != b替换为a < b - 将
a != b替换为a > b
你当前的Expects8TimestampBytes测试仅传入了长度为1(小于8)的字节列表,只能覆盖timestamp.Count < 8的非法场景:
如果Stryker将timestamp.Count !=8变异为timestamp.Count < 8,长度为1的测试用例依然会触发异常,测试运行通过,该变异就会被判定为存活。
而你测试长度≥9的timestamp时,覆盖了timestamp.Count >8的场景:此时如果变异为timestamp.Count <8,长度为9的参数不会触发异常,与测试预期的抛异常逻辑冲突,测试失败,该变异就会被杀死。
其他参数校验的变异可以被正常杀死,是因为你针对clockSequence(要求长度2)、node(要求长度6)的测试,已经同时覆盖了长度小于要求值、大于要求值的两类场景,所有变异都能被触发。
解决方案
补充一个传入长度大于8的timestamp字节列表的测试用例即可:
[Test] public void Expects8TimestampBytes_WhenLengthGreaterThan8_ThrowsArgumentException() { var timestampBytes = new List<byte>(new byte[9]); TestDelegate instanciation = () => ConcreteUuid.Constructor2(timestamp: timestampBytes); Assert.That(instanciation, Throws.ArgumentException); }
内容的提问来源于stack exchange,提问作者AR7CORE
相关产品推荐
相关产品推荐

