מבוא
בתחום בדיקות יישומי רשת, אחד האתגרים החוזרים ונשנים טמון בצורך לבצע אימות או התחברות בכל איטרציית בדיקה. תהליך חזרתי זה צורך זמן בדיקה יקר. כאשר כל בדיקה פותחת דף דפדפן חדש, התקורה של האימות יכולה להצטבר במהירות, ולהאט את צינור הבדיקות.
למרבה המזל, כלי אוטומציה מודרניים לדפדפנים כמו Playwright מציעים יכולות שיכולות לעזור להקל על נקודת כאב זו. על ידי מינוף פונקציונליות אחסון הסשן של Playwright, ניתן לשמר סשנים מאומתים על פני מספר בדיקות, ובכך לבטל את הצורך בצעדי התחברות מיותרים.
הפתרון המוצג במאמר זה מודגם בFixtures של Pytest המשולבות בפרויקט הדוגמה שלי Playwright Python example project, שפותח בשיתוף עם אליאס שורוש. Fixtures אלו לא רק מציגות את פרטי המימוש, אלא גם משמשות כהתייחסות מעשית לשילוב אימות מתמשך בתהליכי הבדיקה שלכם, ומעצימות אתכם למקסם את פרודוקטיביות הבדיקות שלכם.
מימוש הפתרון
ניתן למצוא את קוד הפתרון כאן.
@pytest.fixture(scope="function")
def browser_context_args(
browser_context_args: Dict, base_url: str, request: SubRequest
):
"""This fixture allows setting browser context arguments for Playwright.
Args:
browser_context_args (dict): Base browser context arguments.
request (SubRequest): Pytest request object to get the 'browser_context_args' fixture value.
base_url (str): The base URL for the application under test.
Returns:
dict: Updated browser context arguments.
See Also:
https://playwright.dev/python/docs/api/class-browser#browser-new-context
"""
context_args = {
**browser_context_args,
"no_viewport": True,
"user_agent": Constants.AUTOMATION_USER_AGENT,
}
if hasattr(request, "param"):
context_args["storage_state"] = {
"cookies": [
{
"name": "session-username",
"value": request.param,
"url": base_url,
}
]
}
return context_args
Fixture זו של Pytest נועדה להגדיר את הארגומנטים עבור context דפדפן של Playwright. בואו נפרק את הקוד:
@pytest.fixture(scope=“function”):
- Decorator זה מגדיר Fixture בהיקף פונקציה (function-scoped), כלומר היא מבוצעת לפני כל פונקציית בדיקה. זה מספק גמישות להתאים ארגומנטים של context לבדיקות ספציפיות.
פרמטרים:
- browser_context_args (dict): מקבל ארגומנטים בסיסיים של context הדפדפן, ומאפשר שינוי.
- request (SubRequest): מספק גישה לתכונות ספציפיות של Pytest, כולל אחזור ערכים מFixtures אחרות.
- base_url (str): מחזיק את כתובת ה-URL הבסיסית של היישום הנבדק, המשמשת להגדרת context הcookies.
ערך מוחזר:
- dict: מחזיר מילון המכיל את ארגומנטי context הדפדפן המעודכנים, מוכנים לשימוש בפעולות Playwright.
פעולות מפתח:
- מקסום חלון הדפדפן: הוסבר במאמר קודם
- טיפול מותנה בcookies:
- בודק אם לאובייקט יש תכונה (מה שמצביע על פרמטריזציה של בדיקה).
- אם קיים, בונה מבנה פנימי להגדרת עוגייה: שם העוגייה: ערך העוגייה: (ערך הפרמטר מהבדיקה) דומיין העוגייה: (כתובת ה-URL הבסיסית של היישום).
נקודות עיקריות:
- הFixture מציעה שליטה גרעינית על הגדרת context הדפדפן עבור פונקציות בדיקה בודדות.
- היא משלבת לוגיקה מותנית לניהול cookies, ומאפשרת התאמה אישית של הcontext על בסיס פרמטרי הבדיקה.
- היא מדגימה את יכולותיו של Playwright לקביעת תצורה של context והגדרת בדיקות עם Pytest.
@pytest.fixture(scope="function", autouse=True)
def goto(page: Page, request: SubRequest):
"""Fixture to navigate to the base URL based on the user.
If the 'storage_state' is set in 'browser_context_args', it navigates to the inventory page,
otherwise, it navigates to the login page.
Args:
page (Page): Playwright page object.
request (SubRequest): Pytest request object to get the 'browser_context_args' fixture value.
If 'browser_context_args' is set to a user parameter (e.g., 'standard_user'),
the navigation is determined based on the user.
Example:
@pytest.mark.parametrize('browser_context_args', ["standard_user"], indirect=True)
"""
if request.getfixturevalue("browser_context_args").get("storage_state"):
page.goto("/inventory.html")
else:
page.goto("")
Fixture זו מבצעת ניווט אוטומטי לכתובת URL ספציפית בתוך פונקציית בדיקה, תוך התאמה על בסיס context המשתמש.
@pytest.fixture(scope=“function”, autouse=True):
- Decorator זה מגדיר Fixture בהיקף פונקציה () שמתבצעת אוטומטית לפני כל פונקציית בדיקה בזכות . זה מבטיח שהניווט יתרחש באופן עקבי עבור כל בדיקה.
פרמטרים:
- page (Page): מקבל אובייקט Playwright המייצג את לשונית הדפדפן או החלון הנמצא בשימוש.
- request (SubRequest): מספק גישה לפונקציונליות של Pytest, כולל אחזור ערכים מFixtures אחרות כמו .
לוגיקת ניווט:
- בחירת URL מותנית: כדי לבדוק אם הFixture מכילה מפתח. מציין משתמש מחובר.
- ניווט מבוסס context משתמש:
- אם קיים (משתמש מחובר): מנווט את הדף אל , בהנחה שזהו דף המלאי עבור משתמשים מחוברים.
- אחרת (אין , משתמש חדש): מנווט לדף ההתחברות.
נקודות עיקריות:
- Fixture זו מייעלת את הניווט על ידי הפניית משתמשים אוטומטית לכתובות ה-URL המתאימות בהתבסס על סטטוס ההתחברות שלהם.
- היא מדגימה מינוף של למודעות לcontext המשתמש במהלך ביצוע הבדיקה.
שימוש בבדיקה
ניתן למצוא את השימוש בבדיקה כאן.
@pytest.mark.parametrize("browser_context_args", ["standard_user"], indirect=True)
def test_inventory_page(self, browser_context_args, page: Page):
assert page.inner_text("//span[@class='title']") == "Products"
Decorator הבדיקה:
- : Decorator זה מ-pytest מחיל פרמטריזציה על הבדיקה. מציין: שם הפרמטר: ערכים לבדיקה: רשימה המכילה (סוג משתמש להגדרת context הדפדפן) מציין שהFixture משמשת לספק את הערך, ולא מועברת ישירות כמחרוזת.
פרמטרים של פונקציית הבדיקה:
- : פרמטר זה הוא הפניה למופע של מחלקת הבדיקה.
- פרמטר זה מקבל את הערך מהFixture, אשר מגדירה את context הדפדפן בהתבסס על סוג המשתמש שסופק.
- פרמטר זה מקבל אובייקט Playwright, המייצג את לשונית הדפדפן או החלון הנבדק.
לסיכום
הקוד שסופק מציג את המימוש של Fixtures Pytest ב-Python Playwright כדי להתגבר על האתגר של דרישות התחברות מחדש תכופות במהלך בדיקות דפדפן. על ידי מינוף יכולת אחסון הסשן של Playwright בתוך Fixtures Pytest, מהנדסי אוטומציה יכולים לשמור על סשנים מתמשכים על פני מספר בדיקות, ובכך לשפר משמעותית את יעילות ופרודוקטיביות הבדיקות. הFixtures מנהלות בצורה חכמה את ארגומנטי context הדפדפן, ומבטיחות שכל איטרציית בדיקה נפתחת בתוך סשן קיים עם cookies מוגדרות מראש, ומבטלות את הצורך בהליכי התחברות חוזרים ונשנים. גישה זו מייעלת את זרימת העבודה של הבדיקות ומשפרת את האמינות הכוללת של בדיקות הדפדפן. בנוסף, שימוש קטן בבדיקה מדגים כיצד הFixtures משתלבות בצורה חלקה בתרחישי בדיקה, ומדגיש עוד יותר את המעשיות והיעילות שלהן בסביבות בדיקה בעולם האמיתי.
בדיקות מהנות!