האתגר של זמני הרצת בדיקות ארוכים
באוטומציית בדיקות, הפחתת זמן הביצוע מבלי להתפשר על התוצאות היא חיונית, במיוחד כאשר חבילות הבדיקות גדלות בפרויקטים גדולים עם צרכי בדיקה מתמשכים. הדבר עלול להפוך לצוואר בקבוק בעת הרצת כל הבדיקות.
כדי לייעל את זמן הביצוע, במיוחד עבור בדיקות רגרסיה, ניתן לחלק את עומס הבדיקות על פני מספר מכונות, ולהריץ בדיקות במקביל. מאמר זה בוחן כיצד להשתמש ב-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 יוצר מסגרת חזקה להרצת בדיקות מקבילית וניתוח תוצאות.
על ידי חידוד מתמיד של אסטרטגיית אוטומציית הבדיקות שלך בדרך זו, תוכל להבטיח לולאות פידבק מהירות יותר ולשמור על אספקת תוכנה באיכות גבוהה. התוצאה היא תהליך בדיקה מגיב ויעיל יותר שיכול לעמוד בקצב צרכי הפיתוח המודרניים.
בדיקות מהנות!