2011-11-18 16 views
11

Używamy testera testowego VS 2010 (MSTest) do automatycznego testowania funkcjonalnego. Kiedy uruchamiamy testy z Visual Studio, VS tworzy proces o nazwie QTAgent32.exe i uruchamia testy w tym procesie.Czy mogę zmusić MSTest do użycia nowego procesu dla każdego uruchomienia testowego?

Stwierdziliśmy, że gdy wykonujemy wiele testów, MSTest ponownie użyje tego samego procesu QTAgent32 - identyfikator procesu się nie zmieni. Jest to dla nas problem, ponieważ testowany przez nas kod to P/Wywołanie niezarządzanej biblioteki DLL. Biblioteka DLL musi być zainicjalizowana tylko raz podczas całego cyklu życia procesu. Mamy metodę [AssemblyInitialize], która jest wykonywana raz w ciągu testu. Jeśli wykonamy wiele testów, wykonamy więcej niż jeden raz w tym samym procesie.

Za każdym razem, gdy wykonujemy test, MSTest tworzy nowe appdomain; ale te appdomains są w tym samym procesie.

Zastanawiam się: czy istnieje sposób, aby powiedzieć biegaczowi testowemu Visual Studio, aby korzystał z nowego procesu za każdym razem, gdy uruchamiamy testy? Przyjrzałem się konfiguracji ".testsettings", ale nie widziałem nic istotnego.

+2

Tylko dla mojej ciekawości - czy możliwe jest, że niezarządzana biblioteka DLL jest rozładowywana po każdym kolejnym badaniu za pomocą 'FreeLibrary'? –

+0

Dzięki Wiktor - dobra sugestia. Obecnie kod po prostu odwołuje się statycznie do niezarządzanego API, wykorzystując atrybuty [DllImport] do deklaracji funkcji zewnętrznych C#. Zakładam, że .NET nie zwolni automatycznie biblioteki, gdy aplikacja zostanie zerwana, ponieważ dostaniemy błędy. Naprawdę nie wiem jak wywołać dynamicznie ładowaną bibliotekę DLL z kodu C# - czy możesz wywołać LoadLibrary() i GetProcAddress(), a następnie w jakiś sposób przesłać zwrócony wskaźnik funkcji do typu delegata? W każdym razie, zagłębię się w to - dzięki! Właśnie znalazłem to, co może pomóc: http://www.codeproject.com/KB/cs/dyninvok.aspx –

Odpowiedz

6

nie wiem jak daleko chcesz iść z nim, ale jednym z rozwiązań mogłoby być stworzenie nasz test gospodarza jednostka

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

ten link pokazuje jak stworzyć adapterów, także można następnie uruchomić nowy Przetwórz dla evertest, utwórz połączenie przewodowe i oderwij po teście.

wiem sam MS używa innego hosta do uruchamiania testów pod moli

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

+0

Dzięki! Sprawdzę to. Nie zdawałem sobie sprawy, że możesz stworzyć niestandardowego hosta. W tej chwili szukamy, czy istnieje inny biegacz testowy (np. Gallio Icarus), który za każdym razem może uruchomić testy w nowym procesie. To naprawdę tylko problem podczas interaktywnego tworzenia i testowania - na serwerze kompilacji mamy tylko jeden test w pojedynczym procesie testowym. –

1

udało mi się uzyskać tej pracy po przeczytaniu komentarza Wiktora o FreeLibrary().

Użyłem this class stworzonego przez Mike'a Stall'a, który zapewnia opakowania wokół LoadLibrary, GetProcAddress i FreeLibrary. W ten sposób mogę załadować bibliotekę raz w każdym uruchomieniu testowym, wywołać niezbędne metody, a następnie zwolnić bibliotekę po zakończeniu testu.

Kod Mike Stall używa Marshal.GetDelegateForFunctionPointer, który konwertuje niezarządzany wskaźnik funkcji na zarządzany typ delegata.

Musiałem zastąpić deklaracje extern [DllImport] deklaracjami dla typów delegatów. Więc przeliczone następująco:

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

do tego: Kod

public delegate bool ASESDK_Initialize(string licenseCode); 

Mike Stall zawierała przykłady z delegatami generyczne (działania <T> itd.). Ale nie mogłem tego zrobić, więc stworzyłem własne typy delegatów.

mogę załadować dynamicznie DLL tak:

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

Aby wywołać funkcję, mogę to zrobić:

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

Dzięki Wiktor i NP-trudne za pomoc!

0

VS 2013 i nowszy ma teraz ustawienie dla tego w Test> Ustawienia testu> Zatrzymaj silnik wykonywania testów uruchomiony. Odznaczenie tej opcji spowoduje uruchomienie każdego nowego silnika.