TestNG - Teste de Dependência

Às vezes, você pode precisar invocar métodos em um caso de teste em uma ordem específica ou pode desejar compartilhar alguns dados e estado entre os métodos. Este tipo de dependência é suportado pelo TestNG, uma vez que suporta a declaração de dependências explícitas entre métodos de teste.

TestNG permite que você especifique dependências com -

  • Usando o atributo dependsOnMethods em anotações @Test, OR.

  • Usando o atributo dependsOnGroups em anotações @Test.

Exemplo de uso de dependsOnMethods

Criar uma aula

Crie uma classe java a ser testada, digamos, MessageUtil.java dentro C:\>TestNG_WORKSPACE.

public class MessageUtil {
   private String message;

   // Constructor
   // @param message to be printed
   public MessageUtil(String message) {
      this.message = message;
   }

   // prints the message
   public String printMessage() {
      System.out.println(message);
      return message;
   }

   // add "Hi!" to the message
   public String salutationMessage() {
      message = "Hi!" + message;
      System.out.println(message);
      return message;
   }
}

Criar classe de caso de teste

  • Crie uma classe de teste java, digamos, DependencyTestUsingAnnotation.java.

  • Adicione métodos de teste, testPrintMessage () e testSalutationMessage (), e initEnvironmentTest (), à sua classe de teste.

  • Adicionar atributo dependsOnMethods = {"initEnvironmentTest"} para a anotação @Test de testSalutationMessage() método.

Crie um nome de arquivo de classe java DependencyTestUsingAnnotation.java dentro C:\>TestNG_WORKSPACE.

import org.testng.Assert;
import org.testng.annotations.Test;

public class DependencyTestUsingAnnotation {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);

   @Test
   public void testPrintMessage() {
      System.out.println("Inside testPrintMessage()");
      message = "Manisha";
      Assert.assertEquals(message, messageUtil.printMessage());
   }

   @Test(dependsOnMethods = { "initEnvironmentTest" })
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Manisha";
      Assert.assertEquals(message, messageUtil.salutationMessage());
   }

   @Test
   public void initEnvironmentTest() {
      System.out.println("This is initEnvironmentTest");
   }
}

Crie testng.xml

Crie testng.xml em C:\>TestNG_WORKSPACE para executar caso (s) de teste.

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
      <classes>
         <class name = "DependencyTestUsingAnnotation" />
      </classes>
   </test>
</suite>

Compile o MessageUtil, classes de caso de teste usando javac.

C:\TestNG_WORKSPACE>javac MessageUtil.java DependencyTestUsingAnnotation.java

Agora, execute o testng.xml, que executará o método testSalutationMessage () somente após a execução do método initEnvironmentTest ().

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

Verifique a saída.

This is initEnvironmentTest
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha

===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================

Exemplo de uso de dependsOnGroups

Você também pode ter métodos que dependem de grupos inteiros. Vamos ter um exemplo para demonstrar isso.

Criar uma aula

Crie uma classe java a ser testada, digamos, MessageUtil.java dentro C:\>TestNG_WORKSPACE.

public class MessageUtil {
   private String message;

   // Constructor
   // @param message to be printed
   public MessageUtil(String message) {
      this.message = message;
   }

   // prints the message
   public String printMessage() {
      System.out.println(message);
      return message;
   }

   // add "Hi!" to the message
   public String salutationMessage() {
      message = "Hi!" + message;
      System.out.println(message);
      return message;
   }
}

Criar classe de caso de teste

  • Crie uma classe de teste java, digamos, DependencyTestUsingAnnotation.java.

  • Adicione métodos de teste, testPrintMessage () testSalutationMessage () e initEnvironmentTest () à sua classe de teste e adicione-os ao grupo "init".

  • Adicione o atributo dependsOnMethods = {"init.*"} para a anotação @Test de testSalutationMessage() método.

Crie um arquivo de classe java chamado DependencyTestUsingAnnotation.java dentro C:\>TestNG_WORKSPACE.

import org.testng.Assert;
import org.testng.annotations.Test;

public class DependencyTestUsingAnnotation {
   String message = "Manisha";
   MessageUtil messageUtil = new MessageUtil(message);

   @Test(groups = { "init" })
   public void testPrintMessage() {
      System.out.println("Inside testPrintMessage()");
      message = "Manisha";
      Assert.assertEquals(message, messageUtil.printMessage());
   }

   @Test(dependsOnGroups = { "init.*" })
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Manisha";
      Assert.assertEquals(message, messageUtil.salutationMessage());
   }

   @Test(groups = { "init" })
   public void initEnvironmentTest() {
      System.out.println("This is initEnvironmentTest");
   }
}

Neste exemplo, testSalutationMessage () é declarado como dependente de qualquer grupo, correspondendo à expressão regular "init. *", O que garante que os métodos testPrintMessage () e initEnvironmentTest () sempre serão chamados antes de testSalutationMessage ().

Se um método dependente falhar e você tiver uma dependência rígida dele (alwaysRun = false, que é o padrão), os métodos que dependem dele não são marcados como FAIL, mas como SKIP. Os métodos ignorados serão relatados como tal no relatório final (em uma cor que não seja vermelha nem verde no HTML), o que é importante, pois os métodos ignorados não são necessariamente falhas.

Crie testng.xml

Crie testng.xml em C:\>TestNG_WORKSPACE para executar caso (s) de teste.

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
      <classes>
         <class name = "DependencyTestUsingAnnotation" />
      </classes>
   </test>
</suite>

Compile o MessageUtil, classes de caso de teste usando javac.

C:\TestNG_WORKSPACE>javac MessageUtil.java DependencyTestUsingAnnotation.java

Agora, execute o testng.xml, que executará o método testSalutationMessage () somente após a execução do método initEnvironmentTest () .

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

Verifique a saída.

This is initEnvironmentTest
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha

===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================

DependeOnGroups Vs DependeOnMethods

  • Ao usar grupos, não estamos mais expostos a problemas de refatoração. Desde que não modifiquemos os atributos dependsOnGroups ou groups, nossos testes continuarão sendo executados com as dependências adequadas configuradas.

  • Sempre que um novo método precisa ser adicionado ao gráfico de dependência, tudo o que precisamos fazer é colocá-lo no grupo certo e ter certeza de que depende do grupo correto. Não precisamos modificar nenhum outro método.