2011-11-18 52 views
11

我们使用VS 2010测试运行器(MSTest)进行自动功能测试。当我们从Visual Studio运行测试时,VS创建一个名为QTAgent32.exe的进程,并在该进程中运行测试。我可以强制MSTest为每次测试运行使用一个新进程吗?

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

每次我们做测试运行时,MSTest都会创建一个新的appdomain;但是这些应用程序域都处于相同的过程中。

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

+2

只是为了我的好奇心 - 是否可能在每次使用FreeLibrary进行连续测试后卸载非托管DLL? –

+0

谢谢Wiktor - 很好的建议。目前代码只是静态引用非托管API,在C#extern函数声明中使用[DllImport]属性。我认为.NET在appdomain被拆除时不会自动释放库,因为我们正在收到错误。我实际上不知道如何从C#代码调用动态加载的DLL - 你可以调用LoadLibrary()和GetProcAddress(),然后以某种方式将返回的函数指针转换为委托类型?无论如何,我会研究它 - 谢谢!我只是发现这可能有所帮助:http://www.codeproject.com/KB/cs/dyninvok.aspx –

回答

6

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

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

此链接显示了如何创建适配器,你也可以再发动新处理过程中,创建管道通信并在测试后将其撕下。

我知道MS本身使用不同的主机下的痣

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

+0

谢谢!我会检查一下。我没有意识到你可以创建一个自定义主机。现在我们正在寻找是否有不同的测试运行者(例如Gallio Icarus),每次都可以在新进程中运行测试。在构建服务器上进行交互式开发和测试时,这确实只是一个问题,我们在单个测试过程中只进行一次测试。 –

1

我能读到FreeLibrary则Wiktor的的评论后,得到这个工作()运行测试。

我使用了由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); 

迈克失速的代码包含与泛型委托(动作<牛逼>等)的例子。但我无法得到这个工作,所以我创建了自己的委托类型。

我可以动态加载DLL是这样的:

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

要调用函数,我这样做:

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

感谢Wiktor的和NP-很难对你有所帮助!

0

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

相关问题