阻止vstest发现引擎锁定DLL

时间:2013-05-22 16:19:17

标签: visual-studio-2012

我对VS2012项目进行了一些C#单元测试,该项目使用DllImport pinvoke调用VS2010 c ++ DLL。

作为测试项目的预构建事件,我将最新版本的DLL复制到二进制项目进行测试。

如果vstest.discoveryengine正在运行,则会反复失败。似乎'发现引擎'正在加载测试并对DLL保持锁定。

如果我杀了vstest发现引擎,那么我可以构建并运行测试。否则构建失败,VS2012提供运行以前的版本(模型对话框没有'不再显示此消息'选项)

我可以做些什么来强制测试项目在没有实际运行测试时卸载DLL,或者禁用后台发现可执行文件?

我通过创建一个名为Kealakekua的可执行文件来破解了一种解决方法,该文件杀死了vstest.discoveryengine.x86,vstest.executionengine.x86,并将其作为预构建事件的第一部分,它可以复制文件和构建,但我宁愿不为我的档案与视觉工作室作斗争。

2 个答案:

答案 0 :(得分:2)

我最近也有这个问题,问题是由我自己的用户代码引起的。

在测试发现期间,所有测试类都被实例化,并且在我们的一个测试类构造函数中,初始化了非常复杂的业务类。问题是在初始化期间创建了一个后台线程,它执行了以下操作:

socket.Read(...)

这个线程一直在运行,等待一些套接字数据到达,结果锁定了我们的程序集。

因此,我的解决方案是确保在测试发现期间不会调用此代码。

如果您受此问题的影响,可以通过在锁定某些程序集时将Visual Studio附加到测试发现引擎来检查。按下暂停后,您通常会看到当前执行行位于您自己的用户代码中(也请检查“线程”窗口)。

答案 1 :(得分:1)

我遇到了类似的问题,我创建了一个“测试”项目,其中没有任何测试。 (作为一名C ++库开发人员,我想确保某些头文件能够在启用CLR的情况下进行编译,因此我制作了一个假的CLR项目,只使用CLR编译它们。如果编译它,它就会传递。)创建的DLL正在由vstest.discoveryengine无限期地开放。

我通过向项目添加Ignored测试来修复它。我认为vstest.discoveryengine将保持dll,直到它找到dll中的所有测试,但是如果没有找到测试,那么它将永远保留它。

我添加的测试(我认为这是默认测试)注意TEST_IGNORE()以确保它没有被执行:

#include <CppUnitTest.h>

namespace CLRTests
{
   TEST_CLASS(CLRTestsClass)
   {
   public:

      BEGIN_TEST_METHOD_ATTRIBUTE(CLRTest1)
         TEST_OWNER(L"")
         TEST_DESCRIPTION(L"")
         TEST_PRIORITY(1)
         TEST_IGNORE()
         END_TEST_METHOD_ATTRIBUTE()
         TEST_METHOD(CLRTest1)
      {
         // TODO: Your test code here
      }

   };
}

我希望在你的情况下这是可能的。