变异测试,跟单元测试、集成测试等等东西一样,都属于软件测试技术。它的核心思想就是随机修改源码,然后运行测试,如果通过则说明你的测试不完善,或者存在多余代码。最近偶然发现了这玩意,用了下感觉挺不错的,一下子在我的项目里发现了好几个问题。比如这个(本文里的代码都是 TypeScript):stryker 的报错javascriptCopy// 对应的测试代码,测试框架 Jest。it.each(["\ta;\tb","a; b;","a; b\t","a\t; b",
])("should split and trim the value %s",value=>{expect(split(value)).toStrictEqual(["a","b"]);
});这段代码的逻辑是把字符串按;分割,去除前后空白并过滤掉空串。在变异测试中,将正则里的一个\s改成了大写的\S后测试仍然通过,这表明它的代码或测试有问题。仔细一看就会发现,测试中漏掉了分号旁没有空白的情形,如果给测试数据再加一个"a;b"则变异测试不再报错。当然还有一种做法是改为value.split(";"),因为后面已经用trim去空白了。传统的单元测试,对这种错误是无能为力的,它的覆盖率一直是 100%。对此就需要另一种技术,能够对现有的测试进行测试,找出遗漏的用例和多余的代码,这就是变异测试。基本理论#变异测试首次在 19
...
继续阅读
(48)