Wie kann festgestellt werden, ob eine vorhandene Klasse einem Unit-Test unterzogen werden kann?

8

Kürzlich übernahm ich den Besitz von C ++ - Code. Ich werde diesen Code beibehalten und später neue Funktionen hinzufügen. Ich weiß, dass viele Leute sagen, dass es sich normalerweise nicht lohnt, Unit-Tests zu existierendem Code hinzuzufügen, aber ich möchte trotzdem einige Tests hinzufügen, die den Code zumindest teilweise abdecken. Insbesondere möchte ich Tests hinzufügen, die Bugs reproduzieren, die ich behoben habe.

Einige der Klassen sind mit ziemlich komplexen Zuständen aufgebaut, was das Testen von Einheiten erschweren kann.

Ich bin auch bereit, den Code umzuformulieren, um den Test zu erleichtern.

Gibt es einen guten Artikel, den Sie zu Richtlinien empfehlen, die helfen, Klassen zu identifizieren, die einfacher zu testen sind? Hast du einen eigenen Ratschlag?

    
zr. 25.01.2011, 16:24
quelle

6 Antworten

6

Während Martin Fowlers Buch über Refactoring eine Fundgrube an Informationen ist, werfen Sie doch einen Blick auf Effektives Arbeiten mit Legacy-Code . "

Wenn Sie sich auch mit Klassen befassen, in denen es eine Menge globaler Variablen oder riesige Mengen an Zustandsübergängen gibt, würde ich eine Menge Integrationschecks durchführen. Trennen Sie so viel von dem Code, der mit dem umzuformenden Code interagiert, um sicherzustellen, dass alle erwarteten Eingaben in der Reihenfolge, in der sie empfangen werden, weiterhin die gleichen Ausgaben erzeugen. Dies ist sehr wichtig, da es sehr einfach ist, einen subtilen Fehler zu beheben, der möglicherweise anderswo behoben wurde.

Machen Sie sich auch Notizen. Wenn Sie feststellen, dass ein Fehler vorliegt, den eine andere Funktion / Klasse erwartet und richtig handhabt, sollten Sie beide gleichzeitig ändern. Das ist schwierig, wenn Sie keine gründlichen Aufzeichnungen führen.

    
wheaties 25.01.2011, 16:33
quelle
1

Vermutlich wurde der Code für einen Zweck geschrieben, und ein Komponententest prüft, ob der Zweck erfüllt ist, d. h. die Vorbedingungen und Nachbedingungen für die Methoden.

Wenn die Methoden der öffentlichen Klasse so beschaffen sind, dass Sie den Status extern überprüfen können, können Sie die Einheit problemlos testen (Black-Box-Test). Wenn der Klassenstatus nicht sichtbar ist oder Sie schwierige private Methoden testen müssen, muss Ihre Testklasse möglicherweise ein Freund sein (White-Box-Test).

Eine Klasse, die schwer zu testen ist, wird eine

sein
  • Hat enorme Abhängigkeiten, d. h. eng gekoppelt
  • Soll in einer Umgebung mit hohem Volumen oder mehreren Threads arbeiten. Dort würden Sie eher einen Systemtest als einen Komponententest verwenden und die tatsächliche Ausgabe ist möglicherweise nicht vollständig bestimmt.
CashCow 25.01.2011 16:37
quelle
1

Ich habe eine ganze Reihe von Blog-Posts über Unit-Testing, nicht-trivialen C ++ - Code geschrieben: Ссылка

Ich habe auch eine ganze Menge darüber geschrieben, Tests zu bestehendem Code hinzuzufügen: Ссылка

    
Len Holgate 25.01.2011 16:48
quelle
0

Fast alles kann und sollte getestet werden. Wenn nicht direkt, dann mit Scheinklassen.

Da Sie sich entschieden haben, Ihre Klassen umzuformen, versuchen Sie BDD oder TDD zu verwenden.

Um zu verhindern, dass bestehende Funktionen zerstört werden, gibt es nur gute Integrationstests, aber normalerweise dauert es einige Zeit, sie alle für ein komplexes System auszuführen.

Ohne weitere Details zu dem, was Sie tun, ist es nicht so einfach, weitere Implementierungsdetails anzugeben. Einige sind:

  • Verwenden Sie MVP oder Presenter zuerst für die Entwicklung von GUI
  • Verwenden Sie gegebenenfalls Entwurfsmuster
  • Verwenden Sie die Funktions- und Elementzeiger oder das Beobachterentwurfsmuster, um Abhängigkeiten aufzubrechen
BЈовић 25.01.2011 17:08
quelle
0

Ich denke, wenn Sie etwas "messen" müssen, um zu testen, ob eine Klasse testbar ist, sind Sie bereits fertig. Sie sollten in der Lage sein, es zu erkennen, indem Sie es betrachten: Können Sie ein unabhängiges Programm schreiben, das nur auf diese Klasse verweist und sicherstellt, dass es funktioniert?

Wenn eine Klasse zu groß ist, so dass Sie nicht sicher sein können, nur indem Sie sie betrachten ... Chancen sind wahrscheinlich nicht prüfbar. Leute, die nicht wissen, wie man kleine, unterschiedliche Schnittstellen herstellt, wissen im Allgemeinen nicht, wie man sich an andere Prinzipien hält.

Am Ende ist es jedoch möglich herauszufinden, ob eine Klasse testbar ist, indem Sie versuchen, sie in ein Kabelbaum einzubauen. Wenn Sie am Ende die Hälfte Ihres Programms einholen müssen, versuchen Sie es mit einem Refactoring. Wenn Sie feststellen, dass Sie nicht einmal den grundlegendsten Refactor ausführen können, ohne das gesamte Programm neu schreiben zu müssen, analysieren Sie die Kosten dafür.

    
Crazy Eddie 25.01.2011 17:22
quelle
0

Wir von IPL haben ein Papier veröffentlicht Es testet Jim, aber nicht so, wie wir es kennen , was die praktischen Probleme untersucht C ++ zu testen und schlägt einige Techniken vor, um sie zu adressieren, die bei Ihrer Frage nützlich sein könnten. Diese Techniken werden auch in Cantata ++ - unserem C / C ++ Unit- und Integrationstest-Tool - gut unterstützt.

    
Richard 31.01.2011 11:32
quelle