Ich kenne keine Situation, in der es eine gute Idee wäre, mehrere Behauptungen innerhalb der [Test] -Methode selbst zu haben. Der Hauptgrund, warum Leute gerne mehrere Assertions haben, ist, dass sie versuchen, für jede getestete Klasse eine [TestFixture] -Klasse zu haben. Stattdessen können Sie Ihre Tests in weitere [TestFixture] -Klassen aufteilen. Auf diese Weise können Sie mehrere Methoden anzeigen, bei denen der Code möglicherweise nicht wie erwartet reagiert hat, anstatt nur die, bei der die erste Zusicherung fehlgeschlagen ist. Auf diese Weise haben Sie mindestens ein Verzeichnis pro Klasse, das mit vielen [TestFixture] -Klassen getestet wird. Jede [TestFixture] -Klasse wird nach dem spezifischen Status eines zu testenden Objekts benannt. Die Methode [SetUp] versetzt das Objekt in den durch den Klassennamen beschriebenen Zustand. Dann haben Sie mehrere [Test] -Methoden, von denen jede verschiedene Dinge bestätigt, von denen Sie erwarten, dass sie wahr sind, wenn der aktuelle Status des Objekts gegeben ist. Jede [Test] -Methode ist nach dem, was sie behauptet, benannt, es sei denn, sie ist möglicherweise nach dem Konzept benannt, anstatt nur den Code auf Englisch auszulesen. Dann benötigt jede Implementierung der [Test] -Methode nur eine einzige Codezeile, in der etwas behauptet wird. Ein weiterer Vorteil dieses Ansatzes besteht darin, dass die Tests sehr gut lesbar sind, da deutlich wird, was Sie testen und was Sie erwarten, wenn Sie sich nur die Klassen- und Methodennamen ansehen. Dies wird auch besser skaliert, wenn Sie anfangen, all die kleinen Randfälle zu erkennen, die Sie testen möchten, und wenn Sie Fehler finden. außer vielleicht könnte es nach dem Konzept benannt werden, anstatt nur einen englischen Code auszulesen. Dann benötigt jede Implementierung der [Test] -Methode nur eine einzige Codezeile, in der etwas behauptet wird. Ein weiterer Vorteil dieses Ansatzes besteht darin, dass die Tests sehr gut lesbar sind, da deutlich wird, was Sie testen und was Sie erwarten, wenn Sie sich nur die Klassen- und Methodennamen ansehen. Dies wird auch besser skaliert, wenn Sie anfangen, all die kleinen Randfälle zu erkennen, die Sie testen möchten, und wenn Sie Fehler finden. außer vielleicht könnte es nach dem Konzept benannt werden, anstatt nur einen englischen Code auszulesen. Dann benötigt jede Implementierung der [Test] -Methode nur eine einzige Codezeile, in der etwas behauptet wird. Ein weiterer Vorteil dieses Ansatzes besteht darin, dass die Tests sehr gut lesbar sind, da deutlich wird, was Sie testen und was Sie erwarten, wenn Sie sich nur die Klassen- und Methodennamen ansehen. Dies wird auch besser skaliert, wenn Sie anfangen, all die kleinen Randfälle zu erkennen, die Sie testen möchten, und wenn Sie Fehler finden. und was Sie erwarten, wenn Sie sich die Klassen- und Methodennamen ansehen. Dies wird auch besser skaliert, wenn Sie anfangen, all die kleinen Randfälle zu erkennen, die Sie testen möchten, und wenn Sie Fehler finden. und was Sie erwarten, wenn Sie sich die Klassen- und Methodennamen ansehen. Dies wird auch besser skaliert, wenn Sie anfangen, all die kleinen Randfälle zu erkennen, die Sie testen möchten, und wenn Sie Fehler finden.
Normalerweise bedeutet dies, dass die letzte Codezeile in der [SetUp] -Methode einen Eigenschaftswert oder einen Rückgabewert in einer privaten Instanzvariablen der [TestFixture] speichern sollte. Dann können Sie verschiedene Dinge über diese Instanzvariable aus verschiedenen [Test] -Methoden bestätigen. Sie können auch Aussagen darüber treffen, welche unterschiedlichen Eigenschaften des zu testenden Objekts auf den gewünschten Zustand eingestellt sind.
Manchmal müssen Sie während des Versuchs, das zu testende Objekt in den gewünschten Zustand zu versetzen, Behauptungen aufstellen, um sicherzustellen, dass Sie nichts falsch gemacht haben, bevor Sie das Objekt in den gewünschten Zustand versetzt haben. In diesem Fall sollten diese zusätzlichen Zusicherungen in der [SetUp] -Methode erscheinen. Wenn in der [SetUp] -Methode etwas schief geht, ist klar, dass mit dem Test etwas nicht stimmte, bevor das Objekt in den gewünschten Zustand kam, den Sie testen wollten.
Ein weiteres Problem ist, dass Sie möglicherweise eine Ausnahmebedingung testen, deren Auslösung Sie erwartet haben. Dies kann Sie dazu verleiten, dem obigen Modell nicht zu folgen. Dies kann jedoch trotzdem erreicht werden, indem die Ausnahme in der [SetUp] -Methode abgefangen und in einer Instanzvariablen gespeichert wird. Auf diese Weise können Sie verschiedene Dinge über die Ausnahme behaupten, und zwar jeweils mit einer eigenen [Test] -Methode. Sie können dann auch andere Dinge über das zu prüfende Objekt behaupten, um sicherzustellen, dass die Ausnahmebedingung keine unbeabsichtigten Nebenwirkungen hat.
Beispiel (dies würde in mehrere Dateien aufgeteilt):
namespace Tests.AcctTests
{
[TestFixture]
public class no_events
{
private Acct _acct;
[SetUp]
public void SetUp() {
_acct = new Acct();
}
[Test]
public void balance_0() {
Assert.That(_acct.Balance, Is.EqualTo(0m));
}
}
[TestFixture]
public class try_withdraw_0
{
private Acct _acct;
private List<string> _problems;
[SetUp]
public void SetUp() {
_acct = new Acct();
Assert.That(_acct.Balance, Is.EqualTo(0));
_problems = _acct.Withdraw(0m);
}
[Test]
public void has_problem() {
Assert.That(_problems, Is.EquivalentTo(new string[] { "Withdraw amount must be greater than zero." }));
}
[Test]
public void balance_not_changed() {
Assert.That(_acct.Balance, Is.EqualTo(0m));
}
}
[TestFixture]
public class try_withdraw_negative
{
private Acct _acct;
private List<string> _problems;
[SetUp]
public void SetUp() {
_acct = new Acct();
Assert.That(_acct.Balance, Is.EqualTo(0));
_problems = _acct.Withdraw(-0.01m);
}
[Test]
public void has_problem() {
Assert.That(_problems, Is.EquivalentTo(new string[] { "Withdraw amount must be greater than zero." }));
}
[Test]
public void balance_not_changed() {
Assert.That(_acct.Balance, Is.EqualTo(0m));
}
}
}