Aracılığıyla paylaş


Visual Studio Code ile Azure Logic Apps'te Standart iş akışı çalıştırmalarından birim testleri oluşturma

Şunlar için geçerlidir: Azure Logic Apps (Standart)

Birim testi, uygulamanızın veya çözümünüzün yazılım geliştirme yaşam döngüsü boyunca güvenilir ve doğru kalmasını sağlayan temel bir uygulamadır. Birim testleri, çözümünüzdeki temel bileşenleri verimli ve sistematik olarak doğrulamanıza yardımcı olur.

Standart mantıksal uygulama iş akışları için Visual Studio Code ve Azure Logic Apps (Standart) uzantısını kullanarak birim testleri oluşturabilirsiniz. Bu özellik, birim testleri oluşturmak ve bunları mantıksal uygulama çözümünüz tarafından desteklenen senaryolara uyarlamak için daha önce yürütülen iş akışı çalıştırmalarını kullanmanıza olanak tanır. Bu yaklaşım aşağıdaki avantajları sağlar:

  • İş akışı çalıştırmalarını yeniden kullanarak iş akışındaki belirli işlemler için sahte veriler oluşturun.

    Bu veriler dış hizmetleri, sistemleri veya API'leri çağırmak zorunda kalmadan iş akışlarını test etmenizi sağlar. Zaman kazanırsınız ve iş akışınız gerçek iş akışı yürütme senaryosuyla uyumlu kalır.

  • Diğer ortamlara dağıtmadan önce olası sorunları tanımlayıp gidererek iş akışı kalitesini geliştirin.

  • Geliştirme sürecinizle birim testi entegrasyonunu kolaylaştırırken, tutarlı ve doğru iş akışı davranışı sağladığınızdan emin olun.

Bu kılavuz, bir iş akışı çalıştırmasından birim testi tanımının nasıl oluşturulacağını gösterir. Bu tanım, iş akışı mantığını değiştirmeden her iş akışı işleminden gelen dış çağrılarla dalga geçer. bir iş akışı çalıştırmasından birim testi oluşturduğunuzda, iki klasör içeren bir birim testi projesi alırsınız:

  • İş akışınızdaki her taklit edilebilir işlem için güçlü şekilde tiplenmiş sınıflar içeren bir klasör.

  • Her birim testi tanımı için aşağıdaki dosyaları içeren bir klasör:

    • İş akışınızda oluşturulan simüle edilmiş işlemleri temsil eden bir JSON dosyası.

    • Kendi onaylarınızı ayarlamak için kullandığınız örnek sınıf ve yöntemleri içeren bir C# dosyası, iş akışının beklendiği gibi davrandığını onaylayın ve iş akışının daha büyük Azure ekosisteminizde güvenilir ve tahmin edilebilir şekilde davrandığından emin olun.

Önkoşullar

Sınırlamalar ve bilinen sorunlar

  • Bu sürüm şu anda birim testleri oluşturmak için yalnızca C# desteği sunar.

  • Bu sürüm sahte olmayan eylemleri desteklemez. İş akışı yürütme yolundaki tüm eylemlerin taklit edildiğinden emin olun.

  • Bu sürüm aşağıdaki eylem türlerini desteklemez:

    • Tümleştirme hesabı eylemleri
    • Veri Eşleyici eylemleri
    • Özel kod eylemleri
    • XML eylemleri
    • Sıvı eylemleri
    • EDI kodlama ve kod çözme eylemleri

Temel kavramları gözden geçirin

Aşağıdaki liste, Standart iş akışları için birim testleri hakkında temel ama önemli kavramları içerir:

  • Mantıksal uygulama birim testi

    Sahte nesneler ekleyen denetimli bir iş akışı yürütmesi. Bu nesneler iş akışı tetikleyicisini veya dış hizmetlere veya sistemlere bağlı eylemleri temsil eder.

  • Taklit edilebilir eylem

    Dış hizmete veya sisteme bağlı bir iş akışı eylemi. Birim testi oluşturma ve yürütme için bu eylemleri taklit eylemlere dönüştürebilirsiniz.

