Frage

Ich suche allgemeine Gedanken und / oder Links zum Thema im Allgemeinen, obwohl meine spezifische Motivation zur Zeit UI Aufgaben im Zusammenhang Berichterstattung Fortschritte entweder Background und / oder TPL verwenden. Meine Erfahrung Ebene mit Asynchron-Programmierung im Allgemeinen ist Anfänger. Die Test-Tools Ich weiß am besten sind NUnit und Rhino.

Einige Gehirn Ideen aus der Spitze von meinem Kopf zu stürmen:

  1. Do not bother - es ist zu kompliziert, und Sie nur die BGW oder TPL aufzuwickeln testen.
  2. Erstellen Sie eine Art von Fälschung oder Mock.
  3. Verwenden Sie EventWaitHandles
War es hilfreich?

Lösung

Einheit asynchronen Code zu testen ist nicht die einfachste Sache der Welt, wie ich gelernt, als Einheit Schreiben von Tests für meinen Nito.Async Bibliothek. :)

Als erstes wollen Sie definieren, was Sie wirklich wollen, zu testen. Wollen Sie nur zu prüfen, ob die asynchrone Aktion durchgeführt wird, oder wollen Sie sicherstellen möchten, dass Ihre BGW / Aufgaben ordnungsgemäß ihre UI Fortschritt Berichterstattung synchronisieren?

Testen der Aktion ist ziemlich einfach: einfach warten, bis die Aktion abgeschlossen ist und dann für Nachbedingungen überprüfen. (Beachten Sie jedoch, dass die BGW RunWorkerCompleted wird auf einem ThreadPool Faden angehoben werden, wenn Sie es ein Synchronisationskontext wie im folgenden Beispiel geben).

Testen der richtige Synchronisation (beispielsweise, dass jedes Stück des Codes auf dem richtigen Thread ausgeführt wird) ist komplexer.

Für jeden Test müssen Sie einen Synchronisationskontext etablieren. Dadurch wird die UI Synchronisationskontext werden spöttisch. Meine Nito.Async Bibliothek, die helfen können; es hat einen ActionThread die einen separaten Thread ist, der eine Synchronisationskontext geeignet für den Besitz EAP-Komponenten (z.B. BGW) und Zeitplanungsaufgaben enthält (z.B. TaskScheduler.FromCurrentSynchronizationContext).

Es kann wie folgt verwendet werden (ein MSTest Beispiel verwendet wird):

[TestMethod]
public void Test()
{
  using (ActionThread thread = new ActionThread())
  {
    thread.Start();

    // Anything passed to Do is executed in that ActionThread.
    thread.Do(() =>
    {
      // Create BGW or call TaskScheduler.FromCurrentSynchronizationContext.
    });

    // The thread is gracefully exited at the end of the using block.
  }
}

Ich finde Thread.CurrentThread.ManagedThreadId und Thread.CurrentThread.IsThreadPoolThread die einfachsten Möglichkeiten, um für die richtige Synchronisation zu überprüfen. Wenn Ihr Testcode aus ActionThread.Do ausgeführt wird, dann sollte es seine Fortschritte Updates synchronisieren (und Vollendungsmeldung) zu diesem ActionThread.

Viele der Nito.Async Unit-Tests verwenden ActionThread auf diese Weise, so dass Sie für verschiedene Beispiele aussehen könnte es.

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