I test dovrebbero fallire solo per una ragione, ma ciò non significa sempre che dovrebbe esserci solo una dichiarazione Assert
. IMHO è più importante attenersi al modello " Disponi, agisci, asserisci ".
La chiave è che hai una sola azione, e poi controlli i risultati di quell'azione usando le asserzioni. Ma è "Arrange, Act, Assert, End of test ". Se sei tentato di continuare il test eseguendo un'altra azione e più asserti in seguito, fai invece un test separato.
Sono felice di vedere più affermazioni di affermazione che formano parti di test della stessa azione. per es.
[Test]
public void ValueIsInRange()
{
int value = GetValueToTest();
Assert.That(value, Is.GreaterThan(10), "value is too small");
Assert.That(value, Is.LessThan(100), "value is too large");
}
o
[Test]
public void ListContainsOneValue()
{
var list = GetListOf(1);
Assert.That(list, Is.Not.Null, "List is null");
Assert.That(list.Count, Is.EqualTo(1), "Should have one item in list");
Assert.That(list[0], Is.Not.Null, "Item is null");
}
Puoi potresti combinarli in un'unica asserzione, ma è una cosa diversa dall'insistere che dovresti o devi . Non c'è alcun miglioramento dalla combinazione di essi.
es. Il primo potrebbe essere
Assert.IsTrue((10 < value) && (value < 100), "Value out of range");
Ma non è meglio - il messaggio di errore è meno specifico e non ha altri vantaggi. Sono sicuro che puoi pensare ad altri esempi in cui combinare due o tre (o più) asserzioni in un'unica grande situazione booleana rende più difficile la lettura, più difficile da modificare e più difficile capire perché ha fallito. Perché farlo solo per il gusto di una regola?
NB : il codice che sto scrivendo qui è C # con NUnit, ma i principi si terranno con altri linguaggi e framework. Anche la sintassi potrebbe essere molto simile.