Selenium WebDriver: TestNG para gerenciamento de casos de teste e geração de relatórios



Este tutorial do Selenium WebDriver ajudará você a entender a necessidade de usar TestNG com Selenium para gerenciar casos de teste e gerar relatórios de teste detalhados.

No blog anterior, ensinei como executar seu primeiro teste Selenium WebDriver. Neste blog, estarei cobrindo conceitos avançados do Selenium WebDriver. Já mencionei algumas vezes que o Selenium WebDriver tem limitações com relação ao gerenciamento de casos de teste e geração de relatórios de teste. Então, qual é a alternativa? Uma ferramenta tão popular como o Selenium deve definitivamente ter uma solução alternativa, certo? Claro que sim! Podemos usar uma combinação de Selenium e TestNG para superar essa limitação e esse será o tópico da discussão deste blog.

como copiar profundamente em java

Caso você seja novo no Selenium e queira uma introdução aos conceitos básicos, você pode começar sua jornada aqui: ? No entanto, os outros podem começar a usar o TestNG for Selenium neste blog.Você também deve saber que as organizações estão procurando ativamente por profissionais com , tornando-se uma habilidade importante para os testadores de software dominarem.





Os desenvolvedores de software de todo o mundo concordarão unanimemente que escrever código em casos de teste economiza uma boa parte do tempo de depuração. Por quê? Isso ocorre porque os casos de teste ajudam na criação de código robusto e sem erros. Como isso faz? Dividindo todo o código em casos de teste menores e, em seguida, avaliando cada um desses casos de teste para condições de aprovação / reprovação, podemos criar um código sem erros. Já que o Selenium não suporta a execução de código em casos de teste, temos que usar TestNG para o mesmo. É aqui que o TestNG se encaixa na estrutura do Selenium.

TestNG apoia Teste de próxima geração e é uma estrutura de automação de teste de código aberto inspirada em JUnit e NUnit. Bem, não apenas inspirado, mas uma atualização para esses dois frameworks. Então você pode perguntar qual é a atualização aqui?A atualização com o TestNG é que ele fornece funcionalidades adicionais como: anotações de teste, agrupamento, priorização, parametrização e técnicas de sequenciamento no código que não eram possíveis anteriormente.



Além de gerenciar casos de teste, até mesmo relatórios detalhados de testes podem ser obtidos usando TestNG. Haverá um resumo exibindo o caso de teste que falhou, junto com o grupo do qual fazia parte e a classe em que se enquadra. Quando os bugs podem ser localizados com precisão assim, eles podem ser corrigidos imediatamente para o alívio dos desenvolvedores. A imagem abaixo mostra o funcionamento do TestNG.

testng - selênio webdriver

Então, como o TestNG faz o trabalho? Esta pergunta será respondida ema próxima seção deste blog de tutorial do Selenium WebDriver, onde discutirei como gerenciar vários casos de teste usando TestNG.



Selenium WebDriver com TestNG

Os casos de teste podem ser definidos e gerenciados por uma das seguintes maneiras:

  1. Anotações de teste
  2. Priorização
  3. Desativando Casos de Teste
  4. Dependência de Método
  5. Agrupamento
  6. Afirmações
  7. Geração de relatório

Deixe-me começar a explicarcada uma dessas funcionalidades.

Anotações de teste

Em primeiro lugar, vamos nos perguntar: Por que precisamos usar anotações? Quando podemos usá-los? As anotações no Selenium são usadas para controlar o próximo método a ser executado. As anotações de teste são definidas antes de cada método no código de teste. Caso algum método não seja prefixado com anotações, esse método será ignorado e não será executado como parte do código de teste. Para defini-los, os métodos precisam ser simplesmente anotados com ' @Teste ‘. Veja o trecho de código abaixo, por exemplo.

