我目前正在为MutationTesting编写一个框架。代码几乎完成了,但有一小部分(花了半天时间)我不能弄清楚:
通过反射,我想执行一个方法"TestMethod",这是类"TestClass"内部。"TestClass"所在的项目引用了一个程序集,我们称它为"Proband.dll"。
"TestMethod"在Proband.dll中创建一个某种类型的对象,并在该对象上执行一个方法。
为了澄清一点:TestClass——包含单元测试的类。TestMethod——是一个单元测试。dll -包含要测试的方法/类。
在执行TestMethod之前,我已经成功地反汇编、变异和重新组装了Proband.dll。所以现在我有了一个新的"Proband.dll",它将由TestClass代替!
问题是TestClass已经在执行的中间了。我在想是否有可能创建一个AppDomain,其中新的Proband.dll将被加载,并且在新的AppDomain中,TestMethod将被执行。
我已经创建了这个AppDomain并成功地将新的Proband.dll加载到其中,但是,我不知道如何在这个新的AppDomain中执行TestMethod。我也不知道这是否会"取代"旧的Proband.dll的测试方法。
下面是我的TestClass:[TestClass()]
public class TestClass
{
[TestInitialize()]
public void MyTestInitialize()
{
// code to perform the mutation.
// From here, the "TestMethod" should be called with
// the new "Proband.dll".
}
[TestMethod()]
public void TestMethod()
{
// test code calling into Proband.dll
}
}
有谁知道这是如何实现的吗?或者任何线索或关键词?
谢谢,基督教
这可能有点矫枉过正了,但是看看我的答案:
AppDomain静态字段
你会想要在AppDomain中创建TestClass
,你已经加载了Proband.dll,并使用MarshalByRef
来保持类在AppDomain中(所以你可以稍后卸载它)。
这里是更多关于我所做的(不确切,因为我正在改变它以匹配更多你需要的)。
// Create Domain
_RemoteDomain = AppDomain.CreateDomain(_RemoteDomainName,
AppDomain.CurrentDomain.Evidence,
AppDomain.CurrentDomain.BaseDirectory,
AppDomain.CurrentDomain.BaseDirectory,
true);
// Load an Assembly Loader in the domain (mine was Builder)
// This loads the Builder which is in the current domain into the remote domain
_Builder = (Builder)_RemoteDomain.CreateInstanceAndUnwrap(
Assembly.GetExecutingAssembly().FullName, "<namespace>.Builder");
_Builder.Execute(pathToTestDll)
public class Builder : MarshalByRefObject
{
public void Execute(string pathToTestDll)
{
// I used this so the DLL could be deleted while
// the domain was still using the version that
// exists at this moment.
Assembly newAssembly = Assembly.Load(
System.IO.File.ReadAllBytes(pathToTestDll));
Type testClass = newAssembly.GetType("<namespace>.TestClass",
false, true);
if (testClass != null)
{
// Here is where you use reflection and/or an interface
// to execute your method(s).
}
}
}