Plantilla de marco de prueba simple y conveniente en seleniuro para autotests de IU

Hola.

En este artículo, me gustaría compartir mi experiencia en la automatización de pruebas funcionales. Se tratará de escribir un marco de prueba conveniente y confiable.

Lo que usaremos: Java, Selenide, Alure, TestNG, Maven.



Introducción


Proyecto GitHub - SelenideBoilerplate .

A menudo, en artículos sobre automatización de pruebas, los ejemplos están lejos de la realidad, por ejemplo:

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

Hay muchos ejemplos similares de expectativas, objetos de página, etc. Como resultado, puede ser difícil para un evaluador novato organizar todo de manera correcta y conveniente. El proyecto está cubierto de muletas, por lo que cada vez es más difícil escribir nuevas pruebas y mantener las viejas.

También hay algunas herramientas que son demasiado detalladas y complicadas en mi opinión.

Mostraré un marco de prueba simple, conveniente y fácilmente extensible, que es mucho más fácil de trabajar que el selenio normal y que he utilizado con éxito en varios proyectos. Este proyecto es la base, en proyectos reales todo es un poco más complicado (paralelización, RemoteDriver, muchas pruebas, etc.).

Herramientas


  • Selenide es una biblioteca para escribir pruebas de interfaz de usuario de código abierto concisas y estables. Selenide resuelve la mayoría de los problemas con tiempos de espera, clics en elementos que no lograron cargar, etc. También puede olvidarse de la StaleElementReferenceException . Una herramienta muy conveniente y fácil de aprender, después de haber trabajado con la que ya no desea volver al selenio.
  • WebDriverManager - Incluido en Selenide. Una biblioteca que hace todo el trabajo de descargar controladores para un navegador y configurar rutas de controladores:
     System.setProperty("webdriver.browser.driver", "/path_to_driver/driver"); 
  • Fascinación por los informes.
  • TestNG es un marco de prueba.
  • Maven es una herramienta para automatizar el montaje de proyectos.

Estructura del proyecto




Comencemos con la aplicación y los módulos de páginas .

Clase PageBuilder


Por lo general, los ejemplos dan páginas bastante simples donde todo cabe en una clase. Pero en proyectos reales, puede haber páginas bastante grandes, que describen toda la funcionalidad de las cuales en una clase no es la mejor idea. Por ejemplo, esta podría ser una página de recarga con muchas formas de diferentes sistemas de pago.

En este caso, es mejor dividir la página en varias clases e incluso elementos (por ejemplo, un producto en la cesta) y poner todo junto en la clase principal de la página.

Por lo tanto, es mejor crear todas las páginas en un solo lugar, es decir, en la clase 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);
    }
}


Class AppConfig


La clase AppConfig almacena la configuración de la aplicación web bajo prueba. Por ejemplo: la dirección del sitio, los usuarios de prueba, etc. En este proyecto, esta es solo la dirección del sitio.

package app;

public class AppConfig {

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

}

Clase de aplicación


Esta es la clase principal en este módulo. En el constructor de la clase App , se crean todas las páginas.

package app;

import app.pages.LoginPage;

public class App {

    public LoginPage loginPage;

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

Gracias a este enfoque, no es necesario crear constantemente objetos de página en las pruebas, solo se crea el objeto Aplicación a partir del cual se obtienen las páginas necesarias.

También en la clase de aplicación puede haber métodos tales como: registro, registro y creación de pedidos, etc.

Es decir, grandes operaciones en las que intervienen varios objetos de página y que a menudo se necesitan en las pruebas.

Pasemos a los objetos de página


Gracias a Selenide, trabajar con objetos de página es fácil. Todas las páginas heredan de la clase base BasePage . La URL relativa de la página se pasa al constructor del objeto de la página.

Todos los elementos de la página tienen un modificador de acceso público , por lo que puede escribir pruebas en estilos imperativos y declarativos. Además, de los elementos puede obtener los datos necesarios, como texto o algún atributo.

El localizador se almacena en un solo lugar. Toda la lógica de la página debe describirse en los métodos de la página.

Con este enfoque, si algo se rompe o cambia, en la mayoría de los casos no es necesario reescribir las pruebas, el método acaba de finalizar o el localizador cambia al real.


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


Descanso


El ayudantes módulo contiene 2 clases importantes:

TestConfig - A partir de esta clase, usted puede obtener la configuración con la que se ejecutan las pruebas. La configuración predeterminada también se muestra aquí.

El comando ejecuta las pruebas. mvn test -Dbrowser=chrome -Dheadless=1

Los valores de las variables se toman de la línea de comandos y, gracias a la clase TestConfig, están disponibles en las pruebas y en la aplicación.

Por ejemplo, puede cambiar la URL de la aplicación según el entorno (desarrollo, etapa, producción).


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

La clase Driver es mi envoltorio alrededor del selenio y los controladores de seleniuro con un par de métodos útiles.

Los métodos más importantes:

Driver.initDriver () : aquí se inicializa el controlador / navegador.

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

Pruebas


Todas las clases de prueba se heredan del A_BaseTest clase , en el que la aplicación se crea objeto de aplicación , registrador , softAssert , el navegador abre y se cierra, las cookies se borran después de cada prueba.

También hay un A_BaseTestListener donde se pueden registrar errores.

Las pruebas se parecen a esto. Fácil de leer, fácil de mantener.

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

Las clases de prueba se especifican en testng.xml .

La carpeta de salida de prueba contiene registros y capturas de pantalla: Driver.takeScreenshot () .

Para los informes, se usa Allure . Después de completar las pruebas, puede ejecutar el comando allure serve target/allure-resultsy ver el informe.

Proyecto GitHub - SelenideBoilerplate

All Articles