2011-11-18 8 views
11

Stiamo utilizzando il test corridore VS 2010 (MSTest) di test funzionali automatizzati. Quando eseguiamo test da Visual Studio, VS crea un processo chiamato QTAgent32.exe e esegue i test in tale processo.Posso forzare MSTest ad utilizzare un nuovo processo per ogni esecuzione di test?

Abbiamo riscontrato che quando facciamo più corse di prova, MSTest riutilizzerà lo stesso processo QTAgent32 - l'ID di processo non cambia. Questo è un problema per noi, dal momento che il codice che stiamo testando è P/Invocazione a una DLL non gestita. La DLL deve essere inizializzata solo una volta durante la vita del processo. Abbiamo un metodo [AssemblyInitialize], che viene eseguito una sola volta per test run. Se eseguiamo più esecuzioni di test, verrà eseguito più volte nello stesso processo.

Ogni volta che facciamo una corsa di prova, MSTest crea un nuovo dominio di applicazione; ma questi appdomains sono tutti nello stesso processo.

Quindi mi chiedo: c'è un modo per dire al Esame visivo Studio corridore di utilizzare un nuovo processo ogni volta che si corre test? Ho guardato la configurazione ".testsettings" ma non ho visto nulla di rilevante.

+2

Solo per mia curiosità - è possibile che la DLL non gestita venga scaricata dopo ogni test consecutivo con 'FreeLibrary'? –

+0

Grazie Wiktor - buon suggerimento. In questo momento il codice fa riferimento solo staticamente alle API non gestite, utilizzando gli attributi [DllImport] sulle dichiarazioni delle funzioni extern C#. Presumo che .NET non liberi automaticamente la libreria quando l'appdomain viene abbattuto, dal momento che stiamo ricevendo errori. In realtà non so come chiamare una DLL caricata dinamicamente dal codice C#: è possibile chiamare LoadLibrary() e GetProcAddress() e quindi eseguire in qualche modo il puntatore della funzione restituita a un tipo di delegato? Ad ogni modo, lo esaminerò - grazie! Ho appena trovato questo che può aiutare: http://www.codeproject.com/KB/cs/dyninvok.aspx –

risposta

6

non so fino a che punto si vuole andare con lui, ma una soluzione potrebbe essere quella di creare il vostro ospite unit test

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

questo link mostra come creare adattatori, anche si potrebbe quindi lanciare un nuovo processo per evertest, creare una comunicazione in pipe e abbatterlo dopo il test.

so MS si utilizza un host diverso per l'esecuzione di test sotto talpe

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

+0

Grazie! Lo controllerò. Non avevo capito che potresti creare un host personalizzato. In questo momento stiamo cercando di verificare se esiste un altro test runner (ad esempio Gallio Icarus) che può eseguire i test in un nuovo processo ogni volta. In realtà è solo un problema durante lo sviluppo e il test interattivi: sul server di build, abbiamo solo un singolo test eseguito in un singolo processo di test. –

1

ero in grado di ottenere questo lavoro dopo aver letto il commento di Wiktor circa FreeLibrary().

Ho utilizzato this class creato da Mike Stall, che fornisce wrapper su LoadLibrary, GetProcAddress e FreeLibrary. In questo modo, posso caricare la libreria una volta in ogni esecuzione di test, chiamare i metodi necessari e quindi liberare la libreria alla fine dell'esecuzione del test.

Il codice di Mike Stall utilizza Marshal.GetDelegateForFunctionPointer, che converte un puntatore a una funzione non gestita in un tipo di delegato gestito.

ho dovuto sostituire le [DllImport] dichiarazioni extern con le dichiarazioni per i tipi di delegati. Così ho convertito questo:

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

a questo: il codice di

public delegate bool ASESDK_Initialize(string licenseCode); 

Mike stallo conteneva esempi con i delegati generici (Azione <T> ecc). Ma non riuscivo a farlo funzionare, quindi ho creato i miei tipi di delegati.

posso caricare la DLL dinamicamente in questo modo:

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

per chiamare una funzione, faccio questo:

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

Grazie Wiktor e NP-difficile per il vostro aiuto!

0

VS 2013 e inoltro ora ha un'impostazione per questo in Test> Impostazioni di prova> Esegui esecuzione motore di prova. Deselezionando questa selezione verrà avviato un nuovo motore per ogni corsa.