Frage

Dieser Beitrag begann als "Was einige gemeinsame Muster in Unit-Tests Multi-Threaded-Code sind?", Aber ich fand einige andere Diskussionen auf, so dass allgemein anerkannt, dass „es schwierig ist, (TM)“ und „Es kommt (TM)“. So dachte ich, dass sie den Umfang der Frage zu reduzieren wäre nützlicher.

Hintergrund : Wir sind einen einfachen Scheduler implementieren, gibt Ihnen die Möglichkeit Rückrufe zu registrieren, wenn das Starten und Stoppen Arbeitsplätze und natürlich die Häufigkeit der Zeitplanung konfigurieren. Derzeit sind wir ein leichtes Wrapper um java.util.Timer zu machen.

Aspekte :

  • Ich habe keine Möglichkeit zu testen, diese Scheduler, indem sie sich auf nur öffentliche Schnittstellen (so etwas wie addJob(jobSchedule, jobArgs,jobListener), removeJob(jobId)) gefunden.

  • Wie Mal, wenn ich die Tatsache, dass der der Auftrag genannt wurde gemäß dem Zeitplan angegeben?

War es hilfreich?

Lösung

könnten Sie ein Recorder-Objekt verwenden , dass die Aufzeichnung der Reihenfolge, Timings und andere nützliche Dinge in jeder Einheit Test Ihres Scheduler. Der Test ist einfach:

  1. erstellen Recorder-Objekt
  2. konfigurieren Sie den Zeitplan
  3. Ausführen einer Unit-Test
  4. überprüfen Sie die Recorder-Objekt ist „kompatibel“ mit dem Zeitplan

Andere Tipps

Eine Sache, auch daran zu erinnern ist, dass Sie nicht brauchen, um zu testen, dass Timer funktioniert. Sie können eine Mock-Version von Timer (durch die Klasse erweitern oder mit EasyMock ) schreiben, die einfach, dass Sie überprüfen ersetzen richtig, nennt es vielleicht sogar genug, dass man überhaupt nicht über Gewinde benötigen. In diesem Fall, die benötigt möglicherweise mehr Arbeit, als wenn Ihr Job Zuhörer genug Rückrufe hat den Scheduler zu verfolgen.

Die andere wichtige Sache zu erinnern ist, dass, wenn der Scheduler testen, benutzerdefinierte Aufträge verwenden, die verfolgen, wie der Planer arbeiten; wenn geplante Aufträge zu testen, rufen Sie die Rückrufe direkt und nicht über den Scheduler. Sie können einen höheren Integrationstest, die beide zusammen überprüft, je nach System.

Es gibt viele Fehlerarten, die eine solche Scheduler aufweisen könnte, und jeder würde höchstwahrscheinlich einen eigenen Testfall erfordern. Diese Testfälle werden wahrscheinlich sehr unterschiedlich sein, so „es kommt.“

Für allgemein gleichzeitige Software in Java testen, empfehle ich diese Präsentation von JavaOne 2007: Testing Concurrent Software .

Für die Prüfung, die ein Planer Jobs in genau entsprechend ihren Zeitplan ausgeführt werden muß, würde ich eine Abstraktion der Zeit selbst erstellen. Ich habe etwas Ähnliches in einem meiner Projekte getan, wo ich eine Zeit oder Clock-Schnittstelle verfügen. Die Standardimplementierung wird MillisecondTime, aber während des Tests werde ich es das Gerät, mit einem Ticker. Diese Implementierung wird mein Unit-Test zur Kontrolle ermöglichen, wenn die Zeit um und um wie viel.

Auf diese Weise können Sie einen Test schreiben, wo ein Job einmal Zecke alle 10 Ausführung geplant ist. Dann wird Ihr Test geht nur den Tickzähler und überprüft, um sicherzustellen, dass die Arbeitsplätze an den richtigen Ticks ausgeführt werden.

Ein paar Möglichkeiten, gleichzeitig Code zu testen.

  • den gleichen Code oft unter Last laufen, erscheinen einige Fehler nur gelegentlich, aber konsistent angezeigt, wenn wiederholt durchgeführt.
  • Speichern Sie die Ergebnisse von verschiedenen Threads / Arbeitsplätze in einer Sammlung wie ein Blocking. Dies ermöglicht es Ihnen, die Ergebnisse in dem aktuellen Thread und Ziel in angemessener Zeit zu überprüfen (ohne hässliche willkürlichen Schlaf-Anweisungen)

Wenn Sie mit dem Testen Gleichzeitigkeit zu finden sind schwierig, Ihre Objekte Refactoring / components sie leichter zu testen, zu machen.

Wenn der Scheduler die Delegierten zu einem Executor oder ExecutorService die Aufgaben auszuführen, können Sie Dependency Injection verwenden, um eine direkte Abhängigkeit von der Art der Executor zu entfernen, und einen einfachen Single-Threaded Executor verwendet einen Großteil der Funktionalität des Schedulers ohne die Komplikation der wirklich mit mehreren Threads zu testen Code. Sobald Sie würden bekam, diese Tests debuggt Sie auf die je härter bewegen konnte, aber jetzt im Wesentlichen in der Größe reduziert, Aufgabe des Testens Thread-Sicherheit.

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