האתגר של זמני הרצת בדיקות ארוכים
באוטומציית בדיקות, הפחתת זמן הביצוע מבלי להתפשר על התוצאות היא חיונית, במיוחד כאשר חבילות הבדיקות גדלות בפרויקטים גדולים עם צרכי בדיקה מתמשכים. הדבר עלול להפוך לצוואר בקבוק בעת הרצת כל הבדיקות.
מאמר זה בוחן כיצד למנף את GitHub Actions ואת יכולות ה-sharding המובנות של Playwright כדי להריץ בדיקות TypeScript במקביל, ובכך להפחית משמעותית את זמן הביצוע הכולל.
שיתפתי את הפתרון המוצג במאמר זה בפרויקט הדוגמה שלי Playwright Typescript example project.
הבדלים עיקריים מהמימוש בפייתון:
- תמיכה מובנית ב-Sharding: בניגוד לגרסת הפייתון שדרשה את pytest-split, ל-Playwright עבור TypeScript יש יכולות Sharding מובנות. זה מבטל את הצורך בספריות נוספות לחלוקת הבדיקות.
- טיפול פשוט יותר (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 ליעיל יותר ממקבילו בפייתון. הוא מציע פתרון רב עוצמה לצוותים המעוניינים לייעל את תהליכי אוטומציית הבדיקות שלהם.
על ידי חידוד מתמיד של אסטרטגיית אוטומציית הבדיקות שלך בדרך זו, תוכל להבטיח לולאות פידבק מהירות יותר. התוצאה היא תהליך בדיקה מגיב ויעיל יותר שיכול לעמוד בקצב צרכי הפיתוח המודרניים.
בדיקות מהנות!