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

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

פורסם:

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

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

כדי לייעל את זמן הביצוע, במיוחד עבור בדיקות רגרסיה, ניתן לחלק את עומס הבדיקות על פני מספר מכונות, ולהריץ בדיקות במקביל. מאמר זה בוחן כיצד להשתמש ב-GitHub Actions ו-pytest-split כדי להריץ בדיקות Playwright Python באופן מבוזר זה.

הפתרון המוצג במאמר זה מודגם בפרויקט הדוגמה שלי Playwright Python example project, שפותח בשיתוף עם אליאס שורוש.

מימוש הפתרון

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

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
  runs-on: ubuntu-latest
  strategy:
    fail-fast: false
    matrix: ${{ fromJson(needs.setup-matrix.outputs.matrix) }}
  steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: "3.12"
    - name: Install Poetry
      uses: snok/install-poetry@v1
      with:
        virtualenvs-create: true
        virtualenvs-in-project: true
        installer-parallel: true
    - name: Load cached venv
      id: cached-poetry-dependencies
      uses: actions/cache@v4
      with:
        path: .venv
        key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}
    - name: Install Dependencies
      run: poetry install --no-interaction --no-root
    - name: Install Playwright Browsers
      run: npx playwright install --with-deps
    - name: Run Tests
      run: |
        source .venv/bin/activate
        xvfb-run pytest ${{ github.event.inputs.pytest_command || '-m "not devRun"' }} \
          --base-url ${{ vars.BASE_URL }} \
          --splits ${{ github.event.inputs.parallelism || 2 }} \
          --group ${{ matrix.group }}
    - name: Upload test results and artifacts
      if: always()
      uses: actions/upload-artifact@v4.3.3
      with:
        name: test-results-${{ matrix.group }}
        path: |
          test-results/
          allure-results
        retention-days: 7

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

לאחר הרצת הבדיקות, אנו מעלים את תוצאות הבדיקה (Traces וסרטונים) ותוצאות 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 test results
      run: |
        mkdir -p merged-test-results
        for dir in artifacts/test-results-*/test-results; do
          cp -R $dir/* merged-test-results/
        done
    - name: Upload Merged Test Results
      uses: actions/upload-artifact@v4.3.4
      id: merged-artifact-upload
      with:
        name: merged-test-results
        path: merged-test-results/
        retention-days: 7
    - 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: |
        {
          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)"
          echo CHROME_VERSION=$(google-chrome --product-version)
        } >> environment.properties
    - name: Link Playwright Traces And Videos To Allure Report
      working-directory: allure-results
      if: failure()
      run: |
        echo ARTIFACT_URL=${{ steps.merged-artifact-upload.outputs.artifact-url }} >> 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 מהג’ובים הקודמים. לאחר מכן הוא ממזג את כל תוצאות הבדיקה לספרייה אחת ומעלה את הסט המאוחד הזה כ-Artifact חדש.

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

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

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

מסקנה

שילוב מטריצות דינמיות בתהליך העבודה של אוטומציית הבדיקות שלך יכול לשפר באופן משמעותי את היעילות של צינור ה-CI/CD שלך. השילוב של GitHub Actions, pytest-split ודיווח Allure יוצר מסגרת חזקה להרצת בדיקות מקבילית וניתוח תוצאות.

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

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


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

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


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