Templat kerangka kerja pengujian yang sederhana dan nyaman pada selenide untuk autotest UI

Halo.

Pada artikel ini, saya ingin berbagi pengalaman saya dalam mengotomatisasi pengujian fungsional. Ini akan tentang menulis kerangka kerja pengujian yang nyaman dan dapat diandalkan.

Apa yang akan kita gunakan: Java, Selenide, Alure, TestNG, Maven.



pengantar


Proyek GitHub - SelenideBoilerplate .

Seringkali dalam artikel tentang otomatisasi pengujian, contohnya jauh dari kenyataan, misalnya:

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()

Ada banyak contoh harapan yang serupa, objek halaman, dll. Akibatnya, sulit bagi tester pemula untuk mengatur semuanya dengan benar dan nyaman. Proyek ini ditumbuhi kruk, itulah sebabnya semakin sulit untuk menulis tes baru dan mempertahankan yang lama.

Ada juga beberapa alat yang terlalu bertele-tele dan rumit menurut saya.

Saya akan menunjukkan kerangka kerja pengujian yang sederhana, nyaman dan mudah diperluas, yang jauh lebih mudah untuk dikerjakan dibandingkan selenium biasa dan yang telah berhasil saya gunakan pada beberapa proyek. Proyek ini adalah dasar, pada proyek nyata semuanya sedikit lebih rumit (paralelisasi, remoteDriver, banyak tes, dll.).

Alat


  • Selenide adalah perpustakaan untuk menulis tes UI open source yang ringkas dan stabil. Selenide menyelesaikan sebagian besar masalah dengan timeout, klik pada item yang tidak berhasil dimuat, dll. Anda juga bisa melupakan StaleElementReferenceException . Alat yang sangat mudah dan mudah dipelajari, setelah bekerja dengan yang Anda tidak ingin kembali ke selenium.
  • WebDriverManager - Termasuk dalam Selenide. Perpustakaan yang melakukan semua pekerjaan pengunduhan driver untuk browser dan pengaturan jalur driver -
     System.setProperty("webdriver.browser.driver", "/path_to_driver/driver"); 
  • Daya pikat untuk laporan.
  • TestNG adalah kerangka uji.
  • Maven adalah alat untuk mengotomatisasi perakitan proyek.

Struktur proyek




Mari kita mulai dengan modul aplikasi dan halaman .

Kelas PageBuilder


Biasanya, contoh memberikan halaman yang cukup sederhana di mana semuanya cocok dalam satu kelas. Tetapi pada proyek nyata, mungkin ada halaman yang cukup besar, menggambarkan semua fungsi yang dalam satu kelas bukan ide terbaik. Misalnya, ini bisa berupa halaman isi ulang dengan berbagai bentuk sistem pembayaran yang berbeda.

Dalam hal ini, lebih baik untuk membagi halaman menjadi beberapa kelas dan bahkan elemen (misalnya, produk dalam keranjang) dan menempatkan semuanya bersama-sama di kelas utama halaman.

Karena itu, lebih baik membuat semua halaman di satu tempat, yaitu di kelas 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);
    }
}


Kelas AppConfig


Kelas AppConfig menyimpan pengaturan aplikasi web yang sedang diuji. Misalnya - alamat situs, pengguna uji, dll. Dalam proyek ini, ini hanya alamat situs.

package app;

public class AppConfig {

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

}

Kelas aplikasi


Ini adalah kelas utama dalam modul ini. Di konstruktor kelas App , semua halaman dibuat.

package app;

import app.pages.LoginPage;

public class App {

    public LoginPage loginPage;

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

Berkat pendekatan ini, tidak perlu terus-menerus membuat objek halaman dalam pengujian, hanya objek App yang dibuat dari mana halaman yang diperlukan diperoleh.

Juga di kelas Aplikasi mungkin ada metode seperti - pendaftaran, pendaftaran dan pembuatan pesanan, dll.

Yaitu, operasi besar yang melibatkan beberapa objek halaman dan yang sering diperlukan dalam pengujian.

Mari kita beralih ke objek halaman


Berkat Selenide, bekerja dengan objek halaman mudah. Semua halaman mewarisi dari kelas dasar BasePage . Url halaman relatif diteruskan ke konstruktor objek halaman.

Semua elemen halaman memiliki pengubah akses publik , sehingga Anda dapat menulis tes dengan gaya imperatif dan deklaratif. Juga, dari elemen Anda bisa mendapatkan data yang diperlukan, seperti teks atau atribut.

Locator disimpan di satu tempat saja. Semua logika halaman harus dijelaskan dalam metode halaman.

Dengan pendekatan ini, jika ada yang rusak atau berubah, dalam kebanyakan kasus tidak perlu menulis ulang tes, metode baru saja selesai atau pelacak berubah ke yang sebenarnya.


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");
    }
}


Beristirahat


Modul helpers berisi 2 kelas penting:

TestConfig - Dari kelas ini Anda bisa mendapatkan pengaturan dengan tes yang dijalankan. Pengaturan standar juga ditampilkan di sini.

Pengujian dijalankan oleh perintah. mvn test -Dbrowser=chrome -Dheadless=1

Nilai variabel diambil dari baris perintah dan, terima kasih kepada kelas TestConfig, tersedia dalam tes dan dalam aplikasi.

Misalnya, Anda dapat mengubah url aplikasi tergantung pada lingkungan (dev, stage, produksi).


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");
    }
}

Kelas Driver adalah pembungkus saya di sekitar driver selenium dan selenide dengan beberapa metode yang berguna.

Metode yang paling penting:

Driver.initDriver () - di sini driver / browser diinisialisasi.

   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()

Tes


Semua tes kelas diwarisi dari A_BaseTest kelas , di mana App objek aplikasi dibuat , logger , softAssert , browser akan terbuka dan menutup, cookie dibersihkan setelah setiap tes.

Ada juga A_BaseTestListener tempat kesalahan dapat dicatat.

Tesnya terlihat seperti ini. Mudah dibaca, mudah dirawat.

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();
    }
}

Kelas tes ditentukan dalam testng.xml .

Folder uji-output berisi log dan tangkapan layar - Driver.takeScreenshot () .

Untuk laporan, Allure digunakan . Setelah tes selesai, Anda dapat menjalankan perintah allure serve target/allure-resultsdan melihat laporan.

Proyek GitHub - SelenideBoilerplate

All Articles