Patrones para probadores. Proxy (alternativo)

Antes de eso


Hola Soy Dima y no conozco los patrones. En cuanto al probador, no quiere decir que sea problemático. ¿Cómo para un automatizador ..? Bueno, seamos honestos, tú también puedes vivir.

Desde las salas de chat, conferencias y comunicación con colegas, está claro: el patrón principal, PageObject, se aprende, ¿qué más se necesita?

Y aquí había un gran párrafo de pensamientos sobre por qué realmente no usamos patrones de diseño: ¿no los conocemos o es bueno sin ellos? También hubo profundizaciones en la historia de que los patrones no son para usted, sino que durante décadas han demostrado conocimiento y técnicas, argumentos y menciones de compañeros conocidos que están en contra.

Pero, en última instancia, conocer los patrones definitivamente no hará daño.

Por lo tanto, de ninguna manera te insto a que retires plantillas en todas partes en código, empiezo a publicar una serie de artículos sobre patrones.

Un poco más sobre el formato y vamos


Los artículos / libros / cursos de video sobre patrones en sí mismos son bastante decentes. Y estoy seguro de que puede encontrar fácilmente un recurso con una explicación competente, ejemplos de su YP favorito, correos electrónicos, etc.

La tarea de este y otros artículos posteriores es hablar sobre patrones a aquellos que ya trabajan con el código, pero que no tienen una buena base teórica. Entonces, estos artículos son quizás para mí en primer lugar.

Bueno, como yo mismo soy un probador, e incluso en mi círculo de amigos hay muchos de los mismos, las historias se inclinarán hacia la automatización de pruebas.

Algunos de los patrones parecen extraños y no muy útiles. Y con algunos, por el contrario, descubrirá que ha estado implementando algo como esto durante mucho tiempo, simplemente no sabía que se llamaba así.
En cualquier caso, espero que encuentres algo útil para ti.

Y sí, estaré muy feliz por las críticas constructivas en los comentarios.

Aquí

  • para mí mismo
  • lo que será dicho
  • por qué
  • para quién y cómo

Puedes empezar.



Proxy - Proxy - Diputado


Teoría (un poco)


Patrón de proxy (en ediciones rusas, diputado ). La idea es entregar al trabajo no un objeto real, sino una sustitución que use los métodos del objeto + nuestra lógica, si agregamos uno. Eso es todo.

Cómo hacerlo:

1. Crear una interfaz con métodos públicos del objeto que queremos reemplazar
2. Crea una clase que
- implementa esta interfaz
- tiene acceso al objeto original para llamar a sus métodos
3. Agregue su lógica a los métodos de la clase creada.

Practica


En la práctica, debería ser más claro.

Dano: Tenemos un WebDriver. Y tiene un método findElements (By by);

Tarea: Realmente necesito registrar cuántos elementos encontró el selector.
Cada vez que llamo a un método

driver.findElements(By.cssSelector(".item")); 

Quiero ver un registro en los registros: cuántos elementos se encontraron

Solución 1. En la frente. Qué hay allí: lo usé.
Simplemente lo tomamos y, con cada llamada, escribimos cuántos se encontraron:

 List<WebElement> items = driver.findElements(By.cssSelector(".item")); logger.info("Found {} items", items.size()); 

La opción es normal, mientras que tales llamadas son, bueno, digamos, 7. Aunque las desventajas de este enfoque ya son obvias para cualquiera que haya al menos una vez "modificado ligeramente su código".

Solución 2. Utilizamos un proxy.
WebDriver es una interfaz. Métodos declarados, pero sin implementación. Las implementaciones incluyen ChromeWebDriver, FirefoxWebDriver, etc.

Nosotros, en las pruebas, no tenemos que trabajar con ninguna clase en particular para Chrome o Safari. Solo es necesario que la clase implemente la interfaz WebDriver. Haremos esto:

  1. Creamos una interfaz con los métodos públicos del objeto que queremos reemplazar
    En nuestro ejemplo, dicha interfaz ya existe: WebDriver.
  2. Crea una clase que
    - implementa esta interfaz
    - tiene acceso al objeto original para llamar a sus métodos
     public class LoggerWebDriver implements WebDriver{ private WebDriver driver; public void get(String s) { } public List<WebElement> findElements(By by) { return null; } public WebElement findElement(By by) { return null; } //     } 
  3. Agregue su lógica a los métodos de la clase creada.
     public class LoggerWebDriver implements WebDriver { private WebDriver driver; private final Logger logger = LogManager.getLogger(LoggerWebDriver.class); LoggerWebDriver() { //    . // , ()     this.driver = new ChromeDriver(); } public void get(String var1) { driver.get(var1); } public List<WebElement> findElements(By var1) { List<WebElement> items = driver.findElements(var1); logger.info("Selector {}. Found {} elements", var1.toString(), items.size()); return items; } public WebElement findElement(By var1) { return driver.findElement(var1); } //     } 

Que paso

Agregado a clase

 private WebDriver driver; 

Este es el mismo objeto que queremos reemplazar. Son sus métodos los que llamaremos más.

Ahora, puede ver, por ejemplo, el método

 public void get(String var1) { driver.get(var1); } 

Todo lo que hace el método es llamar a get () en el controlador real.

Y aquí está el método.

 public List<WebElement> findElements(By var1) { List<WebElement> items = driver.findElements(var1); logger.info("Selector {}. Found {} elements", var1.toString(), items.size()); return items; } 

Nos hemos expandido de acuerdo a nuestra tarea.

Eso es todo lo que puedes usar en las pruebas:

 WebDriver driver = new LoggerWebDriver(); driver.get("http://google.com"); List<WebElement> items = driver.findElements(By.cssSelector("a")); // => Selector By.cssSelector: a. Found 48 elements 



Aquí El patrón es bueno si necesita colgar el registro, el almacenamiento en caché, la inicialización diferida, el control de acceso a los métodos. En general, si está escribiendo código y realmente desea tener algún tipo de capa intermedia con sus características, una de las opciones es un proxy.

Ahora que conocemos un patrón más, permíteme recordarte que cuando tienes un martillo en la mano, todo a nuestro alrededor parece ser clavos. Solo tenlo en cuenta.

Source: https://habr.com/ru/post/es414253/


All Articles