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

Inhalt



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. 
Test-Methode
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


WorkflowApplication erstellen
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)
}
Extension in Aktivität verwenden
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:

  1. Bauen Sie das Einstellungsobjekt zusammen
  2. Erstellen Sie eine Variable vom Typ WmsSettingValue, mit dem Identifier Ihrer Einstellung und dem serialisierten Wert des Einstellungsobjekts
  3. Ü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.


Test für Aktivität mit Einstellung
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)
}
Setting-Klasse testen
[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));
}