İş akışı yürütmesinden birim testi oluştur

  1. Visual Studio Code'da Standart mantıksal uygulama projenizi açın.

  2. Visual Studio Code araç çubuğunda, Çalıştırmenüsünden Hata Ayıklamayı Başlat'ı seçin. (Klavye: F5 tuşuna basın)

  3. Gezgin penceresine dönün. Projenizde iş akışı tanımı klasörünü genişletin.

  4. workflow.json kısayol menüsünü açın ve Genel Bakış'ı seçin.

  5. Genel bakış sayfasında, Çalıştırma geçmişi bölümünün altında, birim testi oluşturmak için kullanılacak iş akışı çalışmasını seçin.

    Visual Studio Code'da, Standart Logic App projesiyle hata ayıklama modu çalışırken, iş akışı genel görünüm sayfası açıkken ve bir iş akışı çalıştırması seçili durumda ekran görüntüsü alınmıştır.

  6. Çalıştırma geçmişi araç çubuğunda Çalıştırmadan birim testi oluştur'u seçin.

    Visual Studio Code, Standart iş akışı çalıştırma geçmişi sayfası ve birim testi için seçilen komutu gösteren ekran görüntüsü.

  7. Birim testi, birim testi sınıfı ve C# dosyası için kullanılacak bir ad sağlayın.

    Gezgin penceresinde, mantıksal uygulama proje klasörünüzün altında Testler adlı yeni bir proje klasörü görüntülenir. Testler klasörü aşağıdaki klasörleri ve dosyaları içerir:

    Visual Studio Code, Standart mantıksal uygulama projesi ve Birim testi klasörleri ve dosyaları içeren Testler klasörünü gösteren ekran görüntüsü.

    Klasör veya dosya Açıklama
    Tests
    || <logic-app-name>
    Tests klasöründe, mantıksal <logic-app-name> uygulama projesine birim testleri eklediğinizde bir klasör görüntülenir.
    Tests
    || <logic-app-name>
    ||| <workflow-name>
    <logic-app-name> klasöründe, bir <workflow-name> iş akışı için birim testleri eklediğinizde bir klasör görüntülenir.
    Tests
    || <logic-app-name>
    ||| <workflow-name>
    |||| MockOutputs
    < operation-name-outputs >|||||.cs
    <workflow-name> klasöründe, klasör iş akışındaki MockOutputs her bağlayıcı işlemi için kesin olarak türlenmiş sınıflara sahip bir C# (.cs) dosyası içerir. Her .cs dosya adı aşağıdaki biçimi kullanır:

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

    Bağlayıcı işleminin dinamik anlaşmaları varsa, her dinamik tür için bir sınıf görüntülenir. Dinamik tür, bu parametre için sağlanan değere göre farklı girişlere ve çıkışlara sahip bir işlem parametresine başvurur. Birim testlerinizi genişletmek ve sıfırdan yeni taklit nesneler oluşturmak için bu sınıfları kullanabilirsiniz.
    Tests
    || <logic-app-name>
    ||| <workflow-name>
    |||| <unit-test-name>
    ||||| <unit-test-name>-mock.json
    ||||| <unit-test-name>.cs
    <workflow-name> klasöründe, <unit-test-name> klasör aşağıdaki dosyaları içerir:

    - Dosya, <unit-test-name>-mock.json birim testini oluşturan iş akışı çalıştırmasına göre oluşturulan sahteler için bir JSON gösterimi içerir.

    - Dosya <unit-test-name>.cs , sonuçları çalıştırmak ve onaylamak için dosyayı kullanan *-mock.json örnek bir C# sınıfı ve yöntemleri içerir. Bu dosyayı belirli test senaryolarınızla eşleşecek şekilde düzenleyebilirsiniz.

