【发布时间】:2011-11-18 21:55:59
【问题描述】:
我们正在使用 VS 2010 测试运行程序 (MSTest) 进行自动化功能测试。当我们从 Visual Studio 运行测试时,VS 会创建一个名为 QTAgent32.exe 的进程,并在该进程中运行测试。
我们发现,当我们进行多次测试运行时,MSTest 将重用同一个 QTAgent32 进程——进程 ID 不会改变。这对我们来说是个问题,因为我们正在测试的代码是 P/Invoking 到非托管 DLL。 DLL 在进程的生命周期内只需要初始化一次。我们有一个 [AssemblyInitialize] 方法,但每次测试运行都会执行一次。如果我们执行多次测试运行,它将在同一个进程中执行多次。
每次我们进行测试运行时,MSTest 都会创建一个新的 appdomain;但是这些appdomains都在同一个进程中。
所以我想知道:有没有办法告诉 Visual Studio 测试运行器在我们每次运行测试时使用新进程?我查看了“.testsettings”配置,但没有看到任何相关内容。
【问题讨论】:
-
只是出于我的好奇 - 是否有可能在使用
FreeLibrary进行每次连续测试后卸载非托管 DLL? -
感谢 Wiktor - 好建议。现在,代码只是静态引用非托管 API,在 C# extern 函数声明上使用 [DllImport] 属性。我假设当 appdomain 被拆除时,.NET 不会自动释放库,因为我们遇到了错误。我实际上不知道如何从 C# 代码调用动态加载的 DLL - 你可以调用 LoadLibrary() 和 GetProcAddress(),然后以某种方式将返回的函数指针转换为委托类型吗?无论如何,我会调查它 - 谢谢!我刚刚发现这可能会有所帮助:codeproject.com/KB/cs/dyninvok.aspx
-
我正在测试一些 C++ 代码,我可以确认 MSTest 确实不在测试之间卸载 DLL。它也不调用全局变量析构函数,所以这让我觉得它始终是同一个可执行文件。
标签: .net visual-studio pinvoke mstest