package testng import org.openqa.selenium.WebDriver import org.openqa.selenium.firefox.FirefoxDriver import org.testng.annotations.AfterClass import org.testng.annotations.AfterMethod import org.testng.annotations.BeforeClass import org.testng.annotations .BeforeMethod import org.testng.annotations.Test public class TestAnnotations {@Test public void myTestMethod () {System.out.println ('Método interno: - myTestMethod') WebDriver driver = new FirefoxDriver () driver.get ('http: //www.seleniumframework.com/Practiceform/ ') String title = driver.getTitle () System.out.println (title) driver.quit ()} @BeforeMethod public void beforeMethod () {System.out.println (' This parte do código é executado antes do método: - myTestMethod ') System.setProperty (' webdriver.gecko.driver ',' C: UsersVardhanworkspaceSeleniumProjectfilesgeckodriver.exe ')} @AfterMethod public void afterMethod () {System.out.println (' Esta peça do código é executado após o método: - myTestMethod ')} @BeforeClass public void beforeClass () {Syste m.out.println ('Este pedaço de código é executado antes da classe ser executada')} @AfterClass public void afterClass () {System.out.println ('Este pedaço de código é executado depois que a classe é executada')} }

No código acima, você deve ter notado que não defini um método ‘principal’. No entanto, tenho 5 outros métodos definidos. Eles são ‘myTestMethod’, ‘beforeMethod’, ‘afterMethod’, ‘beforeClass’ e ‘afterClass’. Além disso, observe a ordem de definição dos métodos no código, pois eles não serão executados na mesma ordem.

O método ‘myTestMethod’ é anotado com @Teste , e é o método principal ou parte do código que deve ser executado. Outros métodos anotados serão executados antes e depois deste método ser executado. Uma vez que ‘beforeMethod’ é anotado com @BeforeMethod , ele será executado antes de ‘myTestMethod’ ser executado. Da mesma forma, ‘afterMethod’ é anotado com @AfterMethod , e, portanto, será executado após 'myTestMethod'.

No entanto, ‘beforeClass’ é anotado com @Antes da aula , o que significa que ele será executado antes mesmo da própria classe ser executada. Nosso nome de classe aqui é TestAnnotations , e, portanto, antes que a classe comece a ser executada, o trecho de código dentro de ‘beforeClass’ será executado. Da mesma forma, ‘afterClass’ é anotado com @AfterMethod , e assim será executado após a aula TestAnnotations É executado.

Se você ainda tiver dúvidas sobre a ordem de execução, o snippet a seguir certamente o ajudará.

1. BeforeSuite 2. BeforeTest 3. BeforeClass 4. BeforeMethod 5. Test 6. AfterMethod 7. AfterClass 8. AfterTest 9. AfterSuite

A saída do código acima será:

Esta parte do código é executada antes da classe ser executada. Esta parte do código é executada antes do método: - myTestMethod Método Inside: - myTestMethod 1493192682118 geckodriver INFO Listening on 127.0.0.1:13676 1493192682713 mozprofile :: profile INFO Usando o caminho do perfil C: UsersVardhanAppDataLocalTempile ustempile ustempile .wGkcwvwXkl2y 1493192682729 geckodriver :: marionette INFO Iniciando o navegador C: Arquivos de programas (x86) Mozilla Firefoxirefox.exe 1493192682729 geckodriver :: marionette INFO Conectando-se ao Marionette no localhost: 59792 [GPU 6152] AVISO: erro de pipe: 109: arquivo c: /moz2_slave/m-rel-w32-00000000000000000000/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, linha 346 1493192688316 Marionette INFO Escuta na porta 59792 26 de abril de 2017 1:14:49 PM org. openqa.selenium.remote.ProtocolHandshake createSession INFO: Dialeto detectado: W3C JavaScript error: http://t.dtscout.com/i/?l=http%3A%2F%2Fwww.seleniumframework.com%2FPracticeform%2F&j=, line 1: TypeError: document.getElementsByTagNa me (...) [0] é indefinido Selenium Framework | Practiceform 1493192695134 Marionette INFO Novas conexões não serão mais aceitas 26 de abril de 2017 1:14:57 PM org.openqa.selenium.os.UnixProcess destroy SEVERO: Incapaz de interromper o processo com PID 6724 Este trecho de código é executado após o método: - myTestMethod Este pedaço de código é executado após a classe ser executada PASSADO: myTestMethod ======================================= ============== Testes de teste padrão executados: 1, Falhas: 0, Saltos: 0 ========================== ========================= =============================== ====================== Conjunto padrão Total de testes executados: 1, Falhas: 0, Saltos: 0 =============== ==================================

