如果你不介意我真正想做的事情,你可以跳过我的方法。
我想做什么
嘿,我正试图进行突变检测
受到谈话的启发
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,它获取运算符和值,所以我可以使用它。但是我不具备放入发射物的价值..
有人知道怎么做吗?