In einem Projekt mit nichtfunktionalen Anforderungen, in denen die maximale Ausführungszeit für eine bestimmte Aktion festgelegt ist, muss die Qualitätssicherung die Leistung dieser Aktion auf einer dedizierten Maschine unter Verwendung präziser Hardware unter genauer Last überprüfen, wobei sowohl die Hardware als auch die Last in den Anforderungen angegeben sind.
Andererseits können einige fehlerhafte Änderungen am Quellcode die Leistung erheblich beeinträchtigen. Das frühzeitige Erkennen dieser negativen Auswirkungen , bevor der Quellcode die Quellcodeverwaltung erreicht und von der QA-Abteilung überprüft wird, kann sich positiv auf den Zeitverlust auswirken , den die QA-Abteilung, die das Problem meldet, und der Entwickler, der es mehrere Male später behebt, auswirken .
Ist es eine gute Idee, dies zu tun:
Unit-Tests verwenden, um eine Vorstellung von der Zeit zu erhalten, die für die n- fache Ausführung derselben Aktion aufgewendet wurde.
So verwenden Sie das Zeitlimit pro Test über das
[TestMethod, Timeout(200)]
Attribut in C #
Ich erwarte einige Probleme mit diesem Ansatz:
Konzeptionell sind Unit-Tests nicht wirklich dafür: Sie sollen einen kleinen Teil eines Codes testen, nicht mehr: weder die Überprüfung einer Funktionsanforderung, noch einen Integrationstest oder einen Leistungstest.
Misst das Zeitlimit für Komponententests in Visual Studio wirklich, was gemessen werden soll, wobei zu berücksichtigen ist, dass Initialisierung und Bereinigung für diese Tests nicht vorhanden sind oder zu kurz sind, um die Ergebnisse zu beeinflussen?
Das Messen der Leistung auf diese Weise ist hässlich. Das Ausführen eines Benchmarks auf einem beliebigen Computer¹ unabhängig von Hardware, Last usw. entspricht einem Benchmark , der zeigt, dass ein Datenbankprodukt immer schneller ist als ein anderes. Andererseits erwarte ich nicht, dass diese Unit-Tests ein definitives Ergebnis sind oder von der QS-Abteilung verwendet werden . Diese Komponententests dienen lediglich dazu, eine allgemeine Vorstellung von der erwarteten Leistung zu vermitteln und den Entwickler darauf aufmerksam zu machen, dass bei seiner letzten Änderung etwas kaputt gegangen ist, was die Leistung erheblich beeinträchtigt .
Test Driven Development (TDD) ist für diese Tests nicht möglich. Wie würde es an erster Stelle scheitern, bevor mit der Implementierung von Code begonnen wird?
Zu viele Leistungstests wirken sich auf die Zeit aus, die zum Ausführen der Tests erforderlich ist. Daher ist dieser Ansatz nur auf kurze Aktionen beschränkt.
Angesichts dieser Probleme finde ich es immer noch interessant, solche Komponententests zu verwenden, wenn sie mit den tatsächlichen Leistungskennzahlen der QA-Abteilung kombiniert werden.
Liege ich falsch? Gibt es noch andere Probleme, die die Verwendung von Komponententests für diesen Zweck völlig inakzeptabel machen?
Wenn ich mich irre, wie kann ich den Entwickler auf eine Änderung des Quellcodes aufmerksam machen, die die Leistung erheblich beeinträchtigt, bevor der Quellcode die Quellcodeverwaltung erreicht und von der QA-Abteilung überprüft wird?
¹ Tatsächlich wird erwartet, dass die Komponententests nur auf Entwickler-PCs mit vergleichbarer Hardwareleistung ausgeführt werden. Dies verringert die Lücke zwischen den schnellsten Computern, die den Leistungstest niemals bestehen werden, und den langsamsten Computern, die ihn niemals bestehen werden.
² Mit Aktion meine ich ein ziemlich kurzes Stück Code, dessen Ausführung einige Millisekunden in Anspruch nimmt.