Ideen und Tipps für zeitliches Unit-Testing?

8

Hat jemand vorübergehende Unit-Tests durchgeführt?

Ich bin mir nicht einmal sicher, ob ein solcher Jargon geprägt wurde oder nicht, aber es geht darum, zu testen, dass Operationen innerhalb von zeitlichen Grenzen ablaufen. Ich habe ein paar Algorithmen und ich möchte testen, dass ihre Ausführungszeit wie erwartet zunimmt, und ich denke, ähnliche Tests könnten für IO verwendet werden, und was nicht, irgendwie wie test_timeout oder so etwas.

Da die Hardware jedoch die Ausführungsgeschwindigkeit beeinflusst, erscheint sie nicht trivial. Also habe ich mich gefragt, ob jemand schon einmal so etwas probiert hat und ob sie ihre Erfahrung teilen könnten.

Danke

Bearbeiten: Versuchen Sie, eine Liste von Dingen zusammenzustellen, die in dieser Situation behandelt werden müssen

    
Robert Gould 27.01.2009, 12:04
quelle

5 Antworten

7

Nur einige Notizen aus meiner Erfahrung ... Wir kümmern uns um die Leistung vieler unserer Komponenten und haben einen sehr uneinheitlichen Rahmen, um sie zu trainieren und zeitlich zu bestimmen (im Nachhinein hätten wir nur CppUnit oder% co_de verwenden sollen) % wie wir es für Unittests machen). Wir bezeichnen diese "Komponenten-Benchmarks" eher als Unittests.

  • Wir geben keine Obergrenze für die Zeit an und dann pass / fail ... wir protokollieren nur die Zeiten (dies hängt teilweise mit der Zurückhaltung der Kunden zusammen, harte Leistungsanforderungen zu stellen, obwohl die Leistung etwas ist, was ihnen wichtig ist Menge!). (Wir haben in der Vergangenheit versucht, Pass / Fail zu machen und hatten eine schlechte Erfahrung, besonders auf Entwicklermaschinen ... zu viele Fehlalarme, weil eine E-Mail angekommen war oder etwas im Hintergrund indexierte)
  • Entwickler, die an der Optimierung arbeiten, können einfach daran arbeiten, die relevanten Benchmark-Zeiten zu reduzieren, ohne ein ganzes System aufbauen zu müssen (ähnlich wie bei Unit-Tests man sich auf ein Bit der Codebasis konzentrieren kann).
  • Die meisten Benchmarks testen mehrere Iterationen von etwas. Lazy Erstellung von Ressourcen kann bedeuten, dass die erste Verwendung einer Komponente erheblich mehr "Setup-Zeit" zugeordnet werden kann. Wir loggen "1st", "durchschnittliche Folgezeit" und "durchschnittliche Zeit" aus. Stellen Sie sicher, dass Sie die Ursache für signifikante Unterschiede zwischen diesen verstehen. In einigen Fällen vergleichen wir Setup-Zeiten explizit im Einzelfall.
  • Sollte offensichtlich sein, aber: nur die Zeit, die Sie eigentlich interessieren, nicht die Setup-Zeit der Testumgebung!
  • Bei Benchmarks werden am Ende "echte" Fälle häufiger getestet als bei Unittests, so dass Test-Setup und Testlaufzeiten in der Regel ein Los sind.
  • Wir haben eine Autotestmaschine, die alle Benchmarks allabendlich ausführt und ein Protokoll aller Ergebnisse veröffentlicht. In der Theorie könnten wir es grafisch darstellen oder es Flag-Komponenten haben, die die Ziel-Performance unterschritten haben. In der Praxis haben wir es nicht geschafft, etwas Ähnliches aufzustellen.
  • Sie möchten, dass ein solcher Autotest-Computer völlig frei von anderen Aufgaben ist (z. B. wenn es auch Ihr SVN-Server ist, wird jemand, der einen großen Checkout macht, so aussehen, als ob Sie eine gewaltige Leistungsregression gehabt hätten).
  • Denken Sie über andere skalare Größen nach, die Sie möglicherweise zusätzlich zur Zeit messen möchten, und planen Sie, diese von Anfang an zu unterstützen. Zum Beispiel, "Kompressionsrate erreicht", "Skynet AI IQ" ...
  • Lassen Sie die Leute keine Analyse von Benchmark-Daten auf Sub-Minimum-Spec-Hardware durchführen. Ich habe Zeit gesehen, die wegen einer Designentscheidung verschwendet wurde, die als Ergebnis eines Benchmarklaufs auf jemandes Schrott gemacht wurde, wenn ein Lauf auf der Zielplattform - ein High-End-Server - etwas völlig anderes angezeigt hätte!
timday 27.01.2009, 13:59
quelle
2

Das engste, was ich darüber weiß, dass in eingebaut ist, ist zeitgesteuerte Tests , die in JUnit 4 hinzugefügt wurden. Dies könnte verwendet werden, um sicherzustellen, dass die Leistung eines Algorithmus nicht abnimmt, wenn die Eingabegröße zunimmt.

    
Bill the Lizard 27.01.2009 13:00
quelle
1

Wenn Sie überprüfen möchten, ob die Zeit zunimmt, sollte die Hardware verschiedener Maschinen keine Rolle spielen, wenn Sie nicht nach absoluten Werten suchen, sondern nach relativen Änderungen. Oder verpasse ich hier etwas?

    
Fabian Steeg 27.01.2009 12:12
quelle
1

Ich denke, Sie könnten Regressionstests für die Laufzeiten von Einheitentests durchführen. Bei vielen Unit-Test-Frameworks erhalten Sie in der Regel einen Report, der testname, executiontime angibt. Ich weiß, dass Junit / Surefire es tut. Im Grunde können Sie dies mit früheren Läufen vergleichen und feststellen, ob signifikante Änderungen stattgefunden haben. Wenn Sie dies alles in einer Datenbank (mit dem Hostnamen) beibehalten, können Sie die Ausführungszeiten für die gleiche Laufzeitumgebung mit früheren Testläufen vergleichen. Auf diese Weise schreiben Sie nicht wirklich Tests für die Leistung aber Sie behaupten nur separat, dass es keine wesentlichen Änderungen in der Ausführungszeit gab.

    
krosenvold 27.01.2009 12:33
quelle
0

Wenn Sie in C ++ arbeiten, schauen Sie sich Ссылка

an

Ich habe die Zeit nicht benutzt, aber es ist der beste (kompakteste) Unit-Test-Framework, den ich gefunden habe.

    
Patrick 27.01.2009 14:10
quelle

Tags und Links