2009-10-09 15 views
28

Sto lavorando in un'applicazione che è principalmente single-thread, singolo utente. Ci sono alcuni thread di lavoro qua e là, e usano solo oggetti e classi thread safe. I test unitari stanno effettivamente testando quelli con più thread (creati esplicitamente per i test) e testano bene.Esiste un modo per eseguire i test unitari in sequenza con MSTests?

I test unitari VSTS sicuro durante il test oggetti business e sottosistemi che non è thread-safe. Va bene per loro non essere thread-safe, questo è il modo in cui l'applicazione li usa.

Ma il 'un thread per TestMethod' approccio di test MS ci uccide. Ho dovuto implementare blocchi di oggetti in molte classi di test di unità solo per garantire che i test vengano eseguiti uno dopo l'altro (non mi interessa davvero l'ordine, ma non posso avere due metodi di test che colpiscono lo stesso oggetto a lo stesso tempo).

Il codice simile a questo:

[TestClass] 
public class TestSomeObject 
{ 
    static object turnStile = new object(); 
... 
    [TestMethod] 
    public void T01_TestThis() 
    { 
     lock(turnStile) 
     { 
     .. actual test code 
     } 
    } 

    [TestMethod] 
    public void T02_TestThat() 
    { 
     lock(turnStile) 
     { 
     -- actual test code 
     } 
    } 

} 

C'è un/modo migliore più elegante per fare il test in sequenza?

+0

quindi sembra che tu stia riutilizzando un'istanza di qualche oggetto in tutti i tuoi test? – BlackTigerX

+0

Sì, in sostanza. A volte è il database, a volte è un singleton - usato come è nell'applicazione –

+1

dal momento che tu affermi che è * unit-test * dal tuo tag, dovresti simulare/stubare le tue dipendenze, specialmente le dipendenze che non sono thread safe – mxmissile

risposta

16

C'è la nozione di un "Test ordinato", in cui è possibile elencare i test in sequenza. È più orientato a garantire un certo ordine sequenziale, ma non vedo come sarebbe possibile se B non aspetti che A termini.

A parte questo, è un peccato che i test interferiscano tra loro. Esistono metodi di setup/TearDown che possono essere utilizzati per test in modo tale che dopo tutto possa essere possibile isolare i test l'uno dall'altro.

+0

È spiacevole che MSTest esegua tutti i test nello stesso dominio dell'app, consentendo in tal modo ai test di interferire tra loro in un primo momento. – Triynko

23

Utilizzare un Ordered Test.

Test> Nuovo Test> ordinato test

Test > New Test

Ordered Test

+0

Grandi cose. Sapevo che doveva essere un modo più semplice ... :) –

+0

Come si specifica un file .runsettings quando si utilizza un test ordinato? Nello specifico, ho bisogno di accedere a TestContext con i parametri specificati in .runsettings. –

+0

@ajhuddy: sembra un buon candidato per una nuova domanda di overflow dello stack. Cerca prima di tutto per assicurarti che la tua domanda non sia già stata fatta e abbia risposto e fai riferimento a questa domanda quando scrivi la tua nuova domanda. –

8

fine ho usato il metodo di prova ordinata. Funziona bene.

Tuttavia, ho avuto un sacco di tempo farlo funzionare con la build NAnt. In esecuzione solo l'elenco di test ordinato nella compilazione richiede l'utilizzo degli switch/testmetadata e/testlist nel blocco di chiamata MSTest. La documentazione su questi è abbozzata, per usare una descrizione gentile. Io google dappertutto per esempi di "MSTest/testmetadata/testlist" senza alcun effetto.

Il trucco è semplice, tuttavia, e mi sento in dovere di dare alla comunità, nel caso qualcuno urti altro lo stesso problema.

  1. Modificare il file di metadati di prova (con estensione .vsmdi), e aggiungere un nuovo elenco per l'elenco delle prove (il primo nodo nell'albero nel riquadro di sinistra . Dategli il nome che si desidera, ad esempio 'SequentialTests'.
  2. Se si è utilizzato un parametro/testcontainer per la chiamata MSTest, rimuoverlo.
  3. Aggiungi un interruttore per MSTest ->/testmetadata:
  4. Aggiungi un interruttore per MSTest /LISTA-TEST: SequentialTests (o qualsiasi altro nome che hai utilizzato)

Poi MSTest gira solo le prove elencate nel test lista che hai creato.

Se qualcuno ha un metodo migliore, mi piacerebbe sentirlo!

12

È possibile richiedere specificamente un mutex per ciascuna esecuzione di test, sia nei test specifici che si desidera serializzare, sia per tutti i test di una classe (indipendentemente dal fatto che condivida la stessa stringa mutex).

Per un'intera classe di test, è possibile utilizzare il TestInitialize e attributi TestCleanup in questo modo:

private readonly Mutex testMutex = new Mutex(true, "MySpecificTestScenarioUniqueMutexString"); 

[TestInitialize] 
public void Initialize() 
{ 
    testMutex.WaitOne(TimeSpan.FromSeconds(1)); 
} 

[TestCleanup] 
public void Cleanup() { 
    testMutex.ReleaseMutex(); 
} 

essere chiaro questa non è una caratteristica di test, qualsiasi struttura di bloccaggio dovrebbe funzionare. Sto utilizzando il sistema previsto mutex in questo caso: https://msdn.microsoft.com/en-us/library/system.threading.mutex(v=vs.110).aspx

+0

Ciao, potresti elaborare? Per esempio, ho bisogno di chiarimenti su questo "... qualunque cosa condivida la stessa stringa mutex". Inoltre, dichiari il TestMutex Private ReadOnly ma in Initialize e Cleanup stai usando FileTestMutex ... thx – CTZStef

+0

Ciao! La mancata corrispondenza di riferimento era un refuso, l'ho risolto. Ho anche aggiunto un link alla classe Mutex per chiarimenti. Mutex è una struttura di blocco fornita da Microsoft che utilizza una stringa di sistema per il blocco, quindi si desidera che la stringa sia univoca per set-of-things-you-want-to-serialize, che potrebbe essere per test o per test intero diverso classi. Se copi/incolli la stringa ovunque, ogni suo utilizzo verrà serializzato. Nota anche i suggerimenti 'OrderedTest' sopra, che è probabilmente un'idea migliore se funziona per te. L'approccio Mutex (o altro blocco manuale) è complicato. –

2
test

ho usato ordinato, li configurato facilmente su Jenkins basta usare il comando

MSTest /testcontainer:"orderedtestfilename.orderedtest "/ resultsfile:" testresults .trx"

16

è possibile utilizzare playlist

tasto destro del mouse sul metodo di prova -> Aggiungi a playlist -> Nuova playlist

puoi specificare l'ordine di esecuzione enter image description here

+0

Mi sembra che questa sia la migliore risposta alla domanda. – user969153

+1

Ha funzionato meglio ed è stato abbastanza semplice da configurare in meno di un minuto. – Ruan

Problemi correlati