Como você pode ver na saída acima, o número de testes executados é 1 e a falha é 0. Isso significa que o código foi bem-sucedido. Até mesmo a ordem de execução dos métodos estará na ordemEumencionado anteriormente.

Quando você executa este código em sua máquina, o Selenium WebDriver irá instanciar seu navegador Firefox, navegar até o formulário de prática do Selenium Framework, fechar a instância do navegador e exibir a mesma saída mostrada acima em seu IDE Eclipse.

Usei apenas 5 anotações diferentes em meu código. Mas existem muitas outras anotações que podem ser usadas para controlar o próximo método a ser executado. Toda a lista de anotações é explicada nomesaabaixo:

@BeforeSuite - O método anotado com @BeforeSuite será executado antes que todos os testes do pacote sejam executados.

@AfterSuite - O método anotado com @AfterSuite será executado após a execução de todos os testes do pacote.

diferença entre final finalmente e finalizar em java

@BeforeTest - O método anotado com @BeforeTest será executado antes que qualquer método de teste pertencente a uma classe seja executado.

@AfterTest - O método anotado com @AfterTest será executado após a execução de todos os métodos de teste pertencentes a uma classe.

@BeforeGroup - O método anotado com @BeforeGroup será executado antes de cada grupo ser executado.

@AfterGroup - O método anotado com @AfterGroup será executado após cada grupo ser executado.

@Antes da aula - O método anotado com @Antes da aula será executado uma vez antes de o primeiro método de teste na classe atual ser chamado.

@Depois da aula - O método anotado com @Depois da aula será executado uma vez depois que todos os métodos de teste da classe atual forem executados.

@BeforeMethod - O método anotado com @BeforeMethod será executado antes que qualquer método de teste dentro de uma classe seja executado.

@AfterMethod - O método anotado com @AfterMethod será executado depois que cada método de teste dentro de uma classe for executado.

@Teste - O método anotado com @Teste é o principal método de teste em todo o programa. Outros métodos anotados serão executados em torno deste método.

A captura de tela do relatório TestNG épresente abaixo: -

Priorização

Falamos sobre como os diferentes métodos que podem ser definidos de modo que sejam executados em torno do @Teste método. Mas, e se você tiver mais de um @Teste método e você deseja definir a ordem de execução entre eles?

Nesse caso, podemosPpriorize-os atribuindo um número aos casos de teste anotados. Quanto menor o número, maior a prioridade. A prioridade pode ser atribuída como parâmetros ao definir os casos de teste. Mas, se nenhuma prioridade for atribuída, os métodos de teste anotados serão executados de acordo com a ordem alfabética dos testes. Veja os parâmetros das anotações de teste na parte abaixo docódigo.

@Test (Prioridade = 2) public static void FirstTest () {system.out.println ('Este é o caso de teste número Dois por causa da Prioridade # 2')} @Test (Prioridade = 1) public static void SecondTest () { system.out.println ('Este é o Caso de Teste número Um por causa da Prioridade # 1')} @Test public static void FinalTest () {system.out.println ('Este é o Caso de Teste Final porque não há Prioridade' )}

Desativando Casos de Teste

Deixe-me mostrar algo mais interessante. E se você tiver um código que abrange um milhão de linhas, consistindo em centenas de casos de teste, e deseja desabilitar apenas um método de teste? Você não precisa excluir nenhuma parte do código, em vez disso, podemos simplesmente desativar esse método de teste.

O ato de desabilitar um caso de teste também é feito por meio de parâmetros. Podemos definir o ativado atributo para 'falso'. Por padrão, todos os casos de teste serão habilitados, portanto, não precisamos defini-los toda vez que escrevemos um teste. Observe os parâmetros do terceiro e quarto métodos na parte abaixo decódigo.

