我该如何对我的Java程序进行变异测试?

7

有没有工具可以在Java程序的源代码(而不是字节码)级别进行突变?我需要在我的源代码中引入故障。如果有GUI应用程序,我更喜欢使用它。


这在现实世界中几乎没有什么应用。 - Bohemian
简单地将一些随机字符替换为其他字符可能会起作用,但在大多数情况下这是致命的(即,如果您没有命中字符串或注释或者真的很幸运地替换了,那么生成的程序将无法编译)。 - Paŭlo Ebermann
7
“这在现实世界中几乎没有应用”是个不好的借口。当张量、拓扑或微积分数学被发展出来时,它们也很少有“真实世界的用途”。这是一个有趣的问题。代码突变具有非常实际的应用。 - Blessed Geek
1
如果您能提供所需的变异示例和结果属性,例如是否仍应编译,错误是否应定期放置等,那将非常有用。 - Charles Goodwin
3
@Bohemian:它在现实世界中应用于确定测试覆盖率。 - Don Roby
显示剩余2条评论
7个回答

4

我发现了 https://pitest.org,感觉不错。使用 MuJava 时由于 @Override 注释引起了异常,看来它不支持 Java 5/6。


3
这里有一个关于PIT的好概述:http://dev.theladders.com/2013/02/mutation-testing-with-pit-a-step-beyond-normal-code-coverage/。 - Kyri Sarantakos
以上链接已损坏。Baeldung 有一篇最近的文章(2022年)https://www.baeldung.com/java-mutation-testing-with-pitest - 8bitjunkie

4
如果您确实需要源代码突变,则我知道的选项如下:
Jester-提供有限数量的突变运算符,这些运算符非常不稳定。杰夫·奥福特(Jeff Offutt)将其描述为应用分支测试的一种非常昂贵的方法。但是,我相信可能可以定义自己的运算符,因此这可能并不完全公平。
Mu Java-不支持Java 5
Judy-除了它存在之外,我对它不太了解
Lava-听起来非常基础,我认为它不支持java 5
从下面的答案中,我看到您现在正在使用PIT。我认为这是一个真正的好选择(我写过它,所以可能有一定的偏见),但它是一个字节码突变系统。

3

当我在GMU上一门有关测试的软件工程课程中,我们在其中一个章节使用了Mu Java。希望对你有所帮助。


谢谢!我也尝试了,但它对我不起作用。@Override注释引发异常。 - Konstantin Milyutin
自2016年以来,muJava似乎已经成为了弃置软件:https://github.com/jeffoffutt/muJava - 8bitjunkie

3
这是开源测试覆盖工具Jester使用的技术。如果您找不到合适的工具并想自己构建一个工具,查看它的源代码可能会有所帮助。

自2009年以来,Jester似乎已经成为了弃置软件:https://sourceforge.net/projects/jester/files - 8bitjunkie

2

“这在现实世界中几乎没有应用。” 强烈不同意,我在英国一家非常大的媒体公司承包工作,PIT (http://pitest.org/) 对于变异测试非常有用。大多数 CI 构建都设置了 85% 覆盖率的 PIT 变异测试失败。

关于“替换一些随机字符……” 变异并不一定意味着那样。PIT 变异仅限于可编译更改。


如果您需要100%的变异覆盖率,那么如何处理等效变异? - henry

1

这里是一个基准:

MμClipse仅支持JUnit 3,不再维护。 而Jester则需要繁琐的配置,且不再维护。 我能找到的最好的工具是Javalanche。 我写了一篇完整的文章介绍它!


自2013年以来,MuClipse似乎已经成为了弃置软件:https://sourceforge.net/projects/muclipse(MuClipse是MuJava的Eclipse插件包装器,而MuJava本身在2016年成为了弃置软件)。 - 8bitjunkie

1
主要的变异框架(Major's website)为JUnit测试提供了编译器集成的变异器和变异分析器。
Major的变异器集成在Java 7编译器中。它提供了多个变异操作符并支持两个选项来变异源代码:
1. 在编译期间生成并嵌入所有突变体。 2. 生成突变体并导出变异后的源文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接