Могу ли я заставить MSTest использовать новый процесс для каждого запуска теста? - PullRequest
11 голосов
/ 19 ноября 2011

Мы используем тестер VS 2010 (MSTest) для автоматизированного функционального тестирования.Когда мы запускаем тесты из Visual Studio, VS создает процесс с именем QTAgent32.exe и запускает тесты в этом процессе.

Мы обнаружили, что при выполнении нескольких тестовых прогонов MSTest будет повторно использовать один и тот же процесс QTAgent32 - идентификатор процесса не изменяется.Это проблема для нас, так как тестируемый нами код - это P / Invoking для неуправляемой DLL.DLL должна быть инициализирована только один раз за время существования процесса.У нас есть метод [AssemblyInitialize], но он выполняется один раз за тестовый запуск.Если мы выполним несколько тестовых прогонов, он будет выполняться более одного раза в одном и том же процессе.

Каждый раз, когда мы выполняем тестовый прогон, MSTest создает новый домен приложения;но все эти домены приложений находятся в одном и том же процессе.

Итак, мне интересно: есть ли способ указать исполнителю тестов Visual Studio использовать новый процесс каждый раз, когда мы запускаем тесты?Я посмотрел на конфигурацию ".testsettings", но не увидел ничего релевантного.

Ответы [ 3 ]

6 голосов
/ 19 ноября 2011

Не знаю, как далеко вы хотите пойти с ним, но одним из решений может быть создание хоста для юнит-теста

http://technet.microsoft.com/fr-fr/query/bb166558

по этой ссылке показано, как создавать адаптеры, а также вымог бы затем запустить новый процесс для вечного тестирования, создать трубопроводную связь и разорвать ее после теста.

Я знаю, что сама MS использует другой хост для запуска тестов при кротах

http://research.microsoft.com/en-us/projects/pex/molestutorial.pdf

1 голос
/ 19 ноября 2011

Я смог получить эту работу после прочтения комментария Викитора о FreeLibrary ().

Я использовал этот класс , созданный Майком Сталлом, который предоставляет обертки для LoadLibrary, GetProcAddress и FreeLibrary.,Таким образом, я могу загрузить библиотеку один раз в каждом тестовом прогоне, вызвать необходимые методы, а затем освободить библиотеку в конце тестового прогона.

Код Майка Сталла использует Marshal.GetDelegateForFunctionPointer , который преобразует указатель неуправляемой функции в управляемый тип делегата.

Мне пришлось заменить внешние объявления [DllImport] объявлениями для типов делегатов.Поэтому я преобразовал это:

[DllImport("asesignal.dll")]
public static extern bool ASESDK_Initialize(string licenseCode);

в это:

public delegate bool ASESDK_Initialize(string licenseCode);

Код Майка Сталла содержал примеры с обобщенными делегатами (действие и т. Д.).Но я не смог заставить это работать, поэтому я создал свои собственные типы делегатов.

Я могу динамически загружать DLL следующим образом:

_ht = new UnmanagedLibrary(@"c:\windows\system32\asesignal.dll");

Чтобы вызвать функцию, я делаю это:

var function = _ht.GetUnmanagedFunction<ASESDK_Initialize>("ASESDK_Initialize");
function(licenseCode);

Спасибо Wiktor и np-hard за помощь!

0 голосов
/ 28 марта 2017

VS 2013 и более поздние версии теперь имеют параметр для этого в разделе «Тест»> «Параметры теста»> «Запустить двигатель выполнения теста». Если снять этот флажок, при каждом запуске будет запускаться новый двигатель.

...