Selenium + SpecFlow + NUnit + ExtentReports

Reportando a execução dos testes

Olá tudo bem? Hoje vou explicar e exemplificar o uso do ExtentReports, esta API interessante que nos oferece a criação de relatórios interativos e também nos dá uma Dashboard, visualizações gráficas, captura de tela e até envio dos resultados por email. Tudo isso em formato HTML.

Além disso, pode ser configurada para suportar Java e .NET nos principais frameworks de testes existentes. Também é permitido registrar todos os passos dos testes num Report Server usando o banco MongoDB. Para isso, ele utiliza uma biblioteca chamada Klov. Mas, não iremos abordar neste momento.

Existem 2 versões desta API que são Community e a Professional e que sinceramente não sei quanto custa a versão paga (pelo menos o site não mostra). Para mais informações clique neste link.

No entanto, a versão Community já nos atende em muita coisa e por isso vamos conhecê-la na prática!


Criando o projeto de testes NUnit

Eu estou utilizado o Visual Studio 2017, mas fica a seu critério utilizar o Visual Studio Code.

Nossos pacotes principais serão o Selenium, Specflow, e vamos usar o Chrome como browser.

Vamos criar um projeto onde iremos pesquisar um produto qualquer na Amazon, selecioná-lo e depois clicar em comprar. Muito simples. Nada de login ou algo parecido.

  • Crie um projeto de testes comum, eu chamei de ExtentReportAmazon
  • Vamos instalar alguns pacotes:
install-package Nunit
install-package NUnit3TestAdapter
install-package Specflow
install-package SpecFlow.NUnit
install-package Selenium.WebDriver
install-package Selenium.WebDriver.ChromeDriver
install-package ExtentReports

Tudo pronto! Vamos Criar algumas pastas para organizar nosso projetinho. Eu deixei com a seguinte configuração:

  • Common → Vão conter 2 classes, uma para configuração e injeção de dependência do WebDriver e a outra contendo um Hook (veremos mais abaixo do que se trata)
  • ExtentionMethods → Como o nome já diz, serão métodos de extensão, mas para utilizar com o Hook. Na verdade criei para facilitar minha vida.
  • Features → A feature criada pelo SpecFlow
  • Pages → Aqui vamos criar uma classe simples seguindo o Pattern Page Object Model
  • Steps → Os passos que foram configurados na feature, ou seja, as ações que serão executadas

Abaixo está o código fonte de cada classe:

A primeira será a Boostrapper. O SpecFlow nos oferece uma interface chamada IObjectContainer que é automaticamente injetável no construtor e ela nos ajudará a registrar/resolver a dependência do IWebDriver, que no nosso caso usaremos o ChromeDriver.

Utilizando Hooks

O SpecFlow tem um cara que nos ajuda em algumas coisas interessantes, o nome dele é Hooks. Os Hooks são event bindings, ou seja, pode ser usado, disparado, para executar um evento em um momento específico, como por exemplo: executar uma função antes de executar os testes ou depois de uma feature criada, enfim!

Para usar Hooks, precisamos adicionar o atributo Binding na classe Hook e usar os atributos mais comuns: BeforeFeature, BeforeScenario, AfterTestRun, AfterStep dentre outros. Dê uma olhada no que se trata de Hooks e na lista de atributos que podemos usar aqui.

Exemplo básico:

[Binding]
public class MeuHook
{
[AfterTestRun]
public void SalvarArquivoTexto()
{
// seu codigo aqui
}
}

Toda vez que você executar seu teste , tendo uma classe Hook para fazer determinados processos, automaticamente irá passar por esse trecho de código.

Abaixo o nosso Hook. Criei a classe com esse nome para nosso exemplo. Vou explicar o seu conteúdo:

  • O ExtentReports trabalha com nodos, esses nodos são “seções” que o seu relatório terá. No SpecFlow, essas seções podemos chamar de Feature, Scenario e Steps. Então, essas informações do SpecFlow irão ser anexadas ao relatório para que o ExtentReport crie camadas de informações contento o nome do seu teste, o que ele irá fazer, os passos que estão sendo executados, se tiveram erros ou falhas etc.
  • Agora temos a classe de Extension Methods:
  • Nosso arquivo de Feature será assim bem simples. Vamos abrir o site da Amazon, pesquisar por Dell XPS, selecionar o primeiro item da lista de produtos, adicionar ao carrinho e verificar se tem 1 item adicionado.
Feature: Amazon Buy Dell XPS

Scenario: Buy a Dell XPS Laptop in Amazon website
Given I open Amazon website
And I search by Dell XPS
And I press enter key for submit
And I choose the first item of list
When I click in Add to Cart button
Then Must have one item in cart
  • Agora criamos o nosso AmazonPage, uma classe já pré-configurada para acessar os objetos DOM da página da Amazon e executar algumas ações.
  • Por fim a nossa classe de Steps chamada de AmazonBuyDellXPS.

Executando

Vamos então executar o teste e vamos ver o resultado! Por aqui não deu erro algum, mas podemos simular um erro para que nosso Report mostre onde foi.

Agora com erro…

Adicionei no útimo Step que a quantidade no carrinho é igual a 2 para forçar um erro simples:

Assert.AreEqual(expected, 2);

Conclusão

Foi um exemplo simples, nada de tão complexo. Mas dá pra vermos que o ExtentReports nos ajuda nesse processo de relatórios. Existem várias outras configurações desta API, mas não entrei em tantos detalhes. Dê uma fuçada para conhecer um pouco mais. Vale apena!

Deixo aqui uma informação:

  • Como a versão Community não envia emails, nem captura tela por exemplo. Mas, podemos enviar manualmente o conteúdo HTML por email. Faça essa experiência.

O código fonte se encontra nas referências. Valeu e até a próxima!