قالب إطار اختبار بسيط ومريح على selenide للاختبارات التلقائية لواجهة المستخدم

مرحبا.

في هذه المقالة ، أود أن أشارك تجربتي في أتمتة الاختبار الوظيفي. سيكون حول كتابة إطار اختبار مناسب وموثوق.

ما سنستخدمه: Java ، Selenide ، Alure ، TestNG ، Maven.



المقدمة


مشروع GitHub - SelenideBoilerplate .

في كثير من الأحيان في مقالات عن أتمتة الاختبار ، الأمثلة بعيدة عن الواقع ، على سبيل المثال:

driver.get (“URL”)
driver.find_element_by_id(“ID”).send_keys(“username”)
driver.find_element_by_id (“ID”).send_keys(“password”)
driver.find_element_by_id(“submit”).click()

هناك العديد من الأمثلة المماثلة للتوقعات وكائنات الصفحة وما إلى ذلك. ونتيجة لذلك ، قد يكون من الصعب على المختبر المبتدئ تنظيم كل شيء بشكل صحيح ومريح. المشروع متضخم بالعكازات ، لذلك أصبح من الصعب بشكل متزايد كتابة اختبارات جديدة والحفاظ على القديمة.

هناك أيضًا بعض الأدوات المطلقة والمعقدة في رأيي.

سوف أعرض إطار اختبار بسيط ومريح وقابل للتوسيع بسهولة ، وهو أسهل بكثير في العمل من السيلينيوم العادي والذي استخدمته بنجاح في العديد من المشاريع. هذا المشروع هو الأساس ، في المشاريع الحقيقية ، كل شيء أكثر تعقيدًا بعض الشيء (التوازي ، RemoteDriver ، العديد من الاختبارات ، إلخ).

أدوات


  • Selenide هي مكتبة لكتابة اختبارات واجهة مستخدم مفتوحة المصدر موجزة ومستقرة. يحل Selenide معظم مشاكل المهلات ، والنقرات على العناصر التي لم تتمكن من التحميل ، وما إلى ذلك. يمكنك أيضًا نسيان StaleElementReferenceException . أداة مريحة للغاية وسهلة التعلم ، بعد العمل الذي لم تعد ترغب في العودة إلى السيلينيوم.
  • WebDriverManager - مضمن في Selenide. مكتبة تقوم بكل عمل تنزيل برامج التشغيل لمتصفح وتحديد مسارات برنامج التشغيل -
     System.setProperty("webdriver.browser.driver", "/path_to_driver/driver"); 
  • جاذبية للتقارير.
  • TestNG هو إطار اختبار.
  • Maven هي أداة لأتمتة تجميع المشاريع.

هيكل المشروع




دعونا نبدأ مع التطبيق و صفحات وحدات .

فئة PageBuilder


عادة ، تعطي الأمثلة صفحات بسيطة إلى حد ما حيث يناسب كل شيء في فصل واحد. ولكن في المشاريع الحقيقية ، قد تكون هناك صفحات كبيرة جدًا ، تصف جميع الوظائف التي ليست أفضل فكرة في فئة واحدة. على سبيل المثال ، قد تكون هذه صفحة إعادة شحن تحتوي على العديد من أشكال أنظمة الدفع المختلفة.

في هذه الحالة ، من الأفضل تقسيم الصفحة إلى عدة فئات وحتى عناصر (على سبيل المثال ، منتج في السلة) وتجميعها معًا في الفئة الرئيسية للصفحة.

لذلك ، من الأفضل إنشاء جميع الصفحات في مكان واحد ، وبالتحديد في فئة PageBuilder .

package app;

import app.pages.LoginPage;

public class PageBuilder {

    public static LoginPage buildLoginPage() {
        return new LoginPage("/login");
    }

    public static BalancePage buildBalancePage() {
        DepositForm depositForm = new DepositForm();
        WithdrawalForm withdrawalForm = new WithdrawalForm();
        return new BalancePage("/balance", depositForm, withdrawalForm);
    }
}


فئة AppConfig


يخزن فئة AppConfig إعدادات تطبيق الويب قيد الاختبار. على سبيل المثال - عنوان الموقع ومستخدمي الاختبار وما إلى ذلك. في هذا المشروع ، هذا هو ببساطة عنوان الموقع.

package app;

public class AppConfig {

    public static final String baseUrl = "https://google.com";

}

فئة التطبيق


هذه هي الفئة الرئيسية في هذه الوحدة. يتم إنشاء كافة الصفحات في مُنشئ فئة التطبيقات .

package app;

import app.pages.LoginPage;

public class App {

    public LoginPage loginPage;

    public App() {
        loginPage = PageBuilder.buildLoginPage();
    }
}

بفضل هذا النهج ، ليس من الضروري إنشاء كائنات الصفحة باستمرار في الاختبارات ، حيث يتم فقط إنشاء كائن التطبيق الذي يتم الحصول على الصفحات الضرورية منه.

أيضًا في فئة التطبيقات ، قد تكون هناك طرق مثل - التسجيل والتسجيل وإنشاء الطلب ، إلخ.

وهذا هو ، العمليات الكبيرة التي تتضمن العديد من كائنات الصفحة والتي غالبًا ما تكون مطلوبة في الاختبارات.

