Dies ist zum Teil ein Follow-up zu diese Frage .
Ich bin nicht sicher, der beste Weg, dies zu fragen, also werde ich eine kurze Geschichte versuchen, die Szene zu setzen:
Es war einmal eine Klasse "A", die eine Einheitstestklasse "ATests" hatte, die dafür verantwortlich war, ihr Verhalten über die öffentliche Schnittstelle zu testen. Sie lebten eine Weile glücklich zusammen und dann passierte eine Veränderung, und die Klasse "B" kam, die, wie sich herausstellte, viel mit der Klasse "A" gemeinsam hatte, sodass eine Basisklasse eingeführt wurde.
Das öffentliche Verhalten der Basisklasse ist bereits durch die Tests für Klasse A abgedeckt. Es stellt sich also die Frage, was als nächstes passiert?
• Muss Klasse B Tests für das gemeinsame (Basisklassenverhalten) haben? Es scheint, dass das Verhalten ein Teil von B ist, also sollte es getestet werden, aber sollten diese Tests mit denen für Klasse A geteilt werden? Für die Basisklasse? Wenn ja, was ist der beste Weg zu teilen?
• Benötigt die neue Basisklasse Unit-Tests oder ist es in Ordnung, dass Basisklassen durch die Tests ihrer Kinder getestet werden? Ist es wichtig, ob die Basisklasse abstrakt ist?
• Reicht es aus, dass die Klassen A & amp; B leitet sich von der Basisklasse ab und "traue" die Unit-Tests für die Basisklasse, um das allgemeine Verhalten zu testen (damit die Tests nicht in den untergeordneten Klassen repliziert werden müssen)? Die Tests für A & amp; B muss nur testen, ob es sich um ein neues / geändertes Verhalten handelt?
• Verfolge ich den falschen Ansatz mit ungefähr einer Testklasse pro Realklasse?
Ich habe verschiedene Ansichten zu verschiedenen Zeiten genommen und die verschiedenen Ansätze können einen großen Einfluss auf die Fähigkeit haben, den Code umzuformen, Zeit für das Schreiben von Tests usw. Welche Ansätze haben Leute am besten gefunden?
Sie können Code Coverage Tools betrachten; Sie können Ihnen zeigen, ob Sie tatsächlich den gesamten Code testen. Persönlich, wenn ich einen Test habe, der das Verhalten der Basisklasse abdeckt und ich das nicht überschreibe, werde ich es nicht erneut testen. Das Ziel ist, eine Codeänderung (möglicherweise) nur einen Test zu brechen.
Fühlen Sie sich nicht gezwungen, bei einer Einheitstestklasse pro echter Klasse zu bleiben. Eine Unit-Test-Klasse pro einmaligem Einrichtungs-Fixture ist ein Weg, und dann gibt es die ganze BDD -Schule ...
Persönlich tendiere ich dazu, alle drei (Basis und zwei abgeleitete) zu testen. Es zeigt, dass Sie nicht unbeabsichtigt die Basismethoden überschreiben und ihr Verhalten ändern, und Ihre geerbte Klasse weiterhin die erwartete Semantik bereitstellt. Wenn sich das Verhalten nicht wirklich ändert, könnte es so einfach wie ein Copy-Paste-Job sein, aber es bietet eine vollständigere Abdeckung.
Beachten Sie jedoch den Teil "gegebene Zeit". Wenn Zeit ein Problem ist (und es immer ist), würde das Testen der Basisklasse oder der vererbten Funktionalität wahrscheinlich eine niedrigere Priorität haben. Aber das Testen ist eine großartige Impfung gegen sich selbst und macht Sie beim späteren Refactoring sehr viel sicherer, so dass Sie sich selbst, Ihre Kunden und / oder Ihre Betreuer nur kurzschließen, indem Sie nicht so vollständig abdecken, wie Sie Zeit haben.
Es ist jedoch völlig in Ordnung, wenn Sie solche Dinge auf dedizierte Tester oder ein QA-Team verpfänden, wenn Sie einen haben. Aber kauf ihnen mal ein Bier :-) Sie lassen dich besser aussehen!
Der Refactoring-Testcode ist genauso wichtig wie das Refactoring des Produktionscodes. Beide sollten als erstklassige Bürger behandelt werden. Wenn Sie also öffentliche Methoden in die Basisklasse extrahieren, sollte dies eigene Tests enthalten. Wenn Ihre Testfälle richtig ausgelegt sind, wo jeder Test jeweils eine Prüfung durchführt, sollte das Test-Refactoring einfach sein.
Wenn Sie geschützte Funktionalität extrahieren, dann ist es wahrscheinlich ein leicht grauer Bereich. Wenn Testmethoden für die Klasse neu sind, würde ich erwarten, dass sie in der abgeleiteten Klasse getestet werden, einfach weil sie wahrscheinlich dafür da sind, dass die abgeleitete Klasse richtig funktioniert. Im Idealfall sollte dies auf ein Minimum beschränkt werden, da die Basisklassenfunktionalität weniger offensichtlich wird.
Die abgeleiteten Klassen werden dann die verbleibenden öffentlichen Methoden in ihren eigenen Tests testen lassen.
Auch wenn Sie den Produktionscode und nicht die Tests ändern, sollten Sie ein Coverage-Tool integrieren, damit Sie sich sicher genug fühlen, dass Ihre Tests ausreichend abgedeckt sind.
Tags und Links unit-testing tdd