我目前正在开展一个项目,以实现 F# 的突变测试。为了访问 FCS 进程,我使用了 FSharp.Compiler.Service 包。
我在编译过程和编译的 DLL 中遇到了一些问题。
我正在使用 FSharp.Compiler.Service 将项目的 AST 编译为
一个dll。另一个程序引用了这个 dll。在 Visual Studio 中编译时,一切正常。当使用编译器服务从 AST 编译时,我在每次调用时都没有发现异常。
一个可执行的dll。但是我总是得到错误入口点不是最后一个声明。在检查我传递给编译的内容时,入口点 AST 是列表中的最后一个 AST,入口点节点是 AST 中的最后一个节点。在visual studio中编译时没有问题。
有没有人遇到过这些问题?或者知道解决我遇到的错误的方法?
在为我最喜欢的突变测试框架(NinjaTurtles)编写"Off By One"变异测试程序的过程中,我编写了以下代码,以便提供检查我的实现的正确性的机会:
public int SumTo(int max)
{
int sum = 0;
for (var i = 1; i <= max; i++)
{
sum += i;
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
现在这看起来很简单了,并没有让我觉得尝试改变IL中的所有文字整数常量会有问题.毕竟,只有3(the 0,the 1,and ++).
错误!
在第一次运行中它变得非常明显,它在这个特定的实例中永远不会起作用.为什么?因为将代码更改为
public int SumTo(int max)
{
int sum = 0;
for (var i = 0; i <= max; i++)
{
sum += i;
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
只在总和上加0(零),这显然没有效果.不同的故事,如果它是多组,但在这种情况下,它不是.
现在有一个相当简单的算法来计算整数之和
sum = max * (max + 1) / 2;
Run Code Online (Sandbox Code Playgroud)
我可以轻易地使突变失败,因为从任一常数中加1或减1会导致错误.(鉴于此max >= …
根据Pitest的文档,似乎这应该很简单,但它给我带来了一些麻烦.我应该能够拥有
java -cp <your classpath> \
org.pitest.mutationtest.commandline.MutationCoverageReport \
--reportDir c:\\mutationReports \
--targetClasses example.foo.* \
--sourceDirs c:\\myProject\\src \
--targetTests example.foo*
Run Code Online (Sandbox Code Playgroud)
但我不知道我的项目应该是什么,例如"<your classpath>".
我的项目的文件结构如下所示:

最后,我想把它放在一个.bat文件中,然后在TeamCity上为我的CI运行它
任何帮助,将不胜感激!
我在这个问题的上下文是在Python中.
假设检验库(即基于财产的检验):https: //hypothesis.readthedocs.io/en/latest/
python testing mutation-testing property-based-testing hypothesis-test
我必须从 PIT 的执行中排除我的集成测试。excludedTestClasses从版本 1.3.0 开始有一个选项。我试图通过 PIT 的 Maven 插件的以下配置来传递这些测试。
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>1.3.1</version>
<configuration>
<verbose>true</verbose>
<mutationThreshold>80</mutationThreshold>
<targetClasses>
<param>de.comp.proj.*</param>
</targetClasses>
<excludedTestClasses>
<param>**/*IT.java</param>
</excludedTestClasses>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
然而,PIT 仍在执行所有带有后缀的测试IT。我看了一下来源,但在晚上迷路了;-)
那么,我怎样才能跳过我的集成测试呢?
突变测试遇到的一个问题是它很慢,因为默认情况下,您会为生成的每个突变执行完整的测试运行(测试文件或一组测试文件).
使突变测试更快的一种方法是在遇到单个故障时停止针对给定突变体的测试运行(但仅在突变测试期间).甚至更好的是突变测试仪要记住什么是第一个杀死最后一个突变体的测试,并首先将其给予下一个突变体.红宝石中是否有任何东西可以做这些事情,或者是开始修补猴子的最佳选择?
(是的,我知道单元测试应该很快.并且显示所有失败的测试在突变测试之外是有用的,因为它不仅可以帮助您识别出错误,还可以确定哪里出错了)
编辑:我目前正在使用测试/单位的heckle.如果测试/单元无法记住哪些测试在运行之间失败,那么heckle或者运行heckle的东西就能记住它.
任何人都可以提供可用于在源代码(非字节码)级别的Java程序中进行突变的工具的建议吗?我需要为我的源代码添加错误.我更喜欢带有GUI的应用程序,如果存在的话.
我想整合一些突变测试,以确保我的junit测试的质量.我希望将结果放在我项目的声纳仪表板中.
该声纳pitest插件似乎做我想做的,但也有一些问题与Maven 3,它仍然是正在开发中.
有没有人试过这个插件?还有其他选择吗?
假设我们有一个我们想要测试的代码:
class C {
int doSmth() {
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设我们在一个类中放置了2个单元测试.第一个"测试一切",而第二个"无所事事":
@RunWith(JUnit4.class)
public final class CTest {
@Test
@SuppressWarnings("static-method")
public void testDoSmth() {
assertEquals(1, new C().doSmth());
}
@Test
@SuppressWarnings("static-method")
public void testDoSmth2() throws Exception {
Thread.sleep(1000);
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个IRL示例:我已经看到通过用一些无用的代码替换测试内容来"修复"了几十个测试,因为测试的代码合同随着时间的推移而变化.
现在,PIT"入口"单元是一个包含测试方法的类(不是单独的测试方法本身),因此在上述情况下,PIT不仅会显示100%的线覆盖率,还会显示100%的突变覆盖率.
好的,我很高兴知道我有100%的突变覆盖率,但是如何识别无用的测试 - testDoSmth2()在上述情况下(假设我的突变覆盖率很高)?
我试图排除PIT变异I/O方法,如"关闭"和"刷新".这是我的Maven配置:
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>1.1.3</version>
<configuration>
<targetClasses>
<param>my.package.*.*</param>
</targetClasses>
<targetTests>
<param>my.package.*.*</param>
</targetTests>
<excludedClasses>
<param>my.generated.*</param>
<param>**.*IT</param>
</excludedClasses>
<excludedMethods>
<param>close</param>
<param>flush</param>
</excludedMethods>
<reportSets>
<reportSet>
<reports>
<report>report</report>
</reports>
</reportSet>
</reportSets>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
excludedClasses似乎正在工作,但不是excludedMethods.即PIT结果仍然表示删除"关闭"和"刷新"调用对测试结果没有影响.
问题:我错过了什么?