تمرين - تشغيل اختبارات التحميل في Azure Pipelines

مكتمل

في هذا القسم، ستقوم بتشغيل خطة الاختبار التي قمت بإنشائها في مسار الإصدار. تستخدم خطة الاختبار Apache JMeter لتشغيل اختبارات التحميل.

إليك كيفية إجراء الاختبارات:

  • قم بإحضار فرع Git الذي ينفذ الاختبارات وتحقق منه.
  • قم بتعديل البنية الأساسية لبرنامج ربط العمليات التجارية لتثبيت JMeter، وتشغيل خطة الاختبار، وتحويل النتائج إلى JUnit، ونشر النتائج إلى Azure Pipelines.
  • ادفع فرعك إلى GitHub، وشاهد الاختبارات التي يتم تشغيلها في Azure Pipelines، ثم افحص النتائج.

إحضار الفرع من GitHub

في هذا القسم، ستقوم بإحضار jmeter الفرع من GitHub وسحب هذا الفرع أو التبديل إليه.

يحتوي هذا الفرع على مشروع Space Game الذي عملت معه في الوحدات النمطية السابقة. كما يحتوي على تكوين Azure Pipelines للبدء به.

  1. في Visual Studio Code، افتح المحطة الطرفية المتكاملة.

  2. لتنزيل فرع يسمى jmeter من مستودع Microsoft والتبديل إلى هذا الفرع، قم بتشغيل git fetch الأوامر التالية:git checkout

    git fetch upstream jmeter
    git checkout -B jmeter upstream/jmeter
    

    تذكر أن المصدر يشير إلى مستودع Microsoft GitHub. يفهم تكوين Git الخاص بمشروعك جهاز التحكم عن بعد المصدر لأنك قمت بإعداد هذه العلاقة عند نسخ المشروع من مستودع Microsoft واستنساخه محليا.

    قريبا، ستدفع هذا الفرع إلى مستودع GitHub الخاص بك، والمعروف باسم origin.

  3. اختياريا، في Visual Studio Code، افتح ملف azure-pipelines.yml . راجع التكوين الأولي.

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

    إشعار

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

    لمزيد من المعلومات، راجع تنفيذ سير عمل التعليمات البرمجية في البنية الأساسية لبرنامج ربط العمليات التجارية للبناء باستخدام مشغلات Git وGitHub و Build pipeline.

  4. اختياريا، في Visual Studio Code، يمكنك التحقق من ملف خطة اختبار JMeter، LoadTest.jmx، وتحويل XLST، JMeter2JUnit.xsl. يحول ملف XLST إخراج JMeter إلى JUnit بحيث يمكن ل Azure Pipelines تصور النتائج.

إضافة متغيرات إلى Azure Pipelines

توفر خطة الاختبار الأصلية للفريق قيمة ذات تعليمات برمجية مضمنة لاسم مضيف موقع Space Game على الويب الذي يعمل في بيئة التشغيل المرحلي .

لجعل خطة الاختبار أكثر مرونة، يستخدم الإصدار الخاص بك خاصية JMeter. فكر في خاصية كمتغير يمكنك تعيينه من سطر الأوامر.

إليك كيفية hostname تعريف المتغير في JMeter:

Screenshot of setting the hostname variable in Apache JMeter.

إليك كيفية استخدام المتغير hostname دالة __P لقراءة المتغير hostname.

Screenshot for reading the hostname variable in Apache JMeter.

يحدد ملف خطة الاختبار المقابل LoadTest.jmx هذا المتغير ويستخدمه لتعيين اسم المضيف.

عند تشغيل JMeter من سطر الأوامر، يمكنك استخدام الوسيطة -J لتعيين الخاصية hostname . إليك مثال:

apache-jmeter-5.4.3/bin/./jmeter -n -t LoadTest.jmx -o Results.xml -Jhostname=tailspin-space-game-web-staging-1234.azurewebsites.net

هنا، يمكنك تعيين STAGING_HOSTNAME المتغير في Azure Pipelines. يشير هذا المتغير إلى اسم مضيف موقعك الذي يتم تشغيله على App Service في بيئة التقسيم المرحلي. يمكنك أيضا تعيين jmeterVersion لتحديد إصدار JMeter لتثبيته.

