Frage

Nehmen wir an, wir entwerfen einen Stack Class Test First (TDD):

public class Stack<T> {
    private T[] elements = new T[16];
    private int size = 0;
    ...
}

Dieser Stapel verwendet eine interne Array der Größe 16, um seine Elemente zu speichern. Es funktioniert gut, bis Sie ein 17. Element hinzufügen müssen. Da ich vielleicht ein 17. Element benötige, habe ich beschlossen, diesen Funktionalität zu meinem Stapel hinzuzufügen, also begann ich darüber nachzudenken, welchen Namen ich dem Test geben konnte, der diese Funktionalität hinzufügen muss. Das wird das Thema meiner sein erste Frage.

Ich habe zum ersten Mal etwas von der Form von ausgewählt:

Should_Be_Able_To_Correctly_Increase_Its_Inner_Array_Size()

und dann

Should_Handle_More_Items_Than_The_Default_Internal_Array_Size()

Aber nachdem ich ein bisschen nachgedacht hatte, kam ich zu dem Schluss, dass vielleicht so etwas wie das folgende April wäre:

Should_Double_Its_Size_Every_Time_Its_Full()

Meine Argumentation müsste das im ersten Fall tun, ich sage nur, was es tut, aber nicht wann. In der zweiten sage ich, wann ich weitere Gegenstände hinzufügen soll, aber ich sage auch, wie ich daran denke, es (intern) zu erreichen, was möglicherweise nicht korrekt ist. Meiner Ansicht nach (ich bin mir nicht sicher, ob ich richtig bin) sollten meine Tests die möglichen Interaktionen meiner SUT mit außen und nicht darüber, wie sie intern implementiert wird. Habe ich recht?

Für mich sieht es mir aus, dass die dritten Optionen die beste sind, da sie deutlich besagt, was es tut (in der Größe wächst - tatsächlich doppelt so groß), wenn es tut (wenn es voll ist) und mich nicht an eine bestimmte Bindung verbindet Implementierung (ich könnte es vielleicht später in eine interne Arraylist ändern!).

Was mich zu meinem führt zweite Frage: Angenommen, ich habe alle Einheitstests für meine Stapelklasse durchgeführt, die intern ein Array verwendet, und es funktioniert gut und wie erwartet, falls meine Tests intakt bleiben, wenn ich später wieder übertragen und das Array in eine Arraylist oder andere Art von Daten ändern möchte -Struktur? Oder sollten die Tests in irgendeiner Weise das widerspiegeln? Ich würde nein vermuten, aber ich bin mir nicht sicher.

War es hilfreich?

Lösung

Meiner Ansicht nach (ich bin mir nicht sicher, ob ich richtig bin) sollten meine Tests die möglichen Interaktionen meiner SUT mit außen und nicht darüber, wie sie intern implementiert wird. Habe ich recht?

Du hast Recht. Wenn Sie die interne Implementierung Ihrer Klasse ändern, sollten die Unit -Tests gleich bleiben. Wenn Sie extern etwas Neues aufdecken, sollten Sie neue Unit -Tests erstellen, um diese Änderungen zu berücksichtigen.

Denken Sie daran, dass Sie bei der Gestaltung Ihrer Klasse nichts aufdecken möchten, was angibt, wie sie implementiert wurde. Die öffentlichen Mitglieder der Klasse geben an, wie sie mit ihr interagieren, wie sie hinter den Kulissen funktioniert.

Andere Tipps

Ich bin mir nicht sicher, wie Sie die interne Liste oder Arraygröße über einen Einheitentest testen können. Sie können nicht über die Stapelschnittstelle darauf zugreifen. Unit -Tests dienen zum Testen externer Verträge. Wenn Sie Implementierungsdetails testen möchten, versuchen Sie etwas anderes.

Die Antwort auf Ihre zweite Frage lautet Ja, der Test sollte noch bestehen, wenn es sich um einen Unit -Test handelt.

Fragen Sie sich, was Sie bereit sind, für diese Klasse zu verpflichten.

Interessiert es Sie oder die Verbraucher der Klasse wirklich, ob sich die Kapazität verdoppelt, nach einem oder in Schritten von tausend Schritten inschreitet? In diesem Fall sollten Sie die Schnittstelle so ändern, dass sie die Strategie zur Erhöhung der Kapazität angeben können:

public Stack<T>(CapacityGrowthStyle capacityGrowthStyle) { ... }

Wenn nicht, schreiben Sie einfach Tests, um die Kapazität zu dokumentieren und sie dabei zu lassen (wo X Im Folgenden finden Sie die Grenze Ihrer zugrunde liegenden Datenstruktur):

[Test]
public void Can_Handle_X_Items() { ... }

[Test]
[ExpectedException(typeof(InvalidOperationException))]
public void Cannot_Handle_More_Than_X_Items() { ... }

Ich würde Ihre zweite Frage ähnlich beantworten: Ihre Tests sollten nur die zugrunde liegende Datenstruktur widerspiegeln, wenn sich die Benutzer Ihrer Klasse darum kümmern.

Ich bin mir nicht sicher, ob du sollte Testen Sie die interne Liste oder Array -Größe über einen Unit -Test, da Sie über die Stapelschnittstelle nicht darauf zugreifen können. Es gibt viele Möglichkeiten, einen Stapel, einige gute und einige schlechte implementieren, aber wie Bernard feststellte, sind dies interne Implementierungen. Unit -Tests sind so konzipiert, dass sie die nach außen gerichtete Funktionalität testen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top