مشاركة عبر


إنشاء اختبارات الوحدة من تعريفات سير العمل القياسية في Azure Logic Apps باستخدام Visual Studio Code

ينطبق على: Azure Logic Apps (قياسي)

اختبار الوحدة هو ممارسة أساسية تحافظ على التطبيق أو الحل الخاص بك موثوقا ودقيقا طوال دورة حياة تطوير البرامج. تساعدك اختبارات الوحدة على التحقق بكفاءة وبشكل منهجي من صحة المكونات الرئيسية في الحل الخاص بك.

بالنسبة إلى مهام سير عمل تطبيق المنطق القياسي، يمكنك إنشاء اختبارات الوحدة باستخدام Visual Studio Code وملحق Azure Logic Apps (Standard). تتيح لك هذه الإمكانية استخدام تعريفات سير العمل لإنشاء اختبارات الوحدة وتخصيصها للسيناريوهات التي يدعمها حل تطبيق المنطق الخاص بك - كل ذلك دون الحاجة إلى اتصالات بأي خدمات أو أنظمة أو واجهات برمجة تطبيقات خارجية. يتيح لك هذا الأسلوب اختبار مهام سير العمل الخاصة بك دون الحاجة إلى التفاعل مع الخدمات الخارجية أو الأنظمة أو واجهات برمجة التطبيقات ويوفر المزايا التالية:

  • تحسين جودة سير العمل عن طريق تحديد المشكلات المحتملة ومعالجتها قبل النشر في بيئات أخرى.

  • تبسيط تكامل اختبار الوحدة مع عملية التطوير الخاصة بك، مع ضمان سلوك سير عمل متسق ودقيق.

يوضح هذا الدليل كيفية إنشاء تعريف اختبار وحدة من سير عمل. يستهزئ هذا التعريف بالمكالمات الخارجية من كل عملية سير عمل دون تغيير منطق سير العمل. عند إنشاء اختبار وحدة لسير عمل، تحصل على مشروع اختبار وحدة يتضمن المجلدات التالية:

  • مجلد يحتوي على فئات مكتوبة بقوة لكل عملية قابلة للنسخ في سير العمل.

  • مجلد لكل تعريف اختبار وحدة. يتضمن هذا المجلد ملف C# الذي يحتوي على نموذج فئة وأساليب. يمكنك استخدام هذه الفئة والأساليب لإعداد التأكيدات الخاصة بك، والتأكد من أن سير العمل يتصرف كما هو متوقع، وتأكد من أن سير العمل يتصرف بشكل موثوق ومتوقع في نظام Azure البنائي الأكبر.

المتطلبات الأساسية

القيود والمشاكل المعروفة

  • يدعم هذا الإصدار حاليا C# فقط لإنشاء اختبارات الوحدة.

  • لا يدعم هذا الإصدار الإجراءات غير المقلدة. تأكد من أن جميع الإجراءات في مسار تنفيذ سير العمل هي نسخة وهمية.

  • لا يدعم هذا الإصدار أنواع الإجراءات التالية:

    • إجراءات حساب التكامل
    • إجراءات ترميز وفك ترميز EDI

مراجعة المفاهيم الأساسية

تتضمن القائمة التالية مفاهيم أساسية ولكنها مهمة حول اختبارات الوحدة لسير العمل القياسي:

  • اختبار وحدة تطبيق المنطق

    تنفيذ سير عمل يتم التحكم فيه الذي يقوم بإدخال كائنات وهمية. تمثل هذه الكائنات إما مشغل سير العمل أو الإجراءات التي تعتمد على الخدمات الخارجية أو الأنظمة.

  • إجراء قابل للزخرية

    إجراء سير عمل يعتمد على خدمة أو نظام خارجي. يمكنك تحويل هذه الإجراءات إلى إجراءات وهمية لإنشاء اختبار الوحدة وتنفيذها.

