Frage

Ich schreibe derzeit eine einfache, timerbasierte Mini-App in C#, die alle k Sekunden n-mal eine Aktion ausführt.
Ich versuche, einen testgetriebenen Entwicklungsstil zu übernehmen, daher ist es mein Ziel, alle Teile der App einem Unit-Test zu unterziehen.

Meine Frage lautet also:Gibt es eine gute Möglichkeit, eine Timer-basierte Klasse einem Unit-Test zu unterziehen?

Das Problem besteht aus meiner Sicht darin, dass die Gefahr groß ist, dass die Ausführung der Tests unangenehm lange dauert, da sie so und so lange warten müssen, bis die gewünschten Aktionen stattfinden.
Vor allem, wenn man realistische Daten (Sekunden) möchte, anstatt die minimale Zeitauflösung zu verwenden, die das Framework zulässt (1 ms?).
Ich verwende ein Scheinobjekt für die Aktion, um zu registrieren, wie oft die Aktion aufgerufen wurde, und damit die Aktion praktisch keine Zeit in Anspruch nimmt.

War es hilfreich?

Lösung

Was ich getan habe, ist, den Timer und auch die aktuelle Systemzeit zu verspotten, sodass meine Ereignisse sofort ausgelöst werden konnten, aber soweit es den zu testenden Code betraf, betrug die verstrichene Zeit Sekunden.

Andere Tipps

Ich denke, was ich in diesem Fall tun würde, wäre, den Code zu testen, der tatsächlich ausgeführt wird, wenn der Timer tickt, und nicht die gesamte Sequenz.Was Sie wirklich entscheiden müssen, ist, ob es sich für Sie lohnt, das tatsächliche Verhalten der Anwendung zu testen (z. B. ob sich das, was nach jedem Tick passiert, von einem Tick zum anderen drastisch ändert) oder ob es ausreichend ist (d. h , die Aktion ist jedes Mal die gleiche), um nur Ihre Logik zu testen.

Da sich das Verhalten des Timers garantiert nie ändert, funktioniert er entweder ordnungsgemäß (dh Sie haben ihn richtig konfiguriert) oder nicht.Es scheint vergebliche Mühe zu sein, dies in Ihren Test einzubeziehen, wenn Sie es nicht wirklich brauchen.

Ich stimme Danny insofern zu, als es aus Sicht des Unit-Tests wahrscheinlich sinnvoll ist, den Timer-Mechanismus einfach zu vergessen und einfach zu überprüfen, ob die Aktion selbst wie erwartet funktioniert.Ich würde auch sagen, dass ich insofern nicht der Meinung bin, dass es vergebliche Mühe ist, die Konfiguration des Timers in eine Art automatisierte Testsuite einzubinden.Bei der Arbeit mit Timing-Anwendungen gibt es viele Grenzfälle, und es ist sehr leicht, ein falsches Sicherheitsgefühl zu erzeugen, indem man nur die Dinge testet, die einfach zu testen sind.

Ich würde empfehlen, eine Reihe von Tests durchzuführen, die sowohl den Timer als auch die tatsächliche Aktion ausführen.Die Ausführung dieser Suite wird wahrscheinlich eine Weile dauern und Sie würden sie wahrscheinlich nicht ständig auf Ihrem lokalen Computer ausführen.Aber die Einrichtung solcher Dinge in einem nächtlichen automatisierten Build kann wirklich dabei helfen, Fehler auszumerzen, bevor sie zu schwer zu finden und zu beheben sind.

Kurz gesagt, meine Antwort auf Ihre Frage lautet: Machen Sie sich keine Sorgen darüber, ein paar Tests zu schreiben, deren Ausführung lange dauert.Führen Sie Unit-Tests durch, so viel Sie können, und sorgen Sie dafür, dass diese Testsuite schnell und häufig ausgeführt wird. Ergänzen Sie dies jedoch durch Integrationstests, die weniger häufig ausgeführt werden, aber einen größeren Teil der Anwendung und ihrer Konfiguration abdecken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top