Подтвердить что ты не робот

Предотвращать блокировку DLL файлов для обнаружения открытий vstest

У меня есть единичные тесты на С# для проекта VS2012, который вызывает VS2010 С++ DLL, используя DllImport pinvoke.

Как событие предварительной сборки для тестового проекта, я копирую последнюю версию DLL в бинарный проект для теста.

Это повторяется, если vstest.discoveryengine запущен. Похоже, что "механизм обнаружения" загружает тесты и удерживает блокировку в DLL.

Если я убью vstest engine, то я смогу построить и запустить тесты. в противном случае сборка завершится неудачей, а VS2012 предложит запустить предыдущую версию (с диалоговым окном модели, в котором отсутствует опция "Не показывать это сообщение снова" )

Есть ли что-то, что я могу сделать, чтобы заставить тестовый проект выгрузить DLL, когда он не выполнял тесты, или отключить исполняемый файл обнаружения фона?

Я взломал обходной путь, создав исполняемый файл под названием Kealakekua, который убивает vstest.discoveryengine.x86, vstest.executionengine.x86, и с этим в качестве первой части события предварительной сборки он может копировать файлы и создавать, но предпочел бы не бороться с visual studio для моего файла.

4b9b3361

Ответ 1

Недавно у меня была эта проблема, и проблема была вызвана моим собственным пользовательским кодом.

Во время обнаружения теста все тестовые классы создаются и в одном из наших конструкторов классов тестов были инициализированы довольно сложные бизнес-классы. Проблема в том, что во время инициализации был создан фоновый поток, который сделал следующее:

socket.Read(...)

Этот поток продолжал работать навсегда, ожидая появления некоторых данных сокетов и, как результат, заблокировал нашу сборку.

Итак, решение для меня состояло в том, чтобы убедиться, что этот код не будет вызван во время обнаружения теста.

Вы можете проверить, если вы затронуты этой проблемой, добавив Visual Studio к движку обнаружения теста, когда он заблокировал сборку. После нажатия паузы вы обычно увидите, что текущая строка выполнения находится где-то в вашем собственном коде пользователя (также проверьте окно Threads).

Ответ 2

У меня была аналогичная проблема, когда я создал проект "Тест", который на самом деле не имел никаких тестов. (Как разработчик библиотеки С++, я хотел убедиться, что некоторые заголовки могут быть скомпилированы с включенным CLR, поэтому я создал поддельный проект CLR, чтобы просто скомпилировать их с помощью CLR. Если он скомпилирован, он прошел.) Созданная DLL была открытые неограниченное время на vstest.discoveryengine.

Я исправил его, добавив в проект пропущенный тест. Я думаю, что 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
      }

   };
}

Я надеюсь, что это возможно в вашей ситуации.