Skapa enhetstester från standardarbetsflödesdefinitioner i Azure Logic Apps med Visual Studio Code

Gäller för: Azure Logic Apps (Standard)

Enhetstestning är en viktig metod som håller din app eller lösning tillförlitlig och korrekt under hela livscykeln för programvaruutveckling. Enhetstester hjälper dig att effektivt och systematiskt verifiera de viktigaste komponenterna i din lösning.

För standardarbetsflöden för logikappar kan du skapa enhetstester med hjälp av Visual Studio Code och Tillägget Azure Logic Apps (Standard). Med den här funktionen kan du använda arbetsflödesdefinitioner för att skapa enhetstester och skräddarsy dem efter scenarier som stöds av logikappslösningen – allt utan att behöva anslutningar till externa tjänster, system eller API:er. Med den här metoden kan du testa dina arbetsflöden utan att behöva interagera med externa tjänster, system eller API:er och ger följande fördelar:

  • Förbättra arbetsflödets kvalitet genom att identifiera och åtgärda potentiella problem innan du distribuerar till andra miljöer.

  • Effektivisera enhetstestintegrering med din utvecklingsprocess, samtidigt som du säkerställer konsekvent och korrekt arbetsflödesbeteende.

Den här guiden visar hur du skapar en enhetstestdefinition från ett arbetsflöde. Den här definitionen hånar de externa anropen från varje arbetsflödesåtgärd utan att ändra arbetsflödeslogik. När du skapar ett enhetstest för ett arbetsflöde får du ett enhetstestprojekt som innehåller följande mappar:

  • En mapp som innehåller starkt typade klasser för varje simulerbar operation i arbetsflödet.

  • En mapp för varje enhetstestdefinition. Den här mappen innehåller en C#-fil som innehåller en exempelklass och metoder. Du använder den här klassen och metoderna för att konfigurera egna intyg, bekräfta att arbetsflödet fungerar som förväntat och se till att arbetsflödet fungerar tillförlitligt och förutsägbart i ditt större Azure-ekosystem.

Förutsättningar

Begränsningar och kända problem

  • Den här versionen stöder för närvarande endast C# för att skapa enhetstester.

  • Den här versionen stöder inte icke-hånade åtgärder. Kontrollera att alla åtgärder i arbetsflödets utförandeväg är simulerade.

  • Den här versionen stöder inte följande åtgärdstyper:

    • Integreringskontoåtgärder
    • EDI-koda och avkoda processer

Granska de grundläggande begreppen

Följande lista innehåller grundläggande men viktiga begrepp om enhetstester för Standard-arbetsflöden:

  • Enhetstest för logikapp

    En kontrollerad arbetsflödeskörning som matar in falska objekt. Dessa objekt representerar antingen arbetsflödesutlösaren eller åtgärder som är beroende av externa tjänster eller system.

  • Åtgärd som kan simuleras

    En arbetsflödesåtgärd som är beroende av en extern tjänst eller ett externt system. Du kan konvertera dessa åtgärder till simulerade åtgärder för att skapa och köra enhetstest.