عند تشغيل العامل، يتم تصدير هذه المتغيرات تلقائيا إلى العامل كمتغيرات بيئة، بحيث يمكن لتكوين البنية الأساسية لبرنامج ربط العمليات التجارية تشغيل JMeter بهذه الطريقة:

apache-jmeter-5.4.3/bin/./jmeter -n -t LoadTest.jmx -o Results.xml -Jhostname=$(STAGING_HOSTNAME)

دعونا نضيف متغيرات البنية الأساسية لبرنامج ربط العمليات التجارية الآن، قبل تحديث تكوين البنية الأساسية لبرنامج ربط العمليات التجارية. للقيام بذلك:

  1. في Azure DevOps، انتقل إلى مشروع Space Game - web - Nonfunctional tests .

  2. ضمن Pipelines، حدد Library.

  3. حدد مجموعة متغيرات الإصدار.

  4. ضمن المتغيرات، حدد + إضافة.

  5. للحصول على اسم المتغير الخاص بك، أدخل STAGING_HOSTNAME. بالنسبة لقيمته، أدخل عنوان URL لمثيل App Service الذي يتوافق مع بيئة التشغيل المرحلي، مثل tailspin-space-game-web-staging-1234.azurewebsites.net.

    هام

    لا تقم بتضمين http:// بادئة البروتوكول أو https:// في القيمة الخاصة بك. يوفر JMeter البروتوكول عند تشغيل الاختبارات.

  6. أضف متغيرا ثانيا باسم jmeterVersion. للحصول على قيمته، حدد 5.4.3.

    إشعار

    هذا هو إصدار JMeter الذي استخدمناه مؤخرا لاختبار هذه الوحدة النمطية. للحصول على أحدث إصدار، راجع تنزيل Apache JMeter.

  7. لحفظ المتغير الخاص بك إلى المسار، حدد Save بالقرب من أعلى الصفحة.

    تشبه مجموعة المتغيرات الخاصة بك المجموعة الموضحة في الصورة التالية:

    Screenshot of Azure Pipelines, showing the variable group. The group contains five variables.