*-mock.json dosyasını gözden geçirin

Bu dosya aşağıdaki ana bölümlere sahiptir:

triggerMocks bölüm

triggerMocks bölümü, iş akışı tetikleyicisinden elde edilen sahte sonucu içerir. Bu bölüm, aşağıdaki örnekte gösterildiği gibi iş akışı yürütmeyi başlatmak için gereklidir:

{
    "triggerMocks": {
        "When_messages_are_available_in_a_queue_(peek-lock)": {
            "name": "When_messages_are_available_in_a_queue_(peek-lock)",
            "status": "Succeeded",
            "outputs": {
                "body": {
                    "contentData": {
                        "messageId": "1234",
                        "status": "new",
                        "contentType": "application/json",
                        "userProperties": {},
                        "scheduledEnqueueTimeUtc": "1/1/0001 12:00:00 AM",
                        "timeToLive": "14.00:00:00",
                        "deliveryCount": 1,
                        "enqueuedSequenceNumber": 0,
                        "enqueuedTimeUtc": "2025-04-07T01:10:09.738Z",
                        "lockedUntilUtc": "2025-04-07T01:11:09.769Z",
                        "lockToken": "78232fa8-03cf-4baf-b1db-3375a64e0ced",
                        "sequenceNumber": 5
                    }
                }
            }
        }
    },
    "actionMocks": {...}
}

actionMocks bölüm

Bir iş akışı çalıştırılırken, actionMocks bölümü her sahte eylemi içerir ve iş akışının denetimli bir şekilde yürütülmesini garanti eder.

{
    "triggerMocks": {...},
    "actionMocks": {
        "Call_External_API": {
            "name": "Call_External_API",
            "status": "Succeeded",
            "outputs": {
                "statusCode": 200,
                "body": {
                    "status": "Awesome!"
                }
            }
        },
        "CompleteMessage": {
            "name": "CompleteMessage",
            "status": "Succeeded",
            "outputs": {
                "statusCode": "OK",
                "body": {}
            }
        }
    }
}

Birim testi *.cs dosyasını gözden geçirin

Bu birim testi sınıfı, tetikleyicileri ve eylemleri taklit ederek Standart mantıksal uygulama iş akışlarını test etme için bir çerçeve sağlar. Bu sınıf, dış hizmetleri veya API'leri çağırmadan iş akışlarını test etmenizi sağlar.

Test sınıfı yapısı

Tipik bir birim testi sınıfı aşağıdaki yapıyı kullanır:

[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() yöntemi

Bu yöntem, test ayarları yapılandırma dosyanızın yolunu kullanarak sınıfın örneğini TestExecutor oluşturur. yöntemi her test yürütmeden önce çalışır ve yeni bir örneği TestExecutoroluşturur.

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

Örnek test yöntemleri

Aşağıdaki bölümde, birim testi sınıfınızda kullanabileceğiniz örnek test yöntemleri açıklanmaktadır.

Statik sahte veri testi

Aşağıdaki yöntem, iş akışınızı test etmek için statik sahte verilerin nasıl kullanılacağını gösterir. Bu yöntemde aşağıdaki görevleri tamamlayabilirsiniz:

  • Mock edilmiş eylemlerinizde özellik değerlerini ayarlayın.
  • Yapılandırılmış sahte verilerle iş akışını çalıştırın.
  • Yürütmenin başarılı olduğunu onaylayın.
[TestMethod]
public async Task <workflow-name>_<unit-test-name>_ExecuteWorkflow_SUCCESS_Sample1()
{
    // PREPARE mock: Generate mock action and trigger data.
    var mockData = this.GetTestMockDefinition();
    var sampleActionMock = mockData.ActionMocks["Call_External_API"];
    sampleActionMock.Outputs["your-property-name"] = "your-property-value";

    // ACT: Create the UnitTestExecutor instance. Run the workflow with mock data.
    var testRun = await this.TestExecutor
        .Create()
        .RunWorkflowAsync(testMock: mockData).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);
}

