Parametrização de Dados para Automação de Teste – Parte 4

Série de posts

Este post faz parte de uma série chamada Parametrização de Dados de Teste!
Clique neste link para acessar a série de posts, ou acesse pelo menu Série de Posts.

Pré-Condição

Leia novamente e exercite o post Parametrização de Dados para Automação de Teste – Parte 2: Data Driven com JUnit para relembrar como funciona o Data Driven com JUnit.

JUnit Params

Página: http://pragmatists.github.io/JUnitParams
GitHub: https://github.com/Pragmatists/JUnitParams

Ele é um projeto open source que adiciona um executor (runner) que torna a parametrização de dados com JUnit (versão => 4.6) mais fácil. São algumas das diferenças entre a parametrização do JUnit versus JUnit Params:

  • os parâmetros passam a ser nos métodos de teste e não na classe
  • menos código para parametrizar os testes
  • podemos ter, na mesma classe de teste, métodos parametrizados e não parametrizados
  • os parâmetros podem ser passados através de um arquivo .csv
  • você pode criar uma classe concentrando os dados parametrizados

Como parametrizar os testes usando um arquivo .csv

1. Adicionar a biblioteca do JUnit Params

Adicionar a biblioteca nas dependências do seu projeto:

Maven

<dependency>
    <groupId>pl.pragmatists</groupId>
    <artifactId>JUnitParams</artifactId>
    <version>1.1.0</version>
    <scope>test</scope>
</dependency>

Gradle

testCompile group: 'pl.pragmatists', name: 'JUnitParams', version: '1.1.0'

2. Criar o arquivo .csv (massa de dados)

Antes de escrever o código com os parâmetros é necessário que você tenha a massa de dados já criada.
Seguindo o mesmo exemplo da série de posts, temos as seguintes informações que estão no arquivo .csv separadas por vírgula ( , ):

  • Nome
  • Cidade
  • Faixa de idade
  • Resultado

Conteúdo do arquivo .csv

Jose, São Paulo, Até 18 anos, Os juros serão de 60%
Maria, Belo Horizonte, Entre 19 e 25 anos, Os juros serão de 40%
João, Florianópolis, Entre 26 e 60 anos, Os juros serão de 30%
Carla, Vitória, Maior que 60 anos, Os juros serão de 20%

Observação: neste exemplo não estou usando cabeçalhos no arquivo. No final deste post há um exemplo utilizando um cabeçalho.

3. Criar um método de teste com parâmetros

O método de teste deve ser público, sem retorno e, neste caso, ter a quantidade de parâmetros iguais as colunas do arquivo .csv

@Test
public void testeParametrizacaoJUnit(String nome, String cidade, String faixaIdade, String resultado) {
   // restante do codigo ignorado
}

O nome dos atributos não importa, mas é recomendado que ele seja facilmente lembrado e associado ao que a informação significa.

4. Adicionar anotação de teste

Para que seja necessário carregar as informações do arquivo .csv devemos usar a anotação @FileParameters. Ela recebe como parâmetro o local (caminho completo) e nome do arquivo.

@Test
@FileParameters("massa_dados/dados.csv")
public void testeParametrizacaoJUnit(String nome, String cidade, String faixaIdade, String resultado) {
   // restante do codigo ignorado
}

5. Associação dos dados

Utilizar o nome das variáveis, que são os parâmetros do método de teste, dentro do script de teste.

@Test
@FileParameters("massa_dados/dados.csv")
public void testeParametrizacaoJUnit(String nome, String cidade, String faixaIdade, String resultado) {
   driver.findElement(By.id("nome")).sendKeys(nome);
   driver.findElement(By.id("cidade")).sendKeys(cidade);
   new Select(driver.findElement(By.name("faixa"))).selectByVisibleText(faixaIdade);
   driver.findElement(By.cssSelector(".btn.btn-primary.nextBtn.btn-lg.pull-right")).click();

   assertEquals(nome, driver.findElement(By.cssSelector("span[ng-bind='nome']")).getText());
   assertEquals(cidade, driver.findElement(By.cssSelector("span[ng-bind='cidade']")).getText());
   assertEquals(faixaIdade, driver.findElement(By.cssSelector("span[ng-bind='faixaSelecionada']")).getText());
   assertEquals(resultado, driver.findElement(By.cssSelector("span[ng-bind='retorno']")).getText());
}