Skapa ett enhetstest från en arbetsflödesdefinition

  1. Öppna standardlogikappprojektet i Visual Studio Code.

  2. I projektet expanderar du mappen för arbetsflödesdefinition.

  3. På snabbmenyn för filenworkflow.json väljer du Öppna designer.

  4. Välj Skapa enhetstest i designerverktygsfältet.

    Skärmbild som visar Visual Studio Code, standardlogikappprojekt, arbetsflödesdesigner och valt kommando för att skapa enhetstest.

  5. Ange ett namn som ska användas för enhetstestet, enhetstestklassen och C#-filen.

    En ny mapp med namnet Tester visas nu på projektarbetsytan. Den här mappen har följande struktur:

    Skärmbild som visar Mappen Visual Studio Code, Standard logic app project och Tests med enhetstestmappar och filer.

    Mapp eller fil Beskrivning
    Tests
    || <logic-app-name>
    I Tests mappen visas en <logic-app-name> mapp när du lägger till enhetstester i ett logikapp-projekt.
    Tests
    || <logic-app-name>
    ||| <workflow-name>
    I mappen <logic-app-name> visas en <workflow-name> mapp när du lägger till enhetstester för ett arbetsflöde.
    Tests
    || <logic-app-name>
    ||| <workflow-name>
    |||| MockOutputs
    |||||<operation-name-outputs>.cs
    <workflow-name> I mappen MockOutputs innehåller mappen en C#-fil (.cs) med starkt skrivna klasser för varje anslutningsåtgärd i arbetsflödet. Varje .cs filnamn använder följande format:

    < operation-name >[Trigger\|Action]Output.cs

    Om en anslutningsåtgärd har dynamiska kontrakt visas en klass för varje dynamisk typ. En dynamisk typ refererar till en åtgärdsparameter som har olika indata och utdata baserat på värdet för parametern. Du kan använda de här klasserna för att utöka enhetstesterna och skapa nya modeller från grunden.
    Tests
    || <logic-app-name>
    ||| <workflow-name>
    |||| <unit-test-name>
    ||||| <unit-test-name>.cs
    I mappen <workflow-name> innehåller mappen <unit-test-name> en <unit-test-name>.cs-fil. Du använder den här filen, som innehåller en C#-exempelklass och -metoder, för att köra och kontrollera resultat. Du kan redigera den här filen så att den matchar dina specifika testscenarier.

Granska *.cs-filen för enhetstest

Den här enhetstestklassen tillhandahåller ett ramverk för att testa arbetsflöden i standardlogikappar genom att mocka utlösare och åtgärder. Med den här klassen kan du testa arbetsflöden utan att anropa externa tjänster eller API:er.

Testklassstruktur

En typisk enhetstestklass använder följande struktur:

[TestClass]
public class <unit-test-name>
{
    public TestExecutor TestExecutor;

    [TestInitialize]
    public void Setup()
    {
        this.TestExecutor = new TestExecutor("<workflow-name>/testSettings.config");
    }

    // Add test methods here.

    // Add helper methods here.
}

Setup()-metod

Den här metoden instansierar TestExecutor klassen med hjälp av sökvägen till konfigurationsfilen för testinställningar. Metoden körs före varje testkörning och skapar en ny instans av TestExecutor.

[TestInitialize]
public void Setup()
{
    this.TestExecutor = new TestExecutor("<workflow-name>/testSettings.config");
}

Exempel på testmetoder

I följande avsnitt beskrivs exempeltestmetoder som du kan använda i enhetstestklassen.

Statiskt test av falska data

Följande metod visar hur du använder statiska mock-data för att testa arbetsflödet. I den här metoden kan du utföra följande uppgifter:

  • Ange egenskapsvärden för dina simulerade åtgärder.
  • Kör arbetsflödet med konfigurerade testdata.
  • Bekräfta att exekveringen lyckades.
[TestMethod]
public async Task <workflow-name>_<unit-test-name>_ExecuteWorkflow_SUCCESS_Sample1()
{
    // PREPARE mock: Generate mock trigger data.
    var triggerMockOutput = new WhenMessagesAreAvailableInAQueuePeeklockTriggerOutput();
    // Sample that shows how to set the properties for triggerMockOutput
    // triggerMockOutput.Body.Id = "SampleId";
    var triggerMock = new WhenMessagesAreAvailableInAQueuePeeklockTriggerMock(outputs: triggerMockOutput);

    // Generate mock action data.
    var actionMockOutput = new CallExternalAPIActionOutput();
    // Sample that shows how to set the properties for actionMockOutput
    // actionMockOutput.Body.Name = "SampleResource";
    // actionMockOutput.Body.Id = "SampleId";
    var actionMock = new CallExternalAPIActionMock(name: "Call_External_API", outputs: actionMockOutput);

    // ACT: Create the UnitTestExecutor instance. Run the workflow with mock data.
    var testMock = new TestMockDefinition(
        triggerMock: triggerMock,
        actionMocks: new Dictionary<string, ActionMock>()
        {
            {actionMock.Name, actionMock}
        });
    var testRun = await this.TestExecutor
        .Create()
        .RunWorkflowAsync(testMock: testMock).ConfigureAwait(continueOnCapturedContext: false);

    // ASSERT: Confirm successful workflow execution and that the status is 'Succeeded'.
    Assert.IsNotNull(value: testRun);
    Assert.AreEqual(expected: TestWorkflowStatus.Succeeded, actual: te
    stRun.Status);
}