Dinamik sahte veri testi

Aşağıdaki yöntem, geri çağırma yöntemleriyle dinamik sahte verilerin nasıl kullanılacağını gösterir. Bu yaklaşım, dinamik olarak sahte veri oluşturan iki seçenek sunar:

Her iki yaklaşım da birim testi yürütme bağlamı temelinde dinamik yanıtlar oluşturmanıza olanak tanır.

[TestMethod]
public async Task <workflow-name>_<unit-test-name>_ExecuteWorkflow_SUCCESS_Sample2()
{
    // PREPARE: Generate mock action and trigger data.
    var mockData = this.GetTestMockDefinition();
    
    // OPTION 1: Define a callback class.
    mockData.ActionMocks["Call_External_API"] = new CallExternalAPIActionMock(
        name: "Call_External_API", 
        onGetActionMock: CallExternalAPIActionMockOutputCallback);

    // OPTION 2: Define an inline lambda function.
    mockData.ActionMocks["Call_External_API"] = 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 UnitTestExecutor instance. Run the workflow with mock data.
    var testRun = await this.TestExecutor
        .Create()
        .RunWorkflowAsync(testMock: mockData).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);
}

Hata senaryosu testi

Aşağıdaki yöntem hata koşullarının nasıl test yapılacağını gösterir. Bu yöntemde aşağıdaki görevleri tamamlayabilirsiniz:

  • Sahte eylemleri belirli hata kodları ve iletilerle başarısız olacak şekilde yapılandırın.
  • İş akışının bu hata koşullarını doğru işlediğini onaylayın.
[TestMethod]
public async Task <workflow-name>_<unit-test-name>_ExecuteWorkflow_FAILED_Sample3()
{
    // PREPARE: Generate mock action and trigger data.
    var mockData = this.GetTestMockDefinition();
    var mockError = new TestErrorInfo(code: ErrorResponseCode.BadRequest, message: "Input is invalid.");
    mockData.ActionMocks["Call_External_API"] = new CallExternalAPIActionMock(
        status: TestWorkflowStatus.Failed, 
        error: mockError);

    // ACT: Create UnitTestExecutor instance. Run the workflow with mock data.
    var testRun = await this.TestExecutor
        .Create()
        .RunWorkflowAsync(testMock: mockData).ConfigureAwait(continueOnCapturedContext: false);

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

Yardımcı yöntemler

Aşağıdaki bölümde, örnek test yöntemleri tarafından kullanılan yöntemler açıklanmaktadır. Yardımcı yöntemler, sınıf tanımındaki test yöntemlerinin altında görünür.

GetTestMockDefinition()

Aşağıdaki yöntem bir JSON dosyasından sahte tanımı yükler. Sahte verileriniz farklı bir konumda veya biçimde depolanıyorsa bu yöntemi düzenleyebilirsiniz.

private TestMockDefinition GetTestMockDefinition()
{
    var mockDataPath = Path.Combine(TestExecutor.rootDirectory, "Tests", TestExecutor.logicAppName, 
        TestExecutor.workflow, "<unit-test-name>", "<unit-test-name>-mock.json");
    return JsonConvert.DeserializeObject<TestMockDefinition>(File.ReadAllText(mockDataPath));
}

Geri çağırma yöntemi

Aşağıdaki yöntem dinamik olarak sahte veriler oluşturur. Yöntem adı, statik ya da dinamik mock veriler için test yöntemlerinde simüle edilen eylem adı temel alınarak değişir. Test senaryosu gereksinimlerinize göre farklı sahte yanıtlar döndürmek için bu yöntemi düzenleyebilir veya kendi dinamik geri çağırma yöntemlerinizi oluşturmak için şablon olarak kullanabilirsiniz.

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()

        }
    );
}