تعديل تكوين البنية الأساسية لبرنامج ربط العمليات التجارية

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

  1. في Visual Studio Code، افتح ملف azure-pipelines.yml . ثم قم بتعديل الملف كما يلي:

    تلميح

    يمكنك استبدال الملف بأكمله أو تحديث الجزء المميز فقط.

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
    
    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      jobs:
      - job: 'Build'
        displayName: 'Build job'
        pool:
          vmImage: 'ubuntu-20.04'
          demands:
          - npm
    
        variables:
          wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
          dotnetSdkVersion: '6.x'
    
        steps:
        - task: UseDotNet@2
          displayName: 'Use .NET SDK $(dotnetSdkVersion)'
          inputs:
            version: '$(dotnetSdkVersion)'
    
        - task: Npm@1
          displayName: 'Run npm install'
          inputs:
            verbose: false
    
        - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
          displayName: 'Compile Sass assets'
    
        - task: gulp@1
          displayName: 'Run gulp tasks'
    
        - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt'
          displayName: 'Write build info'
          workingDirectory: $(wwwrootDir)
    
        - task: DotNetCoreCLI@2
          displayName: 'Restore project dependencies'
          inputs:
            command: 'restore'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Build the project - $(buildConfiguration)'
          inputs:
            command: 'build'
            arguments: '--no-restore --configuration $(buildConfiguration)'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Publish the project - $(buildConfiguration)'
          inputs:
            command: 'publish'
            projects: '**/*.csproj'
            publishWebProjects: false
            arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)'
            zipAfterPublish: true
    
        - publish: '$(Build.ArtifactStagingDirectory)'
          artifact: drop
    
    - stage: 'Dev'
      displayName: 'Deploy to the dev environment'
      dependsOn: Build
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: dev
        variables:
        - group: Release
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  appName: '$(WebAppNameDev)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
    
    - stage: 'Test'
      displayName: 'Deploy to the test environment'
      dependsOn: Dev
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: test
        variables:
        - group: 'Release'
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  appName: '$(WebAppNameTest)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
    
    - stage: 'Staging'
      displayName: 'Deploy to the staging environment'
      dependsOn: Test
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: staging
        variables:
        - group: 'Release'
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  appName: '$(WebAppNameStaging)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
      - job: RunLoadTests
        dependsOn: Deploy
        displayName: 'Run load tests'
        pool:
          vmImage: 'ubuntu-20.04'
        variables:
        - group: Release
        steps:
        - script: |
            wget -c archive.apache.org/dist/jmeter/binaries/apache-jmeter-$(jmeterVersion).tgz
            tar -xzf apache-jmeter-$(jmeterVersion).tgz
          displayName: 'Install Apache JMeter'
        - script: apache-jmeter-$(jmeterVersion)/bin/./jmeter -n -t LoadTest.jmx -o Results.xml -Jhostname=$(STAGING_HOSTNAME)
          displayName: 'Run Load tests'
        - script: |
            sudo apt-get update
            sudo apt-get install xsltproc
            xsltproc JMeter2JUnit.xsl Results.xml > JUnit.xml
          displayName: 'Transform JMeter output to JUnit'
        - task: PublishTestResults@2
          inputs:
            testResultsFormat: JUnit
            testResultsFiles: JUnit.xml
    

    فيما يلي ملخص للتغييرات:

    • تقوم RunLoadTests المهمة بتحميل الاختبار من عامل Linux.
    • RunLoadTests تعتمد الوظيفة على Deploy الوظيفة للتأكد من تشغيل الوظائف بالترتيب الصحيح. تحتاج إلى نشر موقع الويب إلى App Service قبل أن تتمكن من تشغيل اختبارات التحميل. إذا لم تحدد هذه التبعية، يمكن تشغيل المهام داخل المرحلة بأي ترتيب أو تشغيل بالتوازي.
    • المهمة الأولى script تنزل وتثبت JMeter. jmeterVersion يحدد متغير البنية الأساسية لبرنامج ربط العمليات التجارية إصدار JMeter المراد تثبيته.
    • تشغل المهمة الثانية script JMeter. تعين -J الوسيطة الخاصية hostname في JMeter عن طريق قراءة STAGING_HOSTNAME المتغير من البنية الأساسية لبرنامج ربط العمليات التجارية.
    • تعمل المهمة الثالثة script على تثبيت xsltproc، وهو معالج XSLT، وتحويل ناتج JMeter إلى JUnit.
    • تنشر المهمة PublishTestResults@2 تقرير JUnit الناتج، JUnit.xml، إلى Pipeline. يمكن أن تساعدك Azure Pipelines في تصور نتائج الاختبار.
  2. في الوحدة الطرفية المتكاملة، أضف azure-pipelines.yml إلى الفهرس، وقم بتثبيت التغييرات، وادفع الفرع إلى GitHub.

    git add azure-pipelines.yml
    git commit -m "Run load tests with Apache JMeter"
    git push origin jmeter
    

شاهد Azure Pipelines تقوم بتشغيل الاختبارات

هنا، ستشاهد تشغيل البنية الأساسية لبرنامج ربط العمليات التجارية. سترى اختبارات التحميل يتم تشغيلها أثناء التقسيم المرحلي.

  1. في Azure Pipelines، انتقل إلى البنية وتتبعها أثناء تشغيلها.

    أثناء التقسيم المرحلي، ترى اختبارات التحميل يتم تشغيلها بعد نشر موقع الويب.

  2. بعد انتهاء البناء، انتقل إلى صفحة الملخص.

    Screenshot of Azure Pipelines, showing the completed stages.

    ترى أن عملية النشر واختبارات التحميل قد انتهت بنجاح.

  3. بالقرب من أعلى الصفحة، لاحظ الملخص.

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

    A screenshot of Azure Pipelines, showing the test summary.

  4. حدد ملخص الاختبار لمشاهدة التقرير الكامل.

    يوضح التقرير أن كلا الاختبارين قد اجتازا.

    Screenshot of Azure Pipelines, showing the full test report.

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

    تذكر أن ملف XSLT ينتج ملف JUnit يسمى JUnit.xml. يجيب ملف JUnit على هذين السؤالين:

    • هل متوسط وقت الطلب أقل من ثانية واحدة؟
    • هل يستغرق إكمال أقل من 10 بالمائة من الطلبات أكثر من ثانية واحدة؟

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

    Screenshot of Filtering passed tests in the test report.

    ترى أن حالتي اختبار متوسط وقت الاستجابة ووقت الاستجابة الأقصى قد نجحتا.

    Screenshot of the test report, showing two successful test cases.

إشعار

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