Dynamiskt modelldatatest

Följande metod visar hur man använder dynamisk mockdata med callbackmetoder. Den här metoden ger dig två alternativ som dynamiskt genererar falska data:

Med båda metoderna kan du skapa dynamiska svar baserat på enhetstestkörningskontexten.

[TestMethod]
public async Task <workflow-name>_<unit-test-name>_ExecuteWorkflow_SUCCESS_Sample2()
{
    // PREPARE: Generate mock trigger data.
    var triggerMockOutput = new WhenMessagesAreAvailableInAQueuePeeklockTriggerOutput();
    // Sample that shows how to set triggerMockOutput properties.
    // triggerMockOutput.Body.Flag = true;
    var triggerMock = new WhenMessagesAreAvailableInAQueuePeeklockTriggerMock(outputs: triggerMockOutput);

    // PREPARE: Generate mock action data.
    // OPTION 1: Define a callback class.
    var actionMock = new CallExternalAPIActionMock(name: "Call_External_API", onGetActionMock: CallExternalAPIActionMockOutputCallback);

    // OPTION 2: Define inline with a lambda function.
    /*var actionMock = new CallExternalAPIActionMock(name: "Call_External_API", onGetActionMock: (testExecutionContext) =>
    {
        return new CallExternalAPIActionMock(
            status: TestWorkflowStatus.Succeeded,
            outputs: new CallExternalAPIActionOutput {

                // If this account contains a JObject Body,
                // set the properties you want here:
                // Body = "something".ToJObject()

            }
        );
    });*/

    // ACT: Create the UnitTestExecutor instance. Run the workflow with mock data.
    var testMock = new TestMockDefinition(
        triggerMock: triggerMock,
        actionMocks: new Dictionary<string, ActionMock>()
        {
            {actionMock.Name, actionMock}
        });
    var testRun = await this.TestExecutor
        .Create()
        .RunWorkflowAsync(testMock: testMock).ConfigureAwait(continueOnCapturedContext: false);

    // ASSERT: Confirm successful workflow execution and that the status is 'Succeeded'.
    Assert.IsNotNull(value: testRun);
    Assert.AreEqual(expected: TestWorkflowStatus.Succeeded, actual: testRun.Status);
}

Hjälpmetoder

I följande avsnitt beskrivs metoder som används av exempeltestmetoderna. Hjälpmetoder visas under testmetoderna i klassdefinitionen.

Återanropsmetod

Följande metod genererar dynamiskt falska data. Metodnamnet varierar beroende på det simulerade åtgärdsnamnet i testmetoderna för statiska eller dynamiska falska data. Du kan redigera den här metoden för att returnera olika mock-svar baserat på dina testscenariokrav eller använda den som en mall för att skapa dina egna dynamiska återuppringningsmetoder.

public CallExternalAPIActionMock CallExternalAPIActionMockOutputCallback(TestExecutionContext context)
{
    // Sample mock data: Dynamically change the mocked data for 'actionName'.
    return new CallExternalAPIActionMock(
        status: TestWorkflowStatus.Succeeded,
        outputs: new CallExternalAPIActionOutput {

            // If this account contains a JObject Body, 
            // set the properties you want here:
            // Body = "something".ToJObject()

        }
    );
}