TestNG - Test di dipendenza

A volte, potrebbe essere necessario richiamare metodi in uno scenario di test in un ordine particolare, oppure potrebbe essere necessario condividere alcuni dati e lo stato tra i metodi. Questo tipo di dipendenza è supportato da TestNG, poiché supporta la dichiarazione di dipendenze esplicite tra metodi di test.

TestNG ti consente di specificare le dipendenze con -

  • Utilizzando l'attributo dipendeOnMethods nelle annotazioni @Test, OR.

  • L'utilizzo dell'attributo dipendeOnGroups nelle annotazioni @Test.

Esempio Utilizzo di dependOnMethods

Crea una classe

Crea una classe java da testare, ad esempio, MessageUtil.java in 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;
   }
}

Crea classe test case

  • Crea una classe di test java, ad esempio DependencyTestUsingAnnotation.java.

  • Aggiungi metodi di test, testPrintMessage () e testSalutationMessage () e initEnvironmentTest (), alla tua classe di test.

  • Aggiungi attributo dependsOnMethods = {"initEnvironmentTest"} all'annotazione @Test di testSalutationMessage() metodo.

Crea un nome file di classe java DependencyTestUsingAnnotation.java in 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");
   }
}

Crea testng.xml

Crea testng.xml in C:\>TestNG_WORKSPACE per eseguire uno o più casi di test.

<?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>

Compilare le classi MessageUtil, Test case utilizzando javac.

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

Ora, esegui testng.xml, che eseguirà il metodo testSalutationMessage () solo dopo l'esecuzione del metodo initEnvironmentTest ().

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

Verifica l'output.

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

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

Esempio Utilizzo di dependesOnGroups

Puoi anche avere metodi che dipendono da interi gruppi. Facciamo un esempio per dimostrarlo.

Crea una classe

Crea una classe java da testare, ad esempio, MessageUtil.java in 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;
   }
}

Crea classe test case

  • Crea una classe di test java, ad esempio DependencyTestUsingAnnotation.java.

  • Aggiungi metodi di test, testPrintMessage () testSalutationMessage () e initEnvironmentTest () alla classe di test e aggiungili al gruppo "init".

  • Aggiungi l'attributo dependsOnMethods = {"init.*"} all'annotazione @Test di testSalutationMessage() metodo.

Crea un file di classe java denominato DependencyTestUsingAnnotation.java in 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");
   }
}

In questo esempio, testSalutationMessage () è dichiarato come dipendente da qualsiasi gruppo, corrispondente all'espressione regolare "init. *", Che garantisce che i metodi testPrintMessage () e initEnvironmentTest () verranno sempre richiamati prima di testSalutationMessage ().

Se un metodo da cui dipende non riesce e si ha una forte dipendenza da esso (alwaysRun = false, che è l'impostazione predefinita), i metodi che dipendono da esso non sono contrassegnati come FAIL ma come SKIP. I metodi ignorati verranno segnalati come tali nel report finale (in un colore che non è né rosso né verde in HTML), il che è importante poiché i metodi ignorati non sono necessariamente errori.

Crea testng.xml

Crea testng.xml in C:\>TestNG_WORKSPACE per eseguire uno o più casi di test.

<?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>

Compilare le classi MessageUtil, Test case utilizzando javac.

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

Ora, esegui testng.xml, che eseguirà il metodo testSalutationMessage () solo dopo l'esecuzione del metodo initEnvironmentTest () .

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

Verifica l'output.

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

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

dependOnGroups vs. dependanceOnMethods

  • Utilizzando i gruppi, non siamo più esposti a problemi di refactoring. Finché non modifichiamo gli attributi dependOnGroups o groups, i nostri test continueranno a essere eseguiti con le corrette dipendenze impostate.

  • Ogni volta che è necessario aggiungere un nuovo metodo nel grafico delle dipendenze, tutto ciò che dobbiamo fare è inserirlo nel gruppo giusto e assicurarci che dipenda dal gruppo corretto. Non è necessario modificare nessun altro metodo.