Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida no Ex. 50 da Aula 5 - Esperando por Requisições Ajax

Olá pessoal, gostaria de registrar algumas dúvidas que me surgiram ao longo do curso.

  • Como posso validar gráficos com o selenium?
  • É possível verificar os valores dos campos de uma tabela, de acordo com suas colunas? Verificar se as colunas estão na ordem correta e que cada campo pertence àquela respectiva coluna?
  • Quando tenho vários níveis diferentes de usuários, como devo proceder?
  • E se ao invés de níveis de usuários, estes tivessem seus menus de acesso liberados na hora de seus cadastros?

Aguardo as considerações dos colegas sobre o assunto. Desde já, agradeço!

4 respostas

Oi Jonas,

vamos por partes, já que são muitas questões:

Como posso validar gráficos com o selenium?

Você está usando uma biblioteca para criar esses gráficos que precisam de validação? Se sim, a única coisa que precisamos mesmo verificar é se estamos mandando os dados corretos para a biblioteca.

Para fazer isso, é mais comum usarmos alguma ferramenta de testes de unidade/integração e validar a saída dos dados no programa, em vez de usar o Selenium para validar a tela em si.

É possível verificar os valores dos campos de uma tabela, de acordo com suas colunas? Verificar se as colunas estão na ordem correta e que cada campo pertence àquela respectiva coluna?

Sim, e usamos muito isso. Basta usar o driver para pegar a tabela e, a partir dela, pegar as linhas da tabela. Então, para cada linha, pegamos os valores e comparamos com os esperados.

Por exemplo, digamos que você tenha uma tabela que mostra Produtos por ordem de preço e há três itens no banco: - Ioiô a R$35; - Pião a R$50; - Malabares a R$25.

Nesse caso, você já sabe que, na linha 1, quer pegar os malabares, na 2, o ioiô e, na 3, o pião. Então, queremos escrever algo assim:

@Test
public void produtosSaoMostradosEmOrdemCrescenteDeValor() {
    // cria os produtos no banco;
    // acessa a página da listagem;
    Assert.assertTrue(produtoEstaNaPosicaoDaTabela(malabares, 25);
    Assert.assertTrue(produtoEstaNaPosicaoDaTabela(ioio, 35);
    Assert.assertTrue(produtoEstaNaPosicaoDaTabela(piao, 50);
}

E aí, no page object que você criou, vai a implementação disso. Algo como (não testei e escrevi sem IDE):

public void produtoEstaNaPosicaoDaTabela(Produto produtoProcurado, int indice) {
    WebElement tabela = driver.findElement(By.id("tabelaProdutos"));
    List<WebElement> linhas = tabela.findElements(By.tagName("tr"));
    WebElement linha = linhas.get(indice);
    List<WebElement> celulas = linha.findElements(By.tagName("td");
    return celulas.get(0) ==  produtoProcurado.getNome() && 
           celulas.get(1) ==  produtoProcurado.getPrecoFormatado(); 
}

Quando tenho vários níveis diferentes de usuários, como devo proceder?

Você pode criar os usuários de diferentes papéis e verificar acesso ou proibição do que achar relevante. Só vai mudar o código do setUp para isso.

E se ao invés de níveis de usuários, estes tivessem seus menus de acesso liberados na hora de seus cadastros?

Mesma ideia. Aí dá pra pegar apenas por visibilidade dos campos. :-)

Ceci

Olá Cecilia!

Muito obrigado pelos esclarecimentos. Me ajudou muito! Uma outra dúvida que tenho é com relação a montagem dos cenários. Vamos lá: Vamos supor que tenho um formulário com 2 campos. Os possíveis cenários que eu montaria:

  • Preencho corretamente os dois campos;
  • Não preencho o 1º campo;
  • Não preencho o 2º campo;
  • Não preencho nenhum dos campos;

Até ai ok (heheh)! Mas e se esse meu formulário tivesse 10 campos? Ou pior, se eu tivesse um formulário dividido em 2 ou mais abas?? Qual seria uma estratégia legal a ser utilizada? Como identificar quais campos testar? Inserçao de caracteres especiais, tipos(como inserir letras em um campo numérico), ou até mesmo sql injection, devem estar presentes nos meus cenários? Enfim, como defino um escopo bacana pros meus cenários?

solução!

Hmm... como essa parte de validação de preenchimento é usualmente feita em JS ou com próprias diretivas do HTML5, preferimos testá-los com Testes de Unidade em JS, por exemplo, com Jasmine.

Esses exemplos que você colocou são boas coisas para se testar, de fato, mas não necessariamente com testes de aceitação: - Inserção de caracteres especiais => teste de unidade em JS; - Tipos de dados => nem precisa, só usar o type certo no input; - SQL injection => se vc usou um ORM ou PreparedStatement no Java, pode ficar tranquilo (pra graaaaande maioria dos casos).

Aí, eu testaria com Selenium WebDriver apenas o caminho feliz e erros que sejam realmente importantes (ou validados apenas no server-side).

Isso porque são testes caros em dois sentidos:

  1. eles são mais difíceis de escrever;
  2. se a tela muda, tem que mudar os testes também;
  3. eles levam muito mais tempo pra rodar do que os de unidade.

Aí vale a pena pensar bem no que é importante o bastante para que você queira mesmo ter um teste de aceitação para esse cenário.

Dei uma palestra disso em 2013 no AgileTrends. São 18 minutos em uma visão pragmática do assunto, baseada em projetos reais. Se interessar, você pode assistí-la aqui: https://www.youtube.com/watch?v=u46LCdCemKg

Espero ter respondido! :-)

Olá Cecilia :)

Mai uma vez, muito obrigado pelos esclarecimentos.. Show de bola a palestra!