Trovo la struttura migliore, se puoi chiamarla così,
Library
LibraryTests
ClassATests.cs
ClassBtests.cs
public class ClassATests
{
[TestCase(1, 2, Category="Integration")]
[TestCase(3, 4, Category="Unit")]
public void MethodC(int input, int expectedResult)
{
//SetUp
//create unit or integration setup of object under test
Console.Write("given " + input);
//Call
Console.Write("when whatever");
//Assert
Console.Write("then" + result);
}
}
Ovviamente questo è un semplice esempio, puoi migliorarlo avendo nomi e dati guidati dai dati, ma ha diversi vantaggi.
- Puoi eseguire facilmente tutti i test per un determinato progetto di libreria
- Puoi eseguire facilmente tutti i test per una determinata classe
- Puoi eseguire lo stesso test sia in unità che in sapori di integrazione
- L'output della console verrà visualizzato nel risultato del test, in modo da poter ottenere informazioni dettagliate sugli errori
- Test basati sui dati ti consentono di testare molti scenari con lo stesso codice
- Quando si modifica una classe esistente è sempre evidente allo sviluppatore dove si trovano i test esistenti e dove dovrebbero aggiungere nuovi test.
I problemi che trovo con le strutture di test complicate, che coinvolgono l'ereditarietà e GivenThenQuando il naming è che di solito è una struttura inventata personalizzata piuttosto che uno standard di Visual Studio.
Ciò lo rende intrinsecamente più difficile per uno sviluppatore, che ha solo una piccola modifica da apportare o bug da correggere per capire come aggiungere un nuovo test. Prima devono capire il tuo sistema di test.
Inoltre, una volta capito ci sono spesso una grande quantità di codice da scrivere, nuovi file e classi aggiunte ecc. prima che un nuovo test possa essere aggiunto, come indicato in quello che potrebbe essere un caso di test a linea singola nel progetto sopra.
The GivenThenQuando la denominazione di classi e metodi, spesso funziona solo con particolari configurazioni di test runner. Se non hai questa configurazione, vedrai solo un sacco di WhenXisY senza informazioni su cosa sta realmente accadendo.
In breve, il vantaggio di vedere l'output GivenWhenThen è più che compensato dal costo della codifica aggiuntiva e dalla difficoltà di scrivere nuovi test.
In una vasta base di codice per alcuni anni potresti scoprire di avere a disposizione più sistemi di test inventati mentre le persone migliorano e modificano quello che è considerato un buon sistema nel tempo. Ho lavorato in luoghi in cui hanno utilizzato più lingue oltre a framework di test, runner e sistemi di simulazione in diversi componenti.
'Conoscere la struttura del test' non è più una cosa semplice. Potrebbe essere necessario scoppiare una versione non supportata di ruby, scoprire che gem gem ha scritto prima di partire per farlo funzionare con c # e quindi controllare le vecchie jiras per scoprire come farlo funzionare con team city