Unit Test
Am einfachsten lässt sich die Ausführungslogik einer Aktivität in einem Unit Test überprüfen. Um einen UnitTest zu schreiben, ist ein eigenes Projekt nötig. Dieses Projekt ist nur für Sie gedacht, und soll nicht Teil der Auslieferung Ihrer Aktivität sein!
Wie man UnitTests erstellt, startet und debuggen kann, können Sie hier nachlesen:
https://docs.microsoft.com/de-de/visualstudio/test/unit-test-basics?view=vs-2019
Erstellen eines Tests-Projekts und einer Test-Klasse
Gehen Sie wie folgt vor, um eine Test-Umgebung aufzubauen:
- Erstellen Sie eine neue Unit Test-Klasse in Ihrem UnitTest-Projekt (siehe "(1) VisualStudio: Projekt(e) erstellen")
- Fügen Sie der Klasse eine Test-Methode hinzu
- Bauen Sie in dieser Test-Methode Ihre Aktivität zusammen.
using Microsoft.VisualStudio.TestTools.UnitTesting; using UnitTest.Bases; [TestMethod] public void TestHelloWorldActivity() { // TODO: Add test logic here }
Umgebung zur Workflow-Ausführung
Testen einer Aktivität
Workflow-Application
Verwenden Sie in Ihrem Test die Klasse Workflow-Application, um die Aktivität oder einen gesamten Workflow auszuführen. Die Workflow-Application verfügt über verschiedene Ereignisse, auf die Sie im Unit-Test reagieren können. Die wichtigsten sind Completed und OnUnhandledException.
Mit der Run-Methode wird die Aktivität asynchron gestartet, d.h. es wird nicht gewartet, bis die Aktivität abgeschlossen ist.
Synchrone Ausführung
Um das Ergebnis auswerten zu können muss der Unit-Test warten, bis die Aktivität abgeschlossen ist. Verwenden Sie dazu die Klasse AutoResetEvent.
Beispiel zur Verwendung des AutoResetEvents: http://dotnetpattern.com/threading-autoresetevent
Extensions
Extensions werden bei Starten eines Workflows von der Ausführungsumgebung hinzugefügt. Aktivitäten können diese Extensions nutzen, um auf Funktionalität oder Daten der Ausführungsumgebung zuzugreifen.
Achten Sie bei der Ausführung im UnitTest darauf, dass auch die Test-Umgebung eine Implementierung des Interfaces als Extension mitgeben muss, um die Aktivität zu testen.
Details
Weitere Anwendungsfälle und Beispiele zum Testen von Aktivitäten finden Sie hier: Unit Test - Beispiele zu komplexen Objekten und Aktivitäten
using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Activities; using UnitTest.Bases; [TestMethod] public void TestHelloWorldActivity() { //Aktivität mit Argumenten zusammenbauen HelloWorldActivity activity = new HelloWorldActivity(); AutoResetEvent syncEvent = new AutoResetEvent(false); //Ausführungsumgebung für die Aktivität WorkflowApplication wfApp = new WorkflowApplication(activity); //Extension hinzufügen, die von Aktivitäten benötigt werden wfApp.Extensions.Add<IWmsApiExtension>(() => new TestInterfaceImpl()); //Sobald der Workflow abgeschlossen ist, wartenden Thread fortsetzen wfApp.Completed = args => { syncEvent.Set(); }; //Asynchrone Verarbeitung starten wfApp.Run(); //Thread wartet, bis Set aufgerufen wurde (maximal 5 Sekunden). syncEvent.WaitOne(5000) }
protected override void Execute(CodeActivityContext context) { //Extension ermitteln, z.B. ein Interface aus der WmsActivityContracts.dll var extension = context.GetExtension<IWmsApiExtension>(); //Methoden des interface nutzen ... }
Testen einer WMS-Einstellung
Aktivität mit Einstellung starten
Aktivitäten, die auf eine WMS Einstellung zugreifen, benötigen diese auch im UnitTest. Gehen Sie wie folgt vor, um der Aktivität im UnitTest eine Einstellung zu übergeben:
- Bauen Sie das Einstellungsobjekt zusammen
- Erstellen Sie eine Variable vom Typ WmsSettingValue, mit dem Identifier Ihrer Einstellung und dem serialisierten Wert des Einstellungsobjekts
- Übergeben Sie der WorkflowApplication vor dem Starten eine WmsSettingsCollection als Extension mit.
Ein guter Test ist es auch, ihre Aktivität ohne Einstellung zu starten.
WmsActivitySetting-Klasse testen
Neben der Aktivität können Sie auch direkt ihre Einstellungsklassen testen.
using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Activities; using UnitTest.Bases; using Accantum.Wms.ActivityContracts.Settings; //using MyProject.MySetting; [TestMethod] public void TestActivityWithSetting() { //... Aktivität, AutoResetEvent, etc. zusammenbauen, siehe vorherige Beispiele //(1) Ihr Einstellungsobjekt var mySettingData = new MySettingData { Username = "demo", ServiceUrl = "https://www.demo.de:8080" }; //(2) WmsSettingValue settingValue = new WmsSettingValue(MyActivitySetting.SettingId, settingData.Serialize()) //(3) Extension mit Liste der Einstellung vor dem Starten hinzufügen wfApp.Extensions.Add(new WmsSettingsCollection { settingValue }); //... Workflow wie im vorherigen Beispiel beschrieben starten (wfApp.Run) }
[TestMethod, TestCategory("ActivitySample")] public void TestSettingInitialization() { var oMySettingData = new MySettingData { Username = "demo", ServiceUrl = "https://www.demo.de:8080" }; //Setting-Klasse zusammenbauen und initialisieren (hier sollte keine Exception auftreten) var mySetting = new MyActivitySetting(); Assert.IsTrue(result.Initialise(oMySettingData.Serialize(), false)); } [TestMethod, TestCategory("ActivitySample")] public void TestSettingInitiationEmptySetting() { var result = new MyActivitySetting(); Assert.IsTrue(result.Initialise("", false)); }