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



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

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

每次我们做一个测试运行,MSTest创建一个新的应用域;但是这些应用域都在同一个过程中。

所以我想知道:有没有一种方法可以告诉Visual Studio测试运行器在每次运行测试时使用一个新的进程?我看了看"。

我不知道您想要做到什么程度,但是一个解决方案可能是创建您的单元测试主机

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

这个链接显示了如何创建适配器,然后您可以为每个测试启动一个新进程,创建一个管道通信,并在测试后将其拆除。

我知道MS本身使用不同的主机在摩尔

下运行测试http://research.microsoft.com/en-us/projects/pex/molestutorial.pdf

在阅读了Wiktor关于FreeLibrary()的评论后,我能够得到这个工作。

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

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

我必须用委托类型的声明替换[DllImport]外部声明。我把这个转换成

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

:

public delegate bool ASESDK_Initialize(string licenseCode);

Mike Stall的代码包含泛型委托的示例(Action等等)。但是我不能让它工作,所以我创建了我自己的委托类型。

我可以这样动态加载DLL:

_ht = new UnmanagedLibrary(@"c:windowssystem32asesignal.dll");

调用函数,我这样做:

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

感谢Wiktor和np-hard的帮助!

VS 2013及更新版本现在在测试>测试设置>保持测试执行引擎运行下对此进行了设置。取消选中此选项将在每次运行时启动一个新引擎。

最新更新