דלג לתוכן
חזור

אוטומציית בדיקות - האצת בדיקות Playwright TypeScript עם הרצה מקבילית ב-GitHub Actions ודיווח Allure

פורסם:

האתגר של זמני הרצת בדיקות ארוכים

באוטומציית בדיקות, הפחתת זמן הביצוע מבלי להתפשר על התוצאות היא חיונית, במיוחד כאשר חבילות הבדיקות גדלות בפרויקטים גדולים עם צרכי בדיקה מתמשכים. הדבר עלול להפוך לצוואר בקבוק בעת הרצת כל הבדיקות.

מאמר זה בוחן כיצד למנף את GitHub Actions ואת יכולות ה-sharding המובנות של Playwright כדי להריץ בדיקות TypeScript במקביל, ובכך להפחית משמעותית את זמן הביצוע הכולל.

שיתפתי את הפתרון המוצג במאמר זה בפרויקט הדוגמה שלי Playwright Typescript example project.

הבדלים עיקריים מהמימוש בפייתון:

  1. תמיכה מובנית ב-Sharding: בניגוד לגרסת הפייתון שדרשה את pytest-split, ל-Playwright עבור TypeScript יש יכולות Sharding מובנות. זה מבטל את הצורך בספריות נוספות לחלוקת הבדיקות.
  2. טיפול פשוט יותר (Artifacts): Allure Playwright for TypeScript כולל שידוך בדוח ה-Allure, מה שמייעל את התהליך ומפחית את הצורך בניהול ידני.

מימוש הפתרון

קוד הפתרון נמצא כאן.

jobs:
  setup-matrix:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
    steps:
      - id: set-matrix
        run: |
          count=${{ github.event.inputs.parallelism || 2 }}
          matrix=$(seq -s ',' 1 $count)
          echo "matrix=$(jq -cn --argjson groups "[$matrix]" '{group: $groups}')" >> $GITHUB_OUTPUT

הג’וב setup-matrix יוצר באופן דינמי מטריצה המבוססת על מספר ההרצות המקביליות שצוין, ומאפשר שינוי גמיש של תשתית הבדיקות שלנו.