6. Adicionar Runner

O último passo é adicionar o runner (executor) customizado do JUnit Params. Como ele altera a forma de execução interna do JUnit ele se faz necessário para que as funcionalidades realmente funcionem durante a execução, como a leitura dos dados no arquivo que estamos fazendo.

A anotação @RunWith(JUnitParamsRunner.class) deve ir acima da linha com o nome da classe de teste.

@RunWith(JUnitParamsRunner.class)
public class ParametrizacaoJUnitCSV {
   // restante do codigo ignorado
}

Código completo

Visualize o projeto no GitHub: https://github.com/eliasnogueira/parametrizacao-script-teste

https://gist.github.com/eliasnogueira/1c7130950bff2699dd3c96de441f5930

Utilizando um cabeçalho no arquivo .csv

Se você deseja adicionar um cabeçalho ao arquivo .csv e fazer com que ele não seja utilizado como uma informação dentro do script de teste siga estes passos:

  • Adicione os cabeçalhos no arquivo .csv
  • Na anotação @FileParameters:
    • adicione o atributo value e associe com o caminho completo e nome do arquivo .csv
    • adicionar o atributo mapper e associe com a classe CsvWithHeaderMapper.class

O mapper é o tipo de mapeamento que será feito ao ler o arquivo .csv, neste caso iremos informar para a anotação que existe um header (cabeçalho) no arquivo, e este deve ser ignorado. Por isso informamos a classe CsvWithHeaderMapper.class.

Exemplo de código simplificado:

Arquivo csv
Note que agora há um cabeçalho.

nome, cidade, faixa idade, resultado
Jose, São Paulo, Até 18 anos, Os juros serão de 60%
Maria, Belo Horizonte, Entre 19 e 25 anos, Os juros serão de 40%
João, Florianópolis, Entre 26 e 60 anos, Os juros serão de 30%
Carla, Vitória, Maior que 60 anos, Os juros serão de 20%

Anotação modificada
Note que há dois parâmetros na anotação @FileParameters: value e mapper

@Test
@FileParameters(value = "massa_dados/dados.csv", mapper = CsvWithHeaderMapper.class)
public void testeParametrizacaoJUnit(String nome, String cidade, String faixaIdade, String resultado) {
   // restante do codigo ignorado
}

 

2 thoughts to “Parametrização de Dados para Automação de Teste – Parte 4”

  1. Elias comigo não funcionou fica dando mensagem:

    java.lang.Exception: Method testeParametrizacaoJUnit should have no parameters
    at org.junit.runners.model.FrameworkMethod.validatePublicVoidNoArg(FrameworkMethod.java:76)
    at org.junit.runners.ParentRunner.validatePublicVoidNoArgMethods(ParentRunner.java:155)
    at org.junit.runners.BlockJUnit4ClassRunner.validateTestMethods(BlockJUnit4ClassRunner.java:208)
    at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:188)
    at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:128)
    at org.junit.runners.ParentRunner.validate(ParentRunner.java:416)
    at org.junit.runners.ParentRunner.(ParentRunner.java:84)
    at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:65)
    at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:10)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:84)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:70)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:43)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

    Veja abaixo meu codigo:

    @Test
    @FileParameters(value=”C:\\Users\\F945256\\Documents\\projetos_automatizacao\\dadosLogin.csv”, mapper = CsvWithHeaderMapper.class )
    public void testeParametrizacaoJUnit(String login, String senha) {

    /*String login =”F572862″;*/
    /*String senha=”123″;*/
    driver.findElement(By.id(“loginForm-login”)).sendKeys(login);
    driver.findElement(By.id(“loginForm-senha”)).sendKeys(senha);

    WebElement entrar = driver.findElement(By.id(“loginForm-btLogin”));
    entrar.click();
    }

    1. Olá Sara!
      Você adicionou, acima do nome da classe, a anotação @RunWith(JUnitParamsRunner.class) ?

      A exception que você passou diz que não é possível passar parêmtros para o método de teste, e isso é normal se tu não especificar o runner do JUnitParams.

      Abraço!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *