2013-08-18 12 views
5

Utilizzo di TDD per la prima volta nella mia vita di oggi. Sto usando nUnit.TDD nUnità di più asserzioni per un metodo

Ho un metodo, in cui posso inserire più input diversi e verificare se il risultato funziona.

Ho letto che più affermazioni in un test non è un problema, e davvero non voglio scrivere un nuovo test per ogni input.

Esempio con molteplici afferma:

[TestFixture] 
public class TestClass 
{ 

    public Program test; 

    [SetUp] 
    public void Init() 
    { 
     test = new Program(); 

    } 
    [Test] 
    public void Parse_SimpleValues_Calculated() 
    { 
     Assert.AreEqual(25, test.ParseCalculationString("5*5")); 
     Assert.AreEqual(125, test.ParseCalculationString("5*5*5")); 
     Assert.AreEqual(10, test.ParseCalculationString("5+5")); 
     Assert.AreEqual(15, test.ParseCalculationString("5+5+5")); 
     Assert.AreEqual(50, test.ParseCalculationString("5*5+5*5")); 
     Assert.AreEqual(3, test.ParseCalculationString("5-1*2")); 
     Assert.AreEqual(7, test.ParseCalculationString("7+1-1")); 
    } 
} 

Ma quando qualcosa non riesce, è molto difficile da leggere che asseriscono fallito, voglio dire, se si dispone di loro un sacco, è necessario passare attraverso tutti e trovare l'asserzione destra .

C'è un modo elegante per mostrare quale input è stato impostato se l'asserzione ha esito negativo, invece del risultato e del risultato previsto?

Grazie.

+0

Secondo me, * dovresti * avere un test diverso per ogni caso di test. Il tuo test dovrebbe avere una ragione per fallire: hai apportato una modifica al codice che ha infranto il tuo caso di test. Cosa succede se si modifica una parte della logica di analisi in modo che le operazioni di aggiunta non riescano, ma la sottrazione è corretta? Se hai un caso di test, fallirà sia per l'addizione che per la sottrazione. –

risposta

10

Voglio dire, se li hai molto, quindi devi passare tutto.

No, non è così, basta osservare la traccia dello stack. Se stai eseguendo i test all'interno di un IDE, trovo che sia abbastanza buono da capire quale linea ha fallito.

Detto questo, lo è un modo (significativamente) migliore: test parametrizzati con TestCaseAttribute. Così, per esempio:

[Test] 
[TestCase("5*5", 25)] 
[TestCase("5*5*5", 125)] 
[TestCase("5+5", 10)] 
// etc 
public void Parse_SimpleValues_Calculated(string input, int expectedOutput) 
{ 
    Assert.AreEqual(expectedOutput, test.ParseCalculationString(input)); 
} 

Ora il test corridore unità vi mostrerà ogni test separatamente, e sarete in grado di vedere che uno non riesce. Inoltre, eseguirà tutti i dei test, anche se uno dei primi fallisce, quindi non finirai col risolvere uno solo per scoprire che il successivo non è riuscito in modo imprevisto.

C'è anche TestCaseSourceAttribute per i casi in cui si desidera specificare una raccolta di input separatamente - ad es. da utilizzare su più test.

+0

Questo è quello che volevo wow sei genio. Non sapevo come chiedere quei test parametrizzati. Grazie Signore. –

+1

@JohnMathilda: Lontano da un genio - Sono appena stato nella stessa barca io :) –