TL; DR
Gute, nützliche Tests zu schreiben ist schwierig und mit hohen Kosten in C ++ verbunden. Können Sie erfahrenen Entwicklern Ihre Überlegungen mitteilen, was und wann zu testen ist?
Lange Geschichte
Früher habe ich testgetrieben entwickelt, mein gesamtes Team, aber es hat bei uns nicht gut funktioniert. Wir haben viele Tests, aber sie scheinen nie die Fälle abzudecken, in denen wir tatsächliche Fehler und Rückschritte haben - die normalerweise auftreten, wenn Einheiten interagieren, und nicht aufgrund ihres isolierten Verhaltens.
Dies ist auf Geräteebene oft so schwierig zu testen, dass wir TDD eingestellt haben (mit Ausnahme von Komponenten, bei denen die Entwicklung wirklich beschleunigt wird) und stattdessen mehr Zeit investiert haben, um die Abdeckung der Integrationstests zu erhöhen. Während die kleinen Unit-Tests keine wirklichen Fehler auffingen und im Grunde nur Wartungsaufwand waren, haben sich die Integrationstests wirklich gelohnt.
Jetzt habe ich ein neues Projekt geerbt und frage mich, wie ich es testen soll. Da es sich um eine native C ++ / OpenGL-Anwendung handelt, kommen Integrationstests nicht in Frage. Unit-Tests in C ++ sind jedoch etwas schwieriger als in Java (Sie müssen explizit Dinge erstellen virtual
), und das Programm ist nicht stark objektorientiert, sodass ich einige Dinge nicht verspotten oder wegstupsen kann.
Ich möchte das Ganze nicht auseinandernehmen und nur ein paar Tests schreiben, um Tests schreiben zu können. Also frage ich dich: Wofür soll ich Tests schreiben? z.B:
- Funktionen / Klassen, die sich voraussichtlich häufig ändern?
- Funktionen / Klassen, die schwieriger manuell zu testen sind?
- Funktionen / Klassen, die bereits leicht zu testen sind?
Ich fing an, einige respektvolle C ++ - Codebasen zu untersuchen, um zu sehen, wie sie getestet werden. Im Moment befasse ich mich mit dem Chromium-Quellcode, aber es fällt mir schwer, die Testgründe aus dem Code zu extrahieren. Wenn jemand ein gutes Beispiel oder einen guten Beitrag dazu hat, wie beliebte C ++ - Benutzer (Leute vom Komitee, Buchautoren, Google, Facebook, Microsoft, ...) dies angehen, wäre das besonders hilfreich.
Aktualisieren
Ich habe mich auf dieser Site und im Web umgesehen, seit ich das geschrieben habe. Einige gute Sachen gefunden:
- Wann ist es angebracht, keinen Komponententest durchzuführen?
- /programming/109432/what-not-to-test-when-it-comes-to-unit-testing
- http://junit.sourceforge.net/doc/faq/faq.htm#best
Leider sind alle eher Java / C # -zentriert. Das Schreiben vieler Tests in Java / C # ist kein großes Problem, daher überwiegt der Nutzen in der Regel die Kosten.
Aber wie ich oben geschrieben habe, ist es schwieriger in C ++. Besonders wenn Ihre Codebasis nicht so gut ist, müssen Sie die Dinge ernsthaft durcheinander bringen, um eine gute Abdeckung durch Unit-Tests zu erhalten. Zum Beispiel: Die von mir geerbte Anwendung hat einen Graphics
Namensraum, der eine dünne Schicht über OpenGL ist. Um eine der Entitäten zu testen, die alle ihre Funktionen direkt verwenden, müsste ich diese in eine Schnittstelle und eine Klasse umwandeln und in alle Entitäten einfügen. Das ist nur ein Beispiel.
Denken Sie bei der Beantwortung dieser Frage bitte daran, dass ich für das Schreiben von Tests ziemlich viel Geld investieren muss.