Unit-Tests / Benchmarks in Libraries
-
Hallo
Ich habe keine Erfahrung mit dem Schreiben von Bibliotheken, von Unit-Tests oder von Benchmarks. Bei meinen Programmen habe ich zur Laufzeit immer gesehen, ob sie funktionieren oder nicht. Zusätzlich habe ich den Code mit
assert(...)
vollgespickt, immer wenn ich den Eindruck hatte, dass ein gewisser Fall theoretisch unmöglich sein müsse. Die Assertions haben mir sehr geholfen, wenn ich doch mal Fehler (nicht Bugs, die nicht das korrekte Verhalten erzielen, sondern tatsächliche Fehler, die zu SIGSEGVs führen) in der Software hatte.
Nun möchte ich eine kleine Bibliothek schreiben, die erstmal von tatsächlichen Projekten komplett losgelöst ist. Natürlich möchte ich dafür sorgen, dass sie möglichst korrekt und fehlerfrei (Utopie) ist. Und weil ich in Bibliotheken wie Boost dauernd Unit-Tests und Benchmark-Code sehe, fragte ich mich natürlich, ob die tatsächlich so viel ausmachen.
Kann jemand ein bisschen Licht auf die Thematik werfen? Soll ich nun einfache cpp-Dateien schreiben, die eine main-Funktion enthalten und eine bestimmte hpp-Datei möglichst ausführlich testet und deren Performance misst? Soll ich das mit den Assertions dann lassen oder soll ich die weiterhin schreiben?
Es wäre besonders hilfreich, wenn jemand minimale Beispiele vorzeigen kann, wie man so etwas macht. Code ist eindeutiger als es Worte sind.Danke im Voraus
-
Niemand 'ne Idee?
-
so wie du deine Assertions verteils ist gut und solltest du weiter so machen - das sind so eine Art Absicherung unterhalb der Unit-Tests für Dinge die niemals passieren sollen - nur bei Programmierfehlern (nicht API-Nutzungsfehler)
für deine Unit-Tests und Benchmarks schreibst du einfach Tests die z.B. deine API Nutzen oder die internen Schnitstellen - Ich verstehe dein Problem nicht
-
Also ich nehme ganz gerne diese hier:
https://github.com/google/googletest/blob/master/googletest/docs/Primer.mdKann aber mangels Erfahrung mit anderen Bibliotheken (außer Java&TestNG) nicht viel dazu sagen. Mein Gefühl ist allerdings, dass man sich noch so viele Spezialfälle ausdenken kann, der noch speziellere Spezialfall, der dann nicht funktioniert, ist dann natürlich nicht abgedeckt. Aber ansonsten finde ich Tests schon sehr hilfreich. Ich packe die Tests gerne in ein eigenes Verzeichnis "t", d.h. ich habe dann inc/, src/ und t/.
Ich teste hauptsächlich diejenigen Klassen, die ich in mehreren Projekten verwende (und wenn ich denke, dass es sich lohnt zu testen).
Nun sind die Dinge, die ich mache, in der Regel eher sehr klein/kurz. Ich finde: je größer ein Projekt, desto wichtiger die Tests.