繁体   English   中英

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

[英]Can I force MSTest to use a new process for each test run?

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

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

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

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

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

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

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

我知道MS本身使用不同的主机来运行摩尔测试

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

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

我使用了由Mike Stall创建的这个类 ,它提供了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的帮助!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM