Während der TDD-Schulung auf der Grundlage eines medizinischen Softwarefalls wird die folgende Story implementiert: "Wenn der Benutzer die Schaltfläche Speichern drückt, sollte das System einen Patienten hinzufügen, ein Gerät hinzufügen und Gerätedatensätze hinzufügen."
Die endgültige Implementierung sieht ungefähr so aus:
if (_importDialog.Show() == ImportDialogResult.SaveButtonIsPressed)
{
AddPatient();
AddDevice();
AddDeviceDataRecords();
}
Wir haben zwei Möglichkeiten, dies umzusetzen:
- Drei Tests, bei denen jeweils eine Methode überprüft wurde (AddPatient, AddDevice, AddDeviceDataRecords)
- Ein Test, der alle drei Methoden verifiziert, wurde aufgerufen
Im ersten Fall, wenn eine Bedingung nicht erfüllt ist, schlagen alle drei Tests fehl. Aber im zweiten Fall, wenn der Test fehlschlägt, sind wir uns nicht sicher, was genau falsch ist. Welchen Weg würdest du bevorzugen?
quelle
Die Granularität in Ihrem Beispiel scheint der Unterschied zwischen Unit- und Acceptance-Tests zu sein.
Ein unittest testet eine einzelne Funktionseinheit mit möglichst wenigen Abhängigkeiten. In deinem Fall könnten es 4 Unittests sein
Unittests sind für die Entwickler , damit sie sich darauf verlassen können, dass ihr Code technisch korrekt ist
Die Abnahmetests sollten die kombinierte Funktionalität aus Sicht des Benutzers testen. Sie sollten entlang der User Stories modelliert werden und so hoch wie möglich sein. Sie müssen also nicht prüfen, ob Funktionen aufgerufen werden, sondern ob ein für den Benutzer sichtbarer Nutzen erzielt wird:
Wenn der Benutzer die Daten eingibt, klickt er auf OK und ...
Akzeptanztests sind für die Kunden oder zum Aufbau einer besseren Kommunikation mit ihnen.
Zur Beantwortung Ihrer Frage "Was würden Sie bevorzugen?"
quelle
Das ist falsch
Sie müssen dies tun, um sicherzustellen, dass es funktioniert.
Sie müssen dies auch tun, um sicherzustellen, dass die API funktioniert.
Die Klasse - als Einheit - muss vollständig getestet werden. Jede Methode.
Sie können mit einem Test beginnen, der alle drei Methoden abdeckt, aber nicht viel aussagt.
Richtig. Deshalb testen Sie alle Methoden.
Sie müssen die öffentliche Schnittstelle testen. Da diese Klasse drei Dinge plus eins macht (auch wenn sie aufgrund von User Storys in einer Methode gebündelt sind), müssen Sie alle vier Dinge testen. Drei Low-Level- und ein Bundle.
quelle
Wir schreiben unsere Komponententests für aussagekräftige Funktionssätze, die oft einer Methode zugeordnet werden (wenn Sie Ihren Code gut geschrieben haben), aber manchmal größer werden und viele Methoden umfassen.
Stellen Sie sich zum Beispiel vor, dass beim Hinzufügen eines Patienten zu Ihrem System einige Unterprogramme (untergeordnete Funktionen) aufgerufen werden müssen:
Wir könnten auch einen Unit-Test für jede dieser Funktionen schreiben.
quelle
Eine einfache Faustregel, die ich befolgt habe, ist, den Test so zu benennen, dass sie genau beschreibt, was der Test tut. Wenn der Name des Tests zu komplex wird, ist dies ein Zeichen dafür, dass der Test möglicherweise zu viel bewirkt. Wenn Sie beispielsweise einen Test benennen, um das zu tun, was Sie in Option 2 vorschlagen, sieht dies möglicherweise wie folgt aus: PatientIsAddedDeviceIsAddedAndDeviceDataRecordsWhenSaved. Dies ist weitaus komplexer als drei separate Tests: PatientIsAddedWhenSaved, DeviceIsAddedWhenSaved, DataRecordsWhenSaved. Ich denke auch, dass die Lehren, die man aus BDD ziehen kann, ziemlich interessant sind, wenn jeder Test wirklich eine einzelne Anforderung darstellt, die in einer natürlichen Sprache beschrieben werden könnte.
quelle