Ich habe schon ein bisschen Erfahrung mit Unit-Tests in dem klassischen Software-Engineering-Projekt, das ich (nicht abschätzend) nenne, gesammelt: eine MVC mit einer Benutzer-GUI, einer Datenbank, einer Geschäftslogik in der mittleren Ebene usw. Ich schreibe eine wissenschaftliche Computer-Bibliothek in C # (Ja, ich weiß, dass C # zu langsam ist, benutze C, erfinde das Rad nicht neu und all das, aber wir haben eine Menge Leute, die wissenschaftliche Berechnungen in meiner Fakultät in C # durchführen.) und wir brauchen es irgendwie). Es ist ein kleines Projekt im Sinne der Softwareentwicklungsbranche, da ich es größtenteils selbst und von Zeit zu Zeit mit Hilfe einiger Kollegen schreibe. Außerdem werde ich dafür nicht bezahlt, und das Wichtigste ist, dass es sich um ein akademisches Projekt handelt. Ich meine, ich erwarte, dass es eines Tages professionelle Qualität hat, weil ich vorhabe, Open Source zu werden.
Wie auch immer, das Projekt wird immer umfangreicher (etwa 18.000 Codezeilen, die ich für Ein-Mann-Projekte halte) und gerät aus meinen Händen. Ich verwende Git für die Quellcodeverwaltung, und ich denke, ich habe alles in Ordnung, aber ich teste wie in der alten Schule und schreibe vollständige Konsolenanwendungen, die einen großen Teil des Systems testen, hauptsächlich, weil ich keine Ahnung habe, wie in diesem Szenario Unit-Tests durchführen, obwohl ich der Meinung bin, dass dies das ist, was ich tun sollte. Das Problem ist, dass die Bibliothek hauptsächlich Algorithmen enthält, zum Beispiel Graph-Algorithmen, Klassifikatoren, numerische Löser, Zufallsverteilungen usw. Ich weiß nur nicht, wie ich winzige Testfälle für jeden dieser Algorithmen spezifizieren soll, und da es sich bei vielen um solche handelt stochastisch Ich weiß nicht, wie ich die Richtigkeit überprüfen soll. Für die Klassifizierung sind zum Beispiel einige Metriken wie Präzision und Rückruf, Diese Metriken sind jedoch besser für den Vergleich zweier Algorithmen als für die Beurteilung eines einzelnen Algorithmus. Wie kann ich hier die Korrektheit definieren?
Schließlich gibt es auch das Leistungsproblem. Ich kenne eine ganze Reihe von Tests, aber die Leistung ist eines der wichtigsten Merkmale eines wissenschaftlichen Tools und nicht die Zufriedenheit der Benutzer oder andere Metriken der Softwareentwicklung.
Eines meiner größten Probleme ist mit Datenstrukturen. Der einzige Test, den ich für einen kd-Baum finden kann, ist ein Stresstest: viele zufällige Vektoren einfügen und dann viele zufällige Abfragen durchführen und mit einer naiven linearen Suche vergleichen. Das gleiche gilt für die Leistung. Und mit numerischen Optimierern habe ich Benchmark-Funktionen, die ich testen kann, aber auch dies ist ein Stresstest. Ich glaube nicht, dass diese Tests als Komponententests klassifiziert werden können, und vor allem, dass sie kontinuierlich durchgeführt werden, da die meisten von ihnen ziemlich schwer sind. Ich denke aber auch, dass diese Tests durchgeführt werden müssen. Ich kann nicht einfach zwei Elemente einfügen, die Wurzel platzieren und ja, es funktioniert für den Fall 0-1-n.
Was ist der (Einheiten-) Testansatz für diese Art von Software? Und wie organisiere ich die Unit-Tests und die Heavy-Tests im Code-Build-Commit-Integrate-Zyklus?