среда, марта 31, 2010

Тесты и Exception вида "System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used"....

В проекте используется com interrop,вкратце, создается COM-инстанс и обращение к нему происходит через singletone-объект;

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

"System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used"

Проблема связана с тем, что каждый тест по умолчанию запускается в отдельном потоке, или даже домене (подробнее не разбирался), и доступ к инстансу COM-server происходил из другого потока...

Проблему пофиксил пока путем настройки не паралельного запуска тестов, а их последовательного выполнения. 

Настраивается такое поведение путем внесения изменений в Local.testsettings файл, а именно, путем указания количества одновременно выполняемых тестов в 



<Execution parallelTestCount=""<вставить нужное="" значение="">




  если parallelTestCount == 0, то тесты выполняются параллельно, количество тестов в пуле выбирается самой студией...



  Мне же был нужен следующий вариант:

  <TestSettings name="Local" id="38863d1e-30b7-4b4a-a629-4add84f4982e" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
    <Description>These are default test settings for a local test run.</Description>
    <Execution parallelTestCount="1">
      <TestTypeSpecific />
      <Timeouts runTimeout="900000" testTimeout="900000" />
      <ExecutionThread apartmentState="MTA"/>
      <AgentRule name="Execution Agents">
      </AgentRule>
    </Execution>
  </TestSettings>


Важно: чтобы ваши изменения вступили в силу, нужно перегрузить проект/решение;

ps: попутно читал следующие ресурсы:

    http://connect.microsoft.com/VisualStudio/feedback/details/534124/exception-running-tests-that-use-waithandle-waitall-waithandles

    VS2010 tip: How to run unit tests in parallel
    http://blogs.microsoft.co.il/blogs/dhelper/archive/2010/03/02/vs2010-tip-how-to-run-unit-tests-in-parallel.aspx

    Parallel Test Execution in Visual Studio 2010
    http://msmvps.com/blogs/p3net/pages/parallel-test-execution-in-visual-studio-2010.aspx

    Executing Unit Tests in parallel on a multi-CPU/core machine
    http://blogs.msdn.com/vstsqualitytools/archive/2009/12/01/executing-unit-tests-in-parallel-on-a-multi-cpu-core-machine.aspx

Комментариев нет: