Tirando screenshots de testes que falharam no TestNG

Continuando o assunto do último post, vamos ver como implementar um recurso para tirar screenshots de testes que falharam no Selenium WebDriver com TestNG.

TestNG

O TestNG é um framework criado por Cédric Beust, em 2004. Cédric se inspirou no JUnit e no NUnit para criar o TestNG, mas o principal motivo se deu por conta das frustrações que ele mesmo teve com o uso do JUnit. Dentre os diferenciais do TestNG, podemos destacar:

  • Suites definidas via XML e altamente configuráveis

No JUnit, uma Suite é uma classe java anotada com @RunWith(Suite.class), e com pouca flexibilidade, em comparação ao TestNG.

  • Dependência entre métodos de teste

Esse recurso é importante quando estamos trabalhando com testes integrados. Porém, em se tratando de testes de unidade, não faz sentido termos dependências entre testes, já que o objetivo é justamente podermos isolar o comportamento de uma classe, por exemplo.

O JUnit não permite esse recurso. A única coisa que o JUnit permite é a ordenação dos testes em ordem alfabética, abordada pelo Elias Nogueira no post "Ordenando os Testes no Selenium com JUnit".

  • Agrupamento de testes (groups)

Atualmente, o JUnit oferece o recurso de Categories, que, mesmo sendo útil, não oferece a flexibilidade do TestNG.

  • Possibilidade de rodar testes em paralelo

O TestNG permite que você rode seus testes (métodos, classes, etc.) em paralelo, com muita facilidade e flexibilidade de configuração. O JUnit não oferece esse recurso.

Para quem quiser aprender mais sobre o TestNG e suas funcionalidades, recomendo ler a sua documentação, que é simples e fácil de entender. Lembrando que, para usar o TestNG no Eclipse, é necessário instalar um plugin. Clique aqui para ver como instalá-lo.

A classe TestListenerAdapter

De forma análoga à classe TestWatcher, que vimos no post anterior, o TestNG provê a classe TestListenerAdapter para termos controle sobre a execução dos testes. Basicamente, essa classe é um listener que contém todas as informações sobre os testes que foram executados. Assim como fizemos com o JUnit, também podemos controlar o que fazer quando um teste passa ou falha. Enquanto no JUnit tivemos que criar uma Rule estendendo a classe TestWatcher, no TestNG vamos criar um Listener estendendo a classe TestListenerAdapter. Ficaria da seguinte forma:

public class ScreenshotListener extends TestListenerAdapter  
{
    @Override
    public void onTestFailure(ITestResult testResult)
    {
       super.onTestFailure(testResult);

       //O que colocarmos aqui será executado sempre que um teste falhar...
       //É aqui que vamos colocar o método para tirar um screenshot!
    }
}

Bem parecido, não? :)

Como associar o Listener aos seus testes?

Para associar o listener recém-criado aos seus testes, basta anotar sua classe de teste com @Listeners, passando como parâmetro o nome da classe do listener. Como vimos no post anterior, o ideal seria colocar essa anotação na sua classe base de teste. Um exemplo seria:

@Listeners(ScreenshotListener.class)
public class BaseTest  
{
   private static WebDriver driver;

   @BeforeClass
   public static void setUp()
   {
      //Criar instância do driver desejado
   }

   @AfterClass
   public static void tearDown()
   {
      driver.quit();
   }
}

Pronto! Com isso, o listener funcionará para toda classe de teste que estender a classe base.

E o problema com métodos @After?

Usando o TestNG, não há o problema com métodos @After, que descrevemos no post anterior. Com o uso de rules no JUnit, vimos que uma rule é executada sempre antes de um método com @Before (@BeforeMethod no TestNG) e depois de um método com @After (@AfterMethod no TestNG), o que nos atrapalhava para obter um screenshot do estado exato da tela na qual o teste falhou. Logo, não é necessário se preocupar com isso no TestNG! ;)


Nos próximos dias, conforme tinha comentado anteriormente, vou postar no GitHub um projeto de exemplo mostrando a implementação com o JUnit e com o TestNG. Fiquem de olho nas atualizações!

Para complementar, dêem uma olhada nos links abaixo, na seção de Referências.

Até a próxima! :)


Referências

http://testng.org/doc/index.html
http://testng.org/doc/download.html
http://beust.com/weblog/2004/09/01/announcing-testng-1-0/
http://beust.com/weblog/2004/08/25/testsetup-and-evil-static-methods/
http://beust.com/weblog/2004/02/08/junit-pain/


Sobre o autor: Stefan Teixeira trabalha como QA Engineer e, desde o final de 2014, tem se aventurado no mundo DevOps. É Bacharel em Ciência da Computação pela UFRJ e MBA em Garantia de Qualidade de Software pela Escola Politécnica da UFRJ. Entusiasta de Testes Automatizados (e de tudo que possa ser automatizado!), Agile Testing e da cultura DevOps.

Contatos: stefanfk@gmail.com | Twitter | LinkedIn


comments powered by Disqus