C#变异测试-使用il代码更改方法运行时

C#变异测试-使用il代码更改方法运行时,c#,unit-testing,reflection,il,C#,Unit Testing,Reflection,Il,如果你不介意我实际上想做什么,你可以跳到我的方法 我想做的事 嘿,我正在做突变测试, 受到演讲的启发 但是我使用的是c语言,最好的变体库是用java语言制作的,比如 有一些c#框架,比如Ninjaturles和visualmutator, 但由于某种原因,它们都不能在我的电脑中工作(我遇到了一个奇怪的错误)。 而且我认为创造我自己的会很有趣 关于突变测试 对于那些不知道什么是突变测试的人, 这是对大多数人使用的测试的测试 代码覆盖率检查他们的测试是否覆盖所有场景, 但这还不够, 因为仅仅因为

如果你不介意我实际上想做什么,你可以跳到我的方法

我想做的事
嘿,我正在做突变测试,
受到演讲的启发

但是我使用的是c语言,最好的变体库是用java语言制作的,比如

有一些c#框架,比如Ninjaturles和visualmutator, 但由于某种原因,它们都不能在我的电脑中工作(我遇到了一个奇怪的错误)。 而且我认为创造我自己的会很有趣

关于突变测试
对于那些不知道什么是突变测试的人, 这是对大多数人使用的测试的测试 代码覆盖率检查他们的测试是否覆盖所有场景, 但这还不够, 因为仅仅因为它得到了一段代码并不意味着它会测试它。 它会更改一段代码,如果测试仍然通过 这意味着你没有测试这段代码

我的方法
所以我试着从一个简单的代码开始 获取方法的il代码

        var classType = typeof(MethodClass);
        var methodInfo = classType.GetMethod("ExecuteMethod", BindingFlags.NonPublic | BindingFlags.Static);

        byte[] ilCodes = methodInfo.GetMethodBody().GetILAsByteArray();
这是我试图改变的MethodClass:

public class MethodClass
{
    private static int ExecuteMethod()
    {
        var i = 0;
        i += 5;
        if (i >= 5)
        {
            i = 2;
        }
        return i;
    }
}
现在我正在尝试更换ils

        for (int i = 0; i < ilCodes.Length; i++)
        {
            if (ilCodes[i] == OpCodes.Add.Value)
            {
                ilCodes[i] = (byte)OpCodes.Sub.Value;
            }
        }
然后il生成器有一个函数emit,它获取操作符和值,所以我可以使用它。但是我没有在emit中输入的值


有人知道怎么做吗?

像Moles和Fakes这样的工具是通过使用自己的CLR分析器截取编译器发出的Il流来实现的。你需要考虑很多东西,你的主要挑战是以一种有意义的方式改变代码(即确保你编写的il是有效的C#-在没有基于分析的目标的情况下随机改变它不会真正帮助你检测糟糕的测试)。我建议您尝试修复您正在遇到的错误,而不是自己滚动。谢谢!我已尝试修复错误,但我没有任何线索,我已从github下载了代码,在运行它时,我得到了“未知自定义元数据项种类6”,我不知道这是什么意思,我还没有设法在调试模式下运行它。查看VisualMutator的源代码,您所说的异常在下面抛出。cs:,它似乎正在读取程序集的pdb文件。如果不深入研究,我就不能给你太多关于如何解决它的建议。在阅读一些src时,我得到了一点有用的信息,那就是它依赖于微软的CCI——也许值得看看你能用它做些什么:。我找到了这个家伙,他在不同的项目中似乎有相同的错误。据我所知,他降低了cci方案的评级,并为他解决了问题。我可以试一试。好吧,我不认为他说的是完全相同的事情,我已经降级了。像Moles和Fakes这样的工具做这件事的方式是通过使用自己的CLR分析器截取编译器发出的Il流-。你需要考虑很多东西,你的主要挑战是以一种有意义的方式改变代码(即确保你编写的il是有效的C#-在没有基于分析的目标的情况下随机改变它不会真正帮助你检测糟糕的测试)。我建议您尝试修复您正在遇到的错误,而不是自己滚动。谢谢!我已尝试修复错误,但我没有任何线索,我已从github下载了代码,在运行它时,我得到了“未知自定义元数据项种类6”,我不知道这是什么意思,我还没有设法在调试模式下运行它。查看VisualMutator的源代码,您所说的异常在下面抛出。cs:,它似乎正在读取程序集的pdb文件。如果不深入研究,我就不能给你太多关于如何解决它的建议。在阅读一些src时,我得到了一点有用的信息,那就是它依赖于微软的CCI——也许值得看看你能用它做些什么:。我找到了这个家伙,他在不同的项目中似乎有相同的错误。据我所知,他降低了cci方案的评级,并为他解决了问题。我可以试一试。好吧,我不认为他说的完全是同一件事,我已经被降级了。。
        var dynamicFunction = new DynamicMethod("newmethod", typeof(int), null);
        var ilGenerator = dynamicFunction.GetILGenerator();