@Test (Prioridade = 2, habilitado = Verdadeiro) public static void FirstTest () {system.out.println ('Este é o Caso de Teste número Dois por causa da Prioridade # 2')} @Test (Prioridade = 1, habilitado = Verdadeiro ) public static void SecondTest () {system.out.println ('Este é o caso de teste número Um por causa da Prioridade # 1')} @Test (ativado = falso) public static void SkippedTest () {system.out.println ( 'Este é o caso de teste ignorado porque foi desativado')} @Test (ativado = True) public static void FinalTest () {system.out.println ('Este é o caso de teste final, que está ativado e não tem prioridade ')}

Dependência de Método

Agora, caso você tenha uma situação em que deseja que um trecho de código seja executado apenas se satisfizer uma condição ou apenas se um método específico for executado com sucesso, então podemos fazer isso usando DependeOnMethod (). Esta é basicamente uma condição de dependência de método onde um método será executado dependendo de outro método. Se definirmos adicionalmente alwaysRun atributo como verdadeiro, então o método será executado independentemente da condição de falha / aprovação do método dependente. Observe o código no trecho de código abaixo.

@Test public static void FirstTest () {system.out.println ('Este é o primeiro caso de teste a ser executado')} @Test (dependsOnMethods = {'FirstTest'}) public static void SecondTest () {system.out. println ('Este é o segundo caso de teste a ser executado. Este é um método dependente')} @Test (dependsOnMethods = {'SecondTest'}) public static void FinalTest () {system.out.println ('Este é o teste final Caso Será executado de qualquer maneira. ')}

Agora, isso nos leva a outro aspecto importante no testeanotações que são Agrupamento .

Agrupamento

Agora você deve saber que haverá vários métodos como parte de nosso caso de teste no código. Digamos que haja 100 casos de teste, mas queremos executar apenas 20 casos de teste em nosso próximo teste. Você acha que podemos fazer isso? Claro que podemos.

Podemos usar grupos atributo para este fim. Podemos atribuir um nome de grupo a vários casos de teste e, posteriormente, escolher executar o grupo em vez de todo o código. Observe o snippet de código abaixo para entendercomo criar grupos.

@Test (groups = {'MyGroup'}) public static void FirstTest () {system.out.println ('Isto faz parte do Grupo: MyGroup')} @Test (groups = {'MyGroup'}) public static void SecondTest () {system.out.println ('Isso também faz parte do Grupo: MeuGrupo')} @Test public static void ThirdTest () {system.out.println ('Mas, isso não faz parte do Grupo: MeuGrupo ')}

TestNG Assertions

Isso agora nos leva ao próximo tópico no TestNG, que são asserções. Como o nome sugere, as asserções podem ser usadas em métodos de teste para determinar a condição de aprovação / reprovação de um teste. Com base na condição verdadeiro / falso de uma declaração, os testes serão aprovados / reprovados.

No código a seguir, incluí 3 métodos de teste, em que o primeiro e o terceiro métodos têm uma condição de aprovação e o segundo método terá uma condição de falha. Veja o código por si mesmo.

package testng import org.testng.annotations.Test import org.testng.annotations.BeforeMethod import org.openqa.selenium.WebDriver import org.openqa.selenium.firefox.FirefoxDriver import org.testng.Assert import org.testng.annotations.AfterMethod public class Assertions {@BeforeMethod public void beforeMethod () {System.setProperty ('webdriver.gecko.driver', 'C: UsersVardhanworkspaceSeleniumProjectfilesgeckodriver.exe')} public boolean isEqual (int a, int b) {if (a == b) ) {return true} else {return false}} @Test public void testEquality1 () {Assert.assertEquals (true, isEqual (10, 10)) System.out.println ('Esta é uma condição de aprovação')} @Test public void testEquality2 () {Assert.assertEquals (true, isEqual (10, 11)) System.out.println ('Esta é uma condição de falha')} @Test public void getTitle () {driver WebDriver = novo driver FirefoxDriver (). get ('https://www.gmail.com') String title = driver.getTitle () Assert.assertEquals (title, 'Gmail') System.out.println ('Esta é novamente uma condição de aprovação')} }