إنشاء اختبار وحدة من تعريف سير العمل

  1. في Visual Studio Code، افتح مشروع تطبيق المنطق القياسي.

  2. في مشروعك، قم بتوسيع مجلد تعريف سير العمل.

  3. من القائمة المختصرة لملف workflow.json ، حدد Open Designer.

  4. في شريط أدوات المصمم، حدد Create unit test.

    تظهر لقطة الشاشة Visual Studio Code ومشروع تطبيق المنطق القياسي ومصمم سير العمل والأمر المحدد لإنشاء اختبار الوحدة.

  5. أدخل اسما لاستخدامه لاختبار الوحدة وفئة اختبار الوحدة وملف C#‎.

    يظهر الآن مجلد جديد يسمى Tests في مساحة عمل المشروع. يحتوي هذا المجلد على البنية التالية:

    تظهر لقطة الشاشة Visual Studio Code ومشروع تطبيق المنطق القياسي ومجلد الاختبارات مع مجلدات وملفات اختبار الوحدة.

    مجلد أو ملف ‏‏الوصف
    Tests
    || <logic-app-name>
    في Tests المجلد، <logic-app-name> يظهر مجلد عند إضافة اختبارات الوحدة إلى مشروع تطبيق منطقي.
    Tests
    || <logic-app-name>
    ||| <workflow-name>
    في <logic-app-name> المجلد، <workflow-name> يظهر مجلد عند إضافة اختبارات وحدة لسير عمل.
    Tests
    || <logic-app-name>
    ||| <workflow-name>
    |||| MockOutputs
    < operation-name-outputs >||||| .cs
    في <workflow-name> المجلد، MockOutputs يحتوي المجلد على ملف C# (.cs) مع فئات مكتوبة بقوة لكل عملية موصل في سير العمل. يستخدم كل اسم ملف .cs التنسيق التالي:

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

    إذا كانت عملية الموصل تحتوي على عقود ديناميكية، تظهر فئة لكل نوع ديناميكي. يشير النوع الديناميكي إلى معلمة عملية لها مدخلات ومخرجات مختلفة استنادا إلى القيمة المقدمة لتلك المعلمة. يمكنك استخدام هذه الفئات لتوسيع اختبارات الوحدة وإنشاء نماذج جديدة من البداية.
    Tests
    || <logic-app-name>
    ||| <workflow-name>
    |||| <unit-test-name>
    ||||| <unit-test-name>.cs
    في <workflow-name> المجلد، <unit-test-name> يحتوي المجلد على <unit-test-name>.cs ملف. يمكنك استخدام هذا الملف، الذي يحتوي على نموذج فئة C# وأساليبه، لتشغيل النتائج وتأكيدها. يمكنك تحرير هذا الملف لمطابقة سيناريوهات الاختبار المحددة.

مراجعة ملف *.cs اختبار الوحدة

توفر فئة اختبار الوحدة هذه إطار عمل لاختبار مهام سير عمل تطبيق المنطق القياسي عن طريق تقليد المشغلات والإجراءات. تتيح لك هذه الفئة اختبار مهام سير العمل دون استدعاء الخدمات الخارجية أو واجهات برمجة التطبيقات بالفعل.

اختبار بنية الفئة

تستخدم فئة اختبار الوحدة النموذجية البنية التالية:

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

يقوم هذا الأسلوب بإنشاء مثيل للفئة TestExecutor باستخدام المسار إلى ملف تكوين إعدادات الاختبار. يتم تشغيل الأسلوب قبل كل تنفيذ اختبار وإنشاء مثيل جديد من TestExecutor.

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

نموذج أساليب الاختبار

يصف القسم التالي نماذج أساليب الاختبار التي يمكنك استخدامها في فئة اختبار الوحدة.

اختبار البيانات الوهمية الثابتة

يوضح الأسلوب التالي كيفية استخدام البيانات الوهمية الثابتة لاختبار سير العمل. في هذا الأسلوب، يمكنك إكمال المهام التالية:

  • تعيين قيم الخصائص على الإجراءات الوهمية.
  • تنفيذ سير العمل باستخدام البيانات الوهمية المكونة.
  • تأكد من نجاح التنفيذ.
[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);
}

اختبار البيانات الوهمية الديناميكية

يوضح الأسلوب التالي كيفية استخدام البيانات الوهمية الديناميكية مع أساليب رد الاتصال. يمنحك هذا الأسلوب خيارين يولدان بيانات وهمية ديناميكيا:

يتيح لك كلا النهجين إنشاء استجابات ديناميكية استنادا إلى سياق تنفيذ اختبار الوحدة.

[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);
}

طرق المساعد

يصف القسم التالي الأساليب المستخدمة من قبل نماذج أساليب الاختبار. تظهر أساليب المساعد ضمن أساليب الاختبار في تعريف الفئة.

طريقة رد الاتصال

ينشئ الأسلوب التالي بيانات وهمية ديناميكيا. يختلف اسم الأسلوب استنادا إلى اسم الإجراء الوهمي في أساليب الاختبار للبيانات الوهمية الثابتة أو الديناميكية. يمكنك تحرير هذا الأسلوب لإرجاع استجابات وهمية مختلفة استنادا إلى متطلبات سيناريو الاختبار أو استخدامه كقالب لإنشاء أساليب رد الاتصال الديناميكية الخاصة بك.

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

        }
    );
}