دعنا ننتقل إلى كائنات الصفحة


بفضل Selenide ، من السهل العمل مع كائنات الصفحة. ترث جميع الصفحات من الفئة الأساسية BasePage . يتم تمرير عنوان URL النسبي إلى مُنشئ كائن الصفحة.

تحتوي جميع عناصر الصفحة على مُعدِّل وصول عام ، لذا يمكنك كتابة الاختبارات في كل من الأنماط الحتمية والإعلانية. أيضًا ، من العناصر ، يمكنك الحصول على البيانات اللازمة ، مثل النص أو بعض السمات.

يتم تخزين محدد الموقع في مكان واحد فقط. يجب وصف كل منطق الصفحة في طرق الصفحة.

باستخدام هذا النهج ، إذا انكسر شيء ما أو تغير ، في معظم الحالات ليس من الضروري إعادة كتابة الاختبارات ، يتم الانتهاء من الطريقة للتو أو يتغير محدد الموقع إلى الاختبار الفعلي.


package app.pages;

import com.codeborne.selenide.SelenideElement;
import helpers.Driver;
import static com.codeborne.selenide.Selenide.*;

public class LoginPage extends BasePage {

    public SelenideElement loginField = $("#login__username");
    public SelenideElement passwordField = $("#login__password");
    public SelenideElement signInButton = $("#login_enter");
    public SelenideElement termsOfUseLabel = $("label[for=\"login_agree\"]");

    public LoginPage(String pageUrl) {
        super(pageUrl);
    }
    
    public void login(String email, String password) {
        loginField.setValue(email);
        passwordField.setValue(password);
        termsOfUseLabel.click();
        signInButton.click();
        Driver.waitForUrlContains("account/accounts");
    }
}


راحة


تحتوي وحدة المساعدون على فئتين

مهمتين : TestConfig - من هذا الفصل ، يمكنك الحصول على الإعدادات التي يتم تشغيل الاختبارات بها. الإعدادات الافتراضية معروضة هنا أيضًا.

يتم تشغيل الاختبارات بواسطة الأمر. mvn test -Dbrowser=chrome -Dheadless=1

يتم أخذ قيم المتغيرات من سطر الأوامر ، وبفضل فئة TestConfig ، تتوفر في الاختبارات وفي التطبيق.

على سبيل المثال ، يمكنك تغيير عنوان URL الخاص بالتطبيق وفقًا للبيئة (dev ، stage ، production).


package helpers;

public class TestConfig {

    public static String browser = "chrome";
    public static String headless = "1";

    public static void initConfig() {
        browser = System.getProperty("browser") == null ? "chrome" : System.getProperty("browser");
        headless = System.getProperty("headless") == null ? "1" : System.getProperty("headless");
    }

    public static boolean isHeadless() {
        return headless.contains("1");
    }
}

إن فئة Driver هي الغلاف الخاص بي حول السائقين للسيلينيوم والسيلينايد مع بعض الطرق المفيدة.

أهم الطرق:

Driver.initDriver () - هنا تتم تهيئة برنامج التشغيل / المتصفح.

   public static void initDriver() {

        // Get settings from command line

        TestConfig.initConfig();

        // Set settings for selenide browser

        Configuration.pageLoadStrategy = "eager";
        Configuration.browserSize = "1920x1080";
        Configuration.holdBrowserOpen = false;
        Configuration.screenshots = false;

        if(TestConfig.isHeadless()) {
            Configuration.headless = true;
        } else {
            Configuration.headless = false;
        }

        switch (TestConfig.browser) {
            case "chrome":
                Configuration.browser = Browsers.CHROME;
                break;
            case "firefox":
                Configuration.browser = Browsers.FIREFOX;
                break;
            default:
                Configuration.browser = Browsers.CHROME;
                break;
        }
    }

Driver.clearCookies()
Driver.close()

الاختبارات


جميع فئات الاختبار موروثة من فئة A_BaseTest ، حيث يتم إنشاء كائن تطبيق التطبيق ، ومسجل ، و softAssert ، ويفتح المتصفح ويغلق ، ويتم مسح ملفات تعريف الارتباط بعد كل اختبار.

يوجد أيضًا A_BaseTestListener حيث يمكن تسجيل الأخطاء.

تبدو الاختبارات شيء من هذا القبيل. سهلة القراءة وسهلة الصيانة.

import org.testng.annotations.Test;

public class ExampleTest extends A_BaseTest
{
    @Test
    public void loginViaEmail() {
        app.loginPage.open();
        app.loginPage.login("email@email.com", "passwords");
        
        logger.info("Sample info message");
               
        softAssert.assertEquals(2,2);
        softAssert.assertAll();
    }
}

فئات الاختبار محددة في testng.xml .

يحتوي مجلد اختبار الإخراج على سجلات ولقطات شاشة - Driver.takeScreenshot () .

بالنسبة للتقارير ، يتم استخدام Allure . بعد اكتمال الاختبارات ، يمكنك تشغيل الأمر allure serve target/allure-resultsورؤية التقرير.

مشروع جيثب - SelenideBoilerplate

All Articles