Ao observar o relatório gerado após essa execução, você notará que, dos três testes, um falhou e dois foram aprovados. Outro ponto importante a ser observado é que, quando uma asserção falha, outros comandos / linhas de código nesse teste são ignorados. Somente quando a asserção for bem-sucedida, a próxima linha de código será executada nesse teste. Confira a saída abaixo onde system.out.println foi executado apenas para o primeiro e o terceiro métodos.

1493277977348 geckodriver INFO Ouvindo em 127.0.0.1:47035 1493277977993 mozprofile :: profile INFO Usando o caminho do perfil C: UsersVardhanAppDataLocalTemp ust_mozprofile.Z7X9uFdKODvi 1493277977994 geckodriver :: profile INFO 1497777 Arquivos geckodriver.exe marionette do navegador: marionette 14932 marionette: 1497799773 geckodriver. Conectando-se ao Marionette no localhost: 50758 [GPU 6920] AVISO: erro de tubo: 109: arquivo c: / builds / moz2_slave / m-rel-w32-00000000000000000000 / build / src / ipc / chromium / src / chrome / common / ipc_channel_win. cc, linha 346 1493277981742 Marionette INFO Ouvindo na porta 50758 27 de abril de 2017 12:56:22 PM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Dialeto detectado: W3C Esta é novamente uma condição de aprovação Esta é uma condição de aprovação PASSOU: getTitle PASSOU: testEquality1 FALHOU: testEquality2 java.lang.AssertionError: esperado [false] mas encontrado [true] em org.testng.Assert.fail (Assert.java:93) em org.testng.Assert.failNotEquals (Assert.java: 512) em org.testng.Assert.assertE qualsImpl (Assert.java:134) em org.testng.Assert.assertEquals (Assert.java:115) em org.testng.Assert.assertEquals (Assert.java:304) em org.testng.Assert.assertEquals (Assert.java : 314) em testng.Assertions.testEquality2 (Assertions.java:38) em sun.reflect.NativeMethodAccessorImpl.invoke0 (Método nativo) em sun.reflect.NativeMethodAccessorImpl.invoke (Fonte Desconhecida) em sun.reflect.DelegatingMethod (Desconhecido) Fonte) em java.lang.reflect.Method.invoke (Fonte desconhecida) em org.testng.internal.MethodInvocationHelper.invokeMethod (MethodInvocationHelper.java:108) em org.testng.internal.Invoker.invokeMethod (Invoker.java:661) em org.testng.internal.Invoker.invokeTestMethod (Invoker.java:869) em org.testng.internal.Invoker.invokeTestMethods (Invoker.java:1193) em org.testng.internal.TestMethodWorker.invokeTestMethods (TestMethod.java126orker ) em org.testng.internal.TestMethodWorker.run (TestMethodWorker.java:109) em org.testng.TestRunner.privateRun (TestRunner.java:744) em org.testng.TestRu nner.run (TestRunner.java:602) em org.testng.SuiteRunner.runTest (SuiteRunner.java:380) em org.testng.SuiteRunner.runSequentially (SuiteRunner.java:375) em org.testng.SuiteRunner.privateRun (SuiteRunner .java: 340) em org.testng.SuiteRunner.run (SuiteRunner.java:289) em org.testng.SuiteRunnerWorker.runSuite (SuiteRunnerWorker.java:52) em org.testng.SuiteRunnerWorker.run (SuiteRunnerWorker.java:86) em org.testng.TestNG.runSuitesSequentially (TestNG.java:1301) em org.testng.TestNG.runSuitesLocally (TestNG.java:1226) em org.testng.TestNG.runSuites (TestNG.java:1144) em org.testng. TestNG.run (TestNG.java:1115) em org.testng.remote.AbstractRemoteTestNG.run (AbstractRemoteTestNG.java:132) em org.testng.remote.RemoteTestNG.initAndRun (RemoteTestng.remote:230) em org.testng.remote:230) .RemoteTestNG.main (RemoteTestNG.java:76) ============================================= ======== Teste padrão Testes executados: 3, Falhas: 1, Ignora: 0 ================================ ===================== ================================= ================ Total do conjunto padrão de testes executados: 3, Falhas: 1, Pulos: 0 ======================================= ============

