C#变异测试 - 用il代码

时间:2015-09-23 16:30:57

标签: c# unit-testing reflection il

如果你不介意我真正想做的事情,你可以跳过我的方法。

我想做什么
嘿,我正试图进行突变检测 受到谈话的启发 http://www.infoq.com/presentations/kill-better-test

但是我使用c#,最好的突变体库是用java制作的 http://pitest.org/

有一些c#的框架,比如ninjaturtles和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代码。

我尝试过使用

        var dynamicFunction = new DynamicMethod("newmethod", typeof(int), null);
        var ilGenerator = dynamicFunction.GetILGenerator();

然后il生成器有一个函数emit,它获取运算符和值,所以我可以使用它。但是我不具备放入发射物的价值..

有人知道怎么做吗?

0 个答案:

没有答案