nightly-test:
  needs: setup-matrix
  timeout-minutes: 15
  runs-on: ubuntu-latest
  container:
    image: mcr.microsoft.com/playwright:v1.46.0-jammy
  strategy:
    fail-fast: false
    matrix: ${{ fromJson(needs.setup-matrix.outputs.matrix) }}
  steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: lts/*
    - name: Cache node_modules
      uses: actions/cache@v4
      id: cache-node-modules
      with:
        path: node_modules
        key: modules-${{ hashFiles('package-lock.json') }}
    - name: Install dependencies
      if: steps.cache-node-modules.outputs.cache-hit != 'true'
      run: npm ci
    - name: Run Playwright tests
      run: |
        xvfb-run npx playwright test ${{ github.event.inputs.test_command || '--grep-invert "devRun"' }} --shard=${{ matrix.group }}/${{ github.event.inputs.parallelism || 2 }}
    - name: Upload test results and artifacts
      if: always()
      uses: actions/upload-artifact@v4
      with:
        name: test-results-${{ matrix.group }}
        path: |
          test-results/
          allure-results
        retention-days: 7

הג’וב nightly-test הוא המקום שבו מתבצעת הרצת הבדיקות בפועל, ג’וב זה משתמש במטריצה הדינמית כדי להריץ בדיקות במקביל. ההגדרה fail-fast: false באסטרטגיית המטריצה מונעת מהג’וב כולו להיכשל ברגע שתצורת מטריצה אחת נכשלת. משמעות הדבר היא שכל חלקי הבדיקה ימשיכו להתבצע, גם אם אחד או יותר נכשלים.

ג’וב זה משתמש ב-Docker Image מוגדר מראש שמגיע עם Playwright וכל הדפדפנים הדרושים מותקנים מראש. זה מאיץ משמעותית את תהליך הגדרת הבדיקה על ידי ביטול הצורך להריץ את הפקודה npx playwright install --with-deps, שיכולה לבזבז זמן מיותר, במיוחד בסביבות CI.

יכולת ה-Sharding המובנית של Playwright מנוצלת לחלוקת בדיקות על פני מספר מכונות, מה שמפחית באופן דרמטי את זמן הביצוע הכולל. ה-Sharding מוגדר באופן דינמי על בסיס המקביליות שהוזנה. לאחר הרצת הבדיקות, אנו מעלים את תוצאות ה-Allure. ה-artifacts שהועלו מכינים את הבמה לג’וב merge-reports, שם נאחד את התוצאות ונקבע את הסטטוס הכולל של חבילת הבדיקות.

merge-reports:
  needs: nightly-test
  if: always()
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - name: Download all test results
      uses: actions/download-artifact@v4
      with:
        path: artifacts
    - name: Merge Allure Results
      run: |
        mkdir -p allure-results
        for dir in artifacts/test-results-*/allure-results; do
          cp -r $dir/* allure-results/
        done
    - name: Link Git Information And Browser Version To Allure Report
      working-directory: allure-results
      if: always()
      run: |
        git config --global --add safe.directory "$GITHUB_WORKSPACE"
        {
          echo BUILD_URL=${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
          echo GIT_BRANCH=${{ github.head_ref || github.ref_name }}
          echo GIT_COMMIT_ID=${{ github.sha }}
          echo GIT_COMMIT_MESSAGE="$(git show -s --format=%s HEAD)"
          echo GIT_COMMIT_AUTHOR_NAME="$(git show -s --format='%ae' HEAD)"
          echo GIT_COMMIT_TIME="$(git show -s --format=%ci HEAD)"
        } >> environment.properties
    - name: Generate Allure Report
      uses: simple-elf/allure-report-action@master
      if: always()
      id: allure-report
      with:
        allure_results: allure-results
        allure_report: allure-report
        gh_pages: gh-pages
        allure_history: allure-history
    - name: Deploy Report To Github Pages
      if: always()
      uses: peaceiris/actions-gh-pages@v4
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        publish_dir: allure-history

הג’וב merge-reports נועד לאחד תוצאות בדיקה ממספר ריצות וליצור דוח Allure מקיף. הוא רץ לאחר הג’וב nightly-test ומבוצע גם אם ג’ובים קודמים נכשלים.

התהליך מתחיל בביצוע checkout לקוד הפרוייקט והורדת כל ה-Artifacts מהג’ובים הקודמים. הוא מאחד את כל תוצאות ה-Allure לספרייה אחת. כדי לספק הקשר, הוא מוסיף מידע סביבתי חשוב לדוח ה-Allure, כולל פרטי Git (כמו ענף, מזהה commit, הודעת commit, מחבר וזמן) וגרסת דפדפן הכרום ששימשה לבדיקה.

הג’וב לאחר מכן יוצר את דוח ה-Allure מהתוצאות הממוזגות הללו.

לבסוף, דוח ה-Allure שנוצר נפרס ל-GitHub Pages. זה הופך את הדוח לנגיש בקלות לחברי הצוות ולבעלי עניין, ומאפשר להם לצפות בתוצאות הבדיקה מבלי צורך להוריד או ליצור את הדוח באופן מקומי.

מסקנה

על ידי מינוף GitHub Actions ויכולות ה-Sharding המובנות של Playwright, יצרנו מסגרת בדיקות מקבילית יעילה לפרויקטי TypeScript. גישה זו מפחיתה משמעותית את זמן הביצוע, מספקת דיווח מקיף באמצעות Allure, ומשתלבת בצורה חלקה עם GitHub Pages לגישה נוחה לתוצאות הבדיקה.

הטיפול הפשוט יותר ב-artifacts וה-Sharding המובנה הופכים את המימוש הזה ב-TypeScript ליעיל יותר ממקבילו בפייתון. הוא מציע פתרון רב עוצמה לצוותים המעוניינים לייעל את תהליכי אוטומציית הבדיקות שלהם.

על ידי חידוד מתמיד של אסטרטגיית אוטומציית הבדיקות שלך בדרך זו, תוכל להבטיח לולאות פידבק מהירות יותר. התוצאה היא תהליך בדיקה מגיב ויעיל יותר שיכול לעמוד בקצב צרכי הפיתוח המודרניים.

בדיקות מהנות!


הציעו שינויים

מוכנים לבנות את מפת הדרכים שלכם? נתחיל כאן


הפוסט הקודם
אוטומציית בדיקות - האצת בדיקות Playwright Python עם הרצה מקבילית ב-GitHub Actions
הפוסט הבא
אוטומציית בדיקות - כיצד להשתמש בכתובות URL בסיסיות דינמיות עם Playwright TypeScript ב-GitHub Actions