Então, esse é o fim dos conceitos relacionados ao gerenciamento de casos de teste. Ficamos com mais um tópico, que é a geração de relatórios. A geração de relatórios é o último tópico neste tutorial do Selenium WebDriver porque os relatórios podem ser gerados somente após todos ostestes são executados.

o que é logger em java

Geração de relatório

O mais importante que você precisa observar é que o relatório será gerado apenas por meio de um arquivo .xml. Isso significa que, seja um método, uma classe ou um grupo que você deseja testar, todos eles devem ser especificados no arquivo .xml.

Portanto, primeiro você pode criar uma nova pasta em seu projeto e criar um novo arquivo dentro dessa pasta e dar um nome ao arquivo e salvá-lo com a extensão .xml. Você pode criar a nova pasta e arquivo clicando com o botão direito no gerenciador de pacotes. Depois de criar o arquivo, vá para a guia de origem na parte inferior da janela e insira as configurações conforme especificado no trecho abaixo.

 

A primeira linha é a definição do tipo de documento XML. Isso é padrão e obrigatório para todos os relatórios de teste. Mas, as outras linhas são bastante autoexplicativas. Eu usei as tags abertas para suíte, teste, classes e classe. A tag Classes pode ter uma ou mais classes dentro dela. Assim, ele pode ser usado se quisermos gerar um relatório onde estamos testando várias classes. Isso é útil especialmente para desenvolvedores que desejam testar um longo trecho de código.

De qualquer forma, voltando ao nosso relatório, você pode nomear cada suíte ou teste ou classe depois de abrir essas tags e lembrar de fechar todas as tags que abrir. Eu dei meu nome de suíte como TestNGs , nome do teste como Teste Anotações e o nome da classe como testng.TestAnnotations. Observe que o nome da classe está no formato de ' packagename.classname ’ .

Ao executar este arquivo como suíte TestNG, a execução começará e você obterá os relatórios de teste detalhados. Você obterá a saída do teste na guia do console e o resultado do conjunto de testes na próxima guia. O relatório que gerei para executar meu código édentroa imagem abaixo. Você notará que, desta vez, há um nome de suíte, um nome de teste, um nome de classe junto com o tempo gasto para executar cada um deles.

Caso queira visualizar o relatório HTML (relatório de índice ou relatório para envio por e-mail), você pode ir para o saída de teste pasta dentro do diretório do projeto em seu espaço de trabalho. Ao clicar neles, você pode ver os relatórios, mesmo em um momento posterior. Abaixo estão suas imagens.

Relatório de Índice : -

Relatório para email : -

Isso nos leva ao final deste blog de tutorial do Selenium WebDriver. É hora de você configurar o eclipse do seu lado, instalar os vários pacotes Selenium, instalar o TestNG e começar a escrever seus casos de teste.

Você pode conferir o vídeo do tutorial Selenium WebDriver abaixo para testemunhar uma demonstração dos vários conceitos explicados neste blog.

Treinamento de selênio | Framework TestNG para selênio | Edureka

Este vídeo de treinamento do Edureka Selenium o levará através dos detalhes detalhados do Selenium WebDriver. Este vídeo tutorial do Selenium é ideal para iniciantes e profissionais que desejam aprimorar os fundamentos dos comandos WebDriver e aprender como o TestNG pode ser usado com o Selenium para gerenciar vários casos de teste.

Se você deseja aprender Selenium e construir uma carreira no domínio de testes, confira nosso site interativo ao vivo online aqui, ele vem com suporte 24 horas por dia, 7 dias por semana para guiá-lo durante o período de aprendizado.

Tem alguma questão para nós? Mencione isso na seção de comentários e entraremos em contato com você.