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

אוטומציית בדיקות - שיפור קריאות הקוד באמצעות תבנית הבנאי (Builder Pattern)

פורסם:

הקדמה

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

אראה במאמר זה כיצד לשפר מתודת התחברות מהעברת שתי מחרוזות “username” ו-”password” להעברת אובייקט משתמש, ולבסוף ליישם את תבנית הבנאי ליצירת אובייקט המשתמש.

נקודת התחלה — התחברות באמצעות מתודה המקבלת שני פרמטרים מסוג String

נקודת ההתחלה מכילה מחלקת Page Object של דף התחברות הכוללת אלמנטי רשת של התחברות ומתודת התחברות, ומחלקה המכילה מתודת בדיקה המשתמשת ב-Page Object זה כדי להתחבר למערכת שלנו ולוודא שאנחנו מחוברים.

public class LoginPage {
    public WebDriver driver;

    public LoginPage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    @FindBy(id = "username")
    private WebElement userName;

    @FindBy(id = "password")
    private WebElement userPassword;

    public void loginAs(String name, String password) {
        userName.clear();
        userPassword.clear();
        userName.sendKeys(name);
        userPassword.sendKeys(password);
        userPassword.sendKeys(Keys.ENTER);
    }
}

זוהי מתודת הבדיקה שלנו:

@Test(description = "valid Login")
public void validLogin(String baseUrl) throws Exception {
    LoginPage loginPage = new LoginPage(driver);
    loginPage.loginAs("test@test.com", "Test");
    assertThat(driver.getCurrentUrl()).isEqualTo(baseUrl + "/secure");
}

בהסתכלות על מתודת ההתחברות, לא ברור מה אנו מעבירים למתודה זו כדי להתחבר. ללא תיאור הבדיקה, קשה לדעת מבלי להריץ את הבדיקה.

התחלת השיפור - התחברות באמצעות אובייקט משתמש

אנו יכולים לשפר את הקריאות על ידי שימוש באובייקט משתמש. בואו נעשה זאת.

ראשית, עלינו ליצור מחלקת משתמש, שהיא תבנית ליצירת אובייקט המשתמש שלנו.

@Data
public class User {

    private String name;
    private String password;

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }
}

עלינו לשנות את מתודת ההתחברות כך שתקבל אובייקט משתמש.

public void loginAs(User user) {
    userName.clear();
    userPassword.clear();
    userName.sendKeys(user.getName());
    userPassword.sendKeys(user.getPassword());
    userPassword.sendKeys(Keys.ENTER);
}

כפי שניתן לראות, קריאות מקרה הבדיקה שלנו השתפרה.

@Test(description = "valid Login")
public void validLogin(String baseUrl) throws Exception {
    User validUser = new User("test@test.com", "Test");
    LoginPage loginPage = new LoginPage(driver);
    loginPage.loginAs(validUser);
    assertThat(driver.getCurrentUrl()).isEqualTo(baseUrl + "/secure");
}

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

אל דאגה, תבנית הבנאי באה לעזרתנו.

סיום שיפור קריאות הבדיקה - שימוש בתבנית הבנאי

ראשית, הסבר קצר על התבנית, שנלקח מכאן:

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

בואו נראה את תבנית הבנאי בפעולה כאשר רוצים ליצור משתמש. אנו משתמשים באנוטציות @Data ו-@Accessors של פרויקט lombok כדי ליצור getters ו-setters ולשרשר אותם עד ליצירת האובייקט - זה ידוע כממשק רהוט (fluent interface).

@Data
public class User {
    private String name;
    private String password;

    @Data
    public static class Builder {
        @Accessors(chain = true)
        private String name;
        @Accessors(chain = true)
        private String password;

        public User create() {
            User user = new User();
            user.name = this.name;
            user.password = this.password;
            return user;
        }
    }

    private User() {
        // Constructor is private.
    }
}

בואו נעשה ריפקטורינג למתודת ההתחברות שלנו כדי להשתמש בבנאי המשתמש.

@Test(description = "valid Login")
public void validLogin(String baseUrl) throws Exception {
    User validUser = new User
        .Builder()
        .setName("test@test.com")
        .setPassword("Test")
        .create();

    LoginPage loginPage = new LoginPage(driver);
    loginPage.loginAs(validUser);
    assertThat(driver.getCurrentUrl()).isEqualTo(baseUrl + "/secure");
}

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

לסיכום

במאמר זה, סקרנו את תבנית העיצוב של הבנאי ואת יתרונותיה.

קריאה נוספת על תבניות עיצוב ב-Java ניתן למצוא בקישור זה.

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


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

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


הפוסט הקודם
אוטומציית בדיקות - כיצד למחש (Dockerize) את בדיקות ה-API שלנו
הפוסט הבא
אוטומציית בדיקות - עבודה עם רשתות באמצעות Java ו-PowerShell