Ist es in Ordnung, das Testen von Basisklassen zu vermeiden?

15

Ich habe eine Basisklasse mit einer Menge "Meta-Programmierung", um ihr die Flexibilität / Abstraktion zu geben, die sie braucht, um eher allgemein zu sein.

Ich habe viele Unterklassen, die die in der Basisklasse üblichen Methoden verwenden, und ich habe verhaltensorientierte Komponententests, die alle Fälle in jeder Unterklasse abdecken.

Ist es in Ordnung, das Testen der Basisklasse zu überspringen?

Nathan
quelle
1
Eine Sache, die ich manchmal tue, wenn ich mich diese Frage stelle, ist, den Code zu knacken. Wirf ungültige Eingaben darauf,
gib

Antworten:

31

Um zu überprüfen, ob Sie über genügend Tests verfügen oder nicht, können Sie Ihre Codeabdeckung und die durch die Tests hervorgerufene Zweigabdeckung überprüfen (möglicherweise mithilfe eines Abdeckungswerkzeugs, möglicherweise manuell durch Überprüfen der Codepfade oder mithilfe eines Debuggers).

Wenn Sie zu dem Schluss kommen, dass die Tests für die Unterklassen eine ausreichende Abdeckung für den Code Ihrer Basisklassen bieten, wird das Hinzufügen weiterer Tests Ihnen offensichtlich keinen großen Nutzen bringen. Wenn es Codepfade gibt, die Sie nur testen können, indem Sie bestimmte Tests direkt mit der Basisklasse hinzufügen, sollten Sie diesen Weg einschlagen.

Ein weiterer möglicher Grund für das "direkte Testen Ihrer Basisklasse" besteht darin, dass Sie eine bestimmte Funktion dieser Klasse "isoliert" testen möchten. Manchmal ist es einfacher, Testfälle direkt für eine bestimmte Methode zu entwerfen, als diese Methode nur indirekt zu testen, indem Sie die Methoden Ihrer Unterklassen aufrufen, die diese Methode verwenden.

Beachten Sie , dass Ihre Basisklasse wahrscheinlich abstrakt ist , wenn Sie eine generische Basisklasse haben, für die das typische Verwendungsszenario darin besteht , eine Unterklasse abzuleiten. Zum Testen einer solchen Klasse müssen Sie also trotzdem eine Ableitung vornehmen. In diesem Fall könnte das Testen "der Basisklasse direkt" natürlich bedeuten, eine spezielle Ableitung nur zu Testzwecken hinzuzufügen.

Doc Brown
quelle
Ja, ich bin mit direkten Unit-Tests der Basisklasse für die konkreten Methoden einverstanden. Was ich nicht tun wollte, ist, die gesamte Metaprogrammierung zu testen, da die Unit-Tests für die Unterklassen dieses Zeug implizit testen.
Nathan
4
Das Entwerfen einer Klasse, die die Basis- / abstrakte Klasse erweitert, die nur im Testverzeichnis vorhanden ist und nur dazu dient, die Basisklasse verfügbar zu machen / zu instanziieren, ist ein absolut legitimer und vernünftiger Ansatz, um eine angemessene Abdeckung der Basisklasse zu erhalten und sicherzustellen, dass die zugrunde liegenden Methoden vorhanden sind isoliert von den komplexeren Klassen, die verwendet werden, korrekt arbeiten.
@ MichaelT: Ja. Klingt meine Antwort so, als hätte ich eine andere Meinung dazu?
Doc Brown
@ DocBrown überhaupt nicht - Sie haben diesen Punkt klar artikuliert. Ich habe nur eine zusätzliche Erklärung hinzugefügt, die ich in meiner eigenen Antwort geschrieben hätte (wenn Sie das nicht bereits angegeben hätten). Ich möchte keine Antwort schreiben, die begonnen hätte "Ich stimme mit allem überein, was Doc gesagt hat, aber ich möchte speziell anrufen und mehr darüber schreiben ..."
2

Automatisierte Tests wurden zum Nutzen der Programmierer erstellt, Programmierer wurden nicht für die Tests erstellt.

Wir haben Tests, die uns produktiver machen und die Zahl der Kunden, über die sich „Probleme“ beschweren, verringern sollen.

Wenn Sie also verhaltensorientierte Komponententests haben, die alle Fälle in jeder Unterklasse abdecken, hat dies keinen Vorteil für den Kunden, der auch die Basisklasse direkt testet. Dies kann bestätigt werden, indem ein Code in der Basisklasse geändert wird und überprüft wird, ob ein Test fehlschlägt, z. (Nur zu überprüfen, ob jede Codezeile von den Tests abgedeckt wird, ist nicht gut genug.)

Wir werden uns dann fragen, ob der Test Sie produktiver machen würde . Dies kann auf verschiedene Arten geschehen.

  • Es ist in diesem Fall unwahrscheinlich, dass Sie klarer über den Code nachdenken, da der Code bereits geschrieben ist.
  • Sie können Code in der Basisklasse isoliert testen. Debuggen Sie ihn also schneller, was wiederum unwahrscheinlich ist, da der Code bereits funktioniert.
  • Sie können den Code in der Basisklasse ändern, ohne die Details der Logik in den Unterklassen verstehen zu müssen - möglicherweise, wenn Sie den Code überarbeiten?

Angesichts der Tatsache, dass die Unterklassen funktionieren, sehe ich keinen Grund darin, direkte Tests für die Basisklasse zu schreiben. Es ist heutzutage nicht so, dass es nicht vorteilhaft gewesen wäre, diese Tests zu einem frühen Zeitpunkt zu schreiben.

Ian
quelle