Padrões para testadores. Proxy (alternativo)

Antes é isso


Oi Eu sou Dima e não conheço os padrões. Quanto ao testador, para não dizer que é problemático. Como para um fabricante de automóveis ..? Bem, sejamos honestos, você também pode viver.

Nas salas de bate-papo, nas conferências e na comunicação com os colegas, fica claro: o padrão principal - PageObject - é aprendido, o que mais é necessário?

E havia um parágrafo tão grande sobre por que realmente não usamos padrões de design: não os conhecemos ou é bom sem eles? Também houve aprofundamentos na história de que os padrões não são para você, mas por décadas conhecimentos e técnicas comprovados, argumentos a favor e menção de camaradas conhecidos que são contra.

Mas, finalmente, conhecer os padrões definitivamente não fará mal.

Portanto, de modo algum pedindo para você transformar modelos em todo lugar no código, começo a publicar uma série de artigos sobre padrões.

Um pouco mais sobre o formato e vamos lá


Os artigos / livros / cursos em vídeo sobre padrões são bastante decentes. E tenho certeza de que você pode encontrar facilmente um recurso com uma explicação competente, exemplos em seu YP favorito, e-mails etc.

A tarefa deste e dos artigos subsequentes é falar sobre padrões para quem já trabalha com o código, mas não possui uma boa base teórica. Portanto, esses artigos são talvez para mim em primeiro lugar.

Bem, como eu mesmo sou um testador, e mesmo no meu círculo de amigos existem muitos dos mesmos, as histórias serão inclinadas à automação de testes.

Alguns dos padrões parecem estranhos e não muito úteis. E com alguns, pelo contrário, você descobrirá que implementa algo assim há muito tempo, simplesmente não sabia que era chamado assim.
De qualquer forma, espero que você encontre algo útil para si mesmo.

E sim, ficarei muito feliz por críticas construtivas nos comentários.

Aqui.

  • para mim mesmo - disse
  • o que será - dito
  • porque - disse
  • para quem e como - contou

Você pode começar.



Proxy - Proxy - Deputado


Teoria (um pouco)


Padrão de proxy (nas edições russas, deputado ). A idéia é distribuir para o trabalho não um objeto real, mas uma substituição que use os métodos do objeto + nossa lógica, se adicionarmos um. Só isso.

Como fazer:

1. Crie uma interface com métodos públicos do objeto que queremos substituir
2. Crie uma classe que
- implementa essa interface
- tem acesso ao objeto original para chamar seus métodos
3. Adicione sua lógica aos métodos da classe criada

Prática


Na prática, deve ser mais claro.

Dano: Nós temos um WebDriver. E ele tem um método findElements (By by);

Tarefa: Eu realmente preciso registrar quantos elementos foram encontrados pelo seletor.
Toda vez que eu chamo um método

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

Quero ver um registro nos logs - quantos elementos foram encontrados

Solução 1. Na testa. O que está aí: eu usei.
Apenas pegamos e, a cada chamada, escrevemos quantas foram encontradas:

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

A opção é normal, enquanto essas chamadas são, bem, digamos, 7. Embora as desvantagens dessa abordagem já sejam óbvias para quem pelo menos uma vez “modificou ligeiramente o código”.

Solução 2. Usamos um proxy.
O WebDriver é uma interface. Métodos declarados, mas sem implementação. As implementações incluem ChromeWebDriver, FirefoxWebDriver, etc.

Nos testes, não precisamos trabalhar com nenhuma classe específica para chrome ou safari. É necessário apenas para a classe implementar a interface do WebDriver. Vamos fazer o seguinte:

  1. Criamos uma interface com os métodos públicos do objeto que queremos substituir
    No nosso exemplo, essa interface já existe - WebDriver.
  2. Crie uma classe que
    - implementa essa interface
    - tem acesso ao objeto original para chamar seus 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. Adicione sua lógica aos métodos da classe criada
     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); } //     } 

O que aconteceu

Adicionado à turma

 private WebDriver driver; 

Este é o mesmo objeto que queremos substituir. São seus métodos que chamaremos mais adiante.

Agora, você pode procurar, por exemplo, o método

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

Tudo o que o método faz é chamar get () no driver real.

E aqui está o 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; } 

Expandimos de acordo com nossa tarefa.

É tudo o que você pode usar nos testes:

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



Aqui. O padrão é bom se você precisar desligar o log, o cache, a inicialização lenta e o controle de acesso aos métodos. Em geral, se você estiver escrevendo código e realmente deseja ter algum tipo de intercalar com seus recursos, uma das opções é um proxy.

Agora que conhecemos mais um padrão, deixe-me lembrá-lo de que, quando um martelo está em sua mão, tudo ao nosso redor parece ser prego. Apenas mantenha isso em mente.

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


All Articles