首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻止vstest发现引擎锁定DLL

阻止vstest发现引擎锁定DLL
EN

Stack Overflow用户
提问于 2013-05-23 00:19:17
回答 2查看 5.3K关注 0票数 21

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

作为测试项目的预生成事件,我将最新版本的DLL复制到用于测试的二进制项目中。

如果vstest.discoveryengine正在运行,此操作将反复失败。似乎“发现引擎”正在加载测试并持有DLL上的锁。

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

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

我已经破解了一个解决办法,创建了一个名为Kealakekua的可执行文件,它可以杀死vstest.discoveryengine.x86和vstest.executionengine.x86,并将其作为预构建事件的第一部分,它可以复制文件并进行构建,但不希望与visual studio争夺我的文件。

EN

回答 2

Stack Overflow用户

发布于 2014-11-27 00:41:39

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

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

代码语言:javascript
复制
socket.Read(...)

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

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

如果受到此问题的影响,可以通过在测试发现引擎锁定某些程序集时将Visual Studio附加到测试发现引擎来进行检查。按下pause后,您通常会看到,当前正在执行的代码行在您自己的用户代码中的某个地方(还可以检查Thread窗口)。

票数 2
EN

Stack Overflow用户

发布于 2013-06-29 08:06:28

我有一个类似的问题,我创建了一个“测试”项目,它实际上没有任何测试。(作为一名C++库开发人员,我希望确保某些头文件能够在启用CLR的情况下编译,所以我做了一个假的CLR项目,只使用CLR编译它们。如果它编译了,就通过了。)创建的DLL被vstest.discoveryengine无限期地保持打开状态。

我通过在项目中添加一个被忽略的测试修复了这个问题。我认为vstest.discoveryengine会一直持有这个动态链接库,直到它找到这个动态链接库中的所有测试,但是如果没有要找到的测试,那么它将永远持有它。

我添加的测试(我认为它是默认测试)请注意TEST_IGNORE()以确保它不会被执行:

代码语言:javascript
复制
#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
      }

   };
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16696825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档