我可以强制MSTest为每次测试运行使用新进程吗?

时间:2011-11-18 21:56:00

标签: .net visual-studio pinvoke mstest

我们正在使用VS 2010测试运行器(MSTest)进行自动功能测试。当我们从Visual Studio运行测试时,VS会创建一个名为QTAgent32.exe的进程,并在该进程中运行测试。

我们发现,当我们进行多次测试运行时,MSTest将重用相同的QTAgent32进程 - 进程ID不会更改。这对我们来说是一个问题,因为我们正在测试的代码是P /调用非托管DLL。 DLL需要在进程的生命周期内初始化一次。我们有一个[AssemblyInitialize]方法,但每次测试运行一次。如果我们执行多次测试运行,它将在同一进程中执行多次。

每次我们进行测试运行时,MSTest都会创建一个新的appdomain;但这些appdomains都在同一个过程中。

所以我想知道:有没有办法告诉Visual Studio测试运行器每次运行测试时都使用新进程?我查看了“.testsettings”配置,但没有看到任何相关内容。

3 个答案:

答案 0 :(得分:6)

不知道你想用多远,但一个解决方案可能是创建你的单元测试主机

http://technet.microsoft.com/fr-fr/query/bb166558

此链接显示了如何创建适配器,然后您可以启动evertest的新流程,创建管道通信并在测试后将其拆除。

我知道MS本身使用不同的主机在鼹鼠下运行测试

http://research.microsoft.com/en-us/projects/pex/molestutorial.pdf

答案 1 :(得分:1)

在阅读了Wiktor关于FreeLibrary()的评论之后,我能够正常工作。

我使用了Mike Stall创建的this class,它提供了LoadLibrary,GetProcAddress和FreeLibrary的包装器。这样,我可以在每次测试运行中加载一次库,调用必要的方法,然后在测试运行结束时释放库。

Mike Stall的代码使用Marshal.GetDelegateForFunctionPointer,它将非托管函数指针转换为托管代理类型。

我不得不用委托类型的声明替换[DllImport] extern声明。所以我转换了这个:

[DllImport("asesignal.dll")]
public static extern bool ASESDK_Initialize(string licenseCode);

到此:

public delegate bool ASESDK_Initialize(string licenseCode);

Mike Stall的代码包含带有通用委托的示例(Action< T>等)。但是我无法实现这一点,所以我创建了自己的委托类型。

我可以像这样动态加载DLL:

_ht = new UnmanagedLibrary(@"c:\windows\system32\asesignal.dll");

要调用函数,我这样做:

var function = _ht.GetUnmanagedFunction<ASESDK_Initialize>("ASESDK_Initialize");
function(licenseCode);

感谢Wiktor和np-hard的帮助!

答案 2 :(得分:0)

VS 2013和转发现在有一个在Test&gt;下的设置。测试设置&gt;保持测试执行引擎运行。取消选中此选项将在每次运行时启动新引擎。