21

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

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

如果 vstest.discoveryengine 正在运行,这会反复失败。似乎“发现引擎”正在加载测试并锁定 DLL。

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

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

我通过创建一个名为 Kealakekua 的可执行文件破解了一个解决方法,它杀死了 vstest.discoveryengine.x86、vstest.executionengine.x86,并且作为预构建事件的第一部分,它可以复制文件并构建,但更喜欢不要为我的文件与视觉工作室抗争。

4

2 回答 2

2

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

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

socket.Read(...)

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

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

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

于 2014-11-26T16:41:38.593 回答
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
      }

   };
}

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

于 2013-06-29T00:06:27.977 回答