Diciamo che stai scrivendo un gioco in stile TDD Yahtzee. Si desidera testare la parte del codice che determina se un set di cinque tiri di dado è o meno un full. Per quanto ne so, quando fai TDD, segui questi principi:
- Scrivi prima i test
- Scrivi la cosa più semplice possibile che funzioni
- Affina e refatta
Quindi un test iniziale potrebbe assomigliare a questo:
public void Returns_true_when_roll_is_full_house()
{
FullHouseTester sut = new FullHouseTester();
var actual = sut.IsFullHouse(1, 1, 1, 2, 2);
Assert.IsTrue(actual);
}
Quando segui "Scrivi la cosa più semplice possibile che funziona", dovresti ora scrivere il IsFullHouse
metodo in questo modo:
public bool IsFullHouse(int roll1, int roll2, int roll3, int roll4, int roll5)
{
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)
{
return true;
}
return false;
}
Ciò si traduce in un test ecologico ma l'implementazione è incompleta.
Dovresti testare ogni possibile combinazione valida (sia di valori che di posizioni) per un full house? Sembra l'unico modo per essere assolutamente sicuri che il tuo IsFullHouse
codice sia completamente testato e corretto, ma sembra anche abbastanza folle farlo.
Come testereste qualcosa del genere?
Aggiornare
Erik e Kilian sottolineano che l'uso dei letterali nell'implementazione iniziale per ottenere un test ecologico potrebbe non essere la migliore idea. Vorrei spiegare perché l'ho fatto e quella spiegazione non rientra in un commento.
La mia esperienza pratica con i test unitari (in particolare utilizzando un approccio TDD) è molto limitata. Ricordo di aver visto una registrazione della Masterclass TDD di Roy Osherove su Tekpub. In uno degli episodi costruisce uno stile TDD String Calculator. Le specifiche complete del calcolatore di stringhe sono disponibili qui: http://osherove.com/tdd-kata-1/
Inizia con un test come questo:
public void Add_with_empty_string_should_return_zero()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("");
Assert.AreEqual(0, result);
}
Ciò si traduce in questa prima implementazione del Add
metodo:
public int Add(string input)
{
return 0;
}
Quindi viene aggiunto questo test:
public void Add_with_one_number_string_should_return_number()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("1");
Assert.AreEqual(1, result);
}
E il Add
metodo è refactored:
public int Add(string input)
{
if (input.Length == 0)
{
return 0;
}
return 1;
}
Dopo ogni passaggio Roy dice "Scrivi la cosa più semplice che funzionerà".
Quindi ho pensato di provare questo approccio quando provavo a fare un gioco Yahtzee in stile TDD.
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)