TestNG - Szybki przewodnik

Testowanie to proces sprawdzania funkcjonalności aplikacji w celu upewnienia się, że działa ona zgodnie z wymaganiami. Testowanie jednostkowe pojawia się na poziomie programisty, gdzie podejmuje się odpowiednie środki w celu przetestowania każdej pojedynczej jednostki (klasy lub metody), aby upewnić się, że produkt końcowy spełnia wymagania.

JUnit skłonił programistów do zrozumienia przydatności testów, zwłaszcza testów jednostkowych, w porównaniu z jakimkolwiek innym środowiskiem testowym. Wykorzystując raczej prostą, pragmatyczną i surową architekturę, JUnit był w stanie „zainfekować” dużą liczbę programistów. Zapoznaj się z naszym samouczkiem dotyczącym JUnit, aby dobrze zrozumieć jego funkcje. JUnit ma jednocześnie pewne wady, które są wymienione poniżej -

  • Początkowo zaprojektowany, aby umożliwić tylko testowanie jednostkowe, teraz jest używany do wszelkiego rodzaju testów.

  • Nie można przeprowadzić testów zależności.

  • Słaba kontrola konfiguracji (setUp / tearDown).

  • Intrusive (zmusza cię do rozszerzania klas i nazywania metod w określony sposób).

  • Statyczny model programowania (wymusza niepotrzebną rekompilację).

  • Zarządzanie różnymi zestawami testów w złożonych projektach może być bardzo trudne.

Co to jest TestNG?

Definicja TestNG zgodnie z jego dokumentacją jest następująca -

TestNG to platforma testowa inspirowana JUnit i NUnit, ale wprowadzająca kilka nowych funkcji, które sprawiają, że jest ona potężniejsza i łatwiejsza w użyciu.

TestNG to zautomatyzowana platforma testowa typu open source; gdzieNG znaczy NwewGenergia. TestNG jest podobny do JUnit (zwłaszcza JUnit 4), ale nie jest rozszerzeniem JUnit. Inspiruje się JUnit. Został zaprojektowany tak, aby był lepszy niż JUnit, szczególnie podczas testowania klas zintegrowanych. Twórcą TestNG jest Cedric Beust .

Eliminując większość ograniczeń starszego frameworka, TestNG daje programiście możliwość pisania bardziej elastycznych i wydajnych testów. Ponieważ w dużym stopniu korzysta z adnotacji Java (wprowadzonych w JDK 5.0) do definiowania testów, może również pokazać, jak używać tej nowej funkcji języka Java w prawdziwym środowisku produkcyjnym.

Funkcje TestNG

  • Obsługuje adnotacje.

  • TestNG wykorzystuje więcej funkcji Java i OO.

  • Obsługuje testowanie klas zintegrowanych (np. Domyślnie nie ma potrzeby tworzenia nowej instancji klasy testowej dla każdej metody testowej).

  • Oddziela kod testu w czasie kompilacji od informacji o konfiguracji / danych w czasie wykonywania.

  • Elastyczna konfiguracja środowiska wykonawczego.

  • Wprowadza „grupy testowe”. Po skompilowaniu testów możesz po prostu poprosić TestNG o wykonanie wszystkich testów „front-end”, testów „szybkich”, „wolnych”, „bazodanowych” itp.

  • Obsługuje zależne metody testowe, testowanie równoległe, testowanie obciążenia i częściowe awarie.

  • Elastyczny interfejs API wtyczek.

  • Wsparcie dla testów wielowątkowych.

TestNG to framework dla Javy, więc pierwszym wymaganiem jest zainstalowanie JDK na twojej maszynie.

Wymagania systemowe

JDK 1.5 lub nowszy.
Pamięć Brak minimalnych wymagań.
Miejsca na dysku Brak minimalnych wymagań.
System operacyjny Brak minimalnych wymagań.

Krok 1 - Zweryfikuj instalację Java na swoim komputerze

Otwórz konsolę i wykonaj polecenie java w oparciu o system operacyjny zainstalowany w systemie.

OS Zadanie Komenda
Windows Otwórz konsolę poleceń c: \> java -version
Linux Otwórz terminal poleceń $ java -version
Prochowiec Otwórz terminal maszyna: ~ joseph $ java -version

Sprawdźmy dane wyjściowe dla wszystkich systemów operacyjnych -

OS Wynik
Windows

wersja java „1.7.0_25”

Środowisko wykonawcze Java (TM) SE (kompilacja 1.7.0_25-b15)

Java HotSpot (TM) 64-bitowa maszyna wirtualna serwera (wersja 23.25-b01, tryb mieszany)

Linux

wersja java „1.7.0_25”

Środowisko wykonawcze Java (TM) SE (kompilacja 1.7.0_25-b15)

Java HotSpot (TM) 64-bitowa maszyna wirtualna serwera (wersja 23.25-b01, tryb mieszany)

Prochowiec

wersja java „1.7.0_25”

Środowisko wykonawcze Java (TM) SE (kompilacja 1.7.0_25-b15)

Java HotSpot (TM) 64-bitowa maszyna wirtualna serwera (wersja 23.25-b01, tryb mieszany)

Jeśli nie masz oprogramowania Java, zainstaluj pakiet Java Software Development Kit (SDK) z witryny https://www.oracle.com/technetwork/java/javase/downloads/index.html. Zakładamy Java 1.7.0_25 jako zainstalowaną wersję dla tego samouczka.

Krok 2: Ustaw środowisko JAVA

Ustaw JAVA_HOMEzmienna środowiskowa wskazująca lokalizację katalogu podstawowego, w którym na komputerze jest zainstalowana Java. Na przykład,

OS Wynik
Windows Ustaw zmienną środowiskową JAVA_HOME na C: \ Program Files \ Java \ jdk1.7.0_25.
Linux Eksportuj JAVA_HOME = / usr / local / java-current.
Prochowiec Eksportuj JAVA_HOME = / Library / Java / Home.

Dołącz lokalizację kompilatora Java do ścieżki systemowej.

OS Wynik
Windows Dołącz ciąg C: \ Program Files \ Java \ jdk1.7.0_25 \ bin na końcu zmiennej systemowej Path.
Linux ŚCIEŻKA eksportu =$PATH:$JAVA_HOME / bin /
Prochowiec Nie wymagane

Sprawdź instalację oprogramowania Java za pomocą polecenia java -version jak wyjaśniono powyżej.

Krok 3: Pobierz archiwum TestNG

Pobierz najnowszą wersję pliku jar TestNG z witryny http://www.testng.org. W czasie pisania tego samouczka pobraliśmy testng-6.8.jar i skopiowaliśmy go do folderu C: \> TestNG.

OS Nazwa archiwum
Windows testng-6.8.jar
Linux testng-6.8.jar
Prochowiec testng-6.8.jar

Krok 4: Ustaw środowisko TestNG

Ustaw TESTNG_HOMEzmienną środowiskową, aby wskazywała lokalizację katalogu podstawowego, w którym plik jar TestNG jest przechowywany na komputerze. Poniższa tabela pokazuje, jak ustawić zmienną środowiskową w systemie Windows, Linux i Mac, zakładając, że przechowujemy testng-6.8.jar w lokalizacji C: \> TestNG.

OS Opis
Windows Ustaw zmienną środowiskową TESTNG_HOME na C: \ TESTNG.
Linux Eksportuj TESTNG_HOME = / usr / local / TESTNG
Prochowiec Eksportuj TESTNG_HOME = / Library / TESTNG

Krok 5: Ustaw zmienną CLASSPATH

Ustaw CLASSPATH zmienna środowiskowa wskazująca lokalizację jar TestNG.

OS Opis
Windows Ustaw zmienną środowiskową CLASSPATH na% CLASSPATH%;% TESTNG_HOME% \ testng-6.8.jar.
Linux Eksportuj CLASSPATH =$CLASSPATH:$TESTNG_HOME / testng-6.8.jar.
Prochowiec Eksportuj CLASSPATH =$CLASSPATH:$TESTNG_HOME / testng-6.8.jar.

Krok 6: Przetestuj konfigurację TestNG

Utwórz plik klasy Java o nazwie TestNGSimpleTest w C:\>TestNG_WORKSPACE.

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

public class TestNGSimpleTest {
   @Test
   public void testAdd() {
      String str = "TestNG is working fine";
      AssertEquals("TestNG is working fine", str);
   }
}

TestNG można wywołać na kilka różnych sposobów -

  • Z plikiem testng.xml.
  • Z ANT.
  • Z wiersza poleceń.

Wywołajmy się używając pliku testng.xml. Utwórz plik xml o nazwie testng.xml w formacieC:\>TestNG_WORKSPACE do wykonania przypadków testowych.

<?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 = "TestNGSimpleTest"/>
      </classes>
   </test>
</suite>

Krok 7: Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\TestNG_WORKSPACE>javac TestNGSimpleTest.java

Teraz wywołaj testng.xml, aby zobaczyć wynik -

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

Sprawdź dane wyjściowe.

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

Pisanie testu w TestNG obejmuje zasadniczo następujące kroki -

  • Napisz logikę biznesową swojego testu i wstaw adnotacje TestNG w swoim kodzie.

  • Dodaj informacje o swoim teście (np. Nazwę klasy, grupy, które chcesz uruchomić, itp.) W pliku testng.xml lub build.xml.

  • Uruchom TestNG.

Tutaj zobaczymy jeden kompletny przykład testowania TestNG przy użyciu klasy POJO, klasy logiki biznesowej i testowego pliku XML, który zostanie uruchomiony przez TestNG.

Stwórz EmployeeDetails.java w C:\>TestNG_WORKSPACE, która jest klasą POJO.

public class EmployeeDetails {

   private String name;
   private double monthlySalary;
   private int age;
   
   // @return the name

   public String getName() {
      return name;
   }
   
   // @param name the name to set
   
   public void setName(String name) {
      this.name = name;
   }
   
   // @return the monthlySalary

   public double getMonthlySalary() {
      return monthlySalary;
   }
   
   // @param monthlySalary the monthlySalary to set
   
   public void setMonthlySalary(double monthlySalary) {
      this.monthlySalary = monthlySalary;
   }
   
   // @return the age
 
   public int getAge() {
      return age;
   }
   
   // @param age the age to set
 
   public void setAge(int age) {
      this.age = age;
   }
}

EmployeeDetails klasa jest używana do -

  • pobierz / ustaw wartość nazwiska pracownika.
  • uzyskać / ustawić wysokość miesięcznego wynagrodzenia pracownika.
  • pobrać / ustawić wartość wieku pracownika.

Stworzyć EmpBusinessLogic.java w C:\>TestNG_WORKSPACE, który zawiera logikę biznesową.

public class EmpBusinessLogic {

   // Calculate the yearly salary of employee
   public double calculateYearlySalary(EmployeeDetails employeeDetails) {
      double yearlySalary = 0;
      yearlySalary = employeeDetails.getMonthlySalary() * 12;
      return yearlySalary;
   }
	
   // Calculate the appraisal amount of employee
   public double calculateAppraisal(EmployeeDetails employeeDetails) {
   
      double appraisal = 0;
      
      if(employeeDetails.getMonthlySalary() < 10000) {
         appraisal = 500;
         
      } else {
         appraisal = 1000;
      }
      
      return appraisal;
   }
}

EmpBusinessLogic klasa służy do obliczania -

  • roczne wynagrodzenie pracownika.
  • wyceniana kwota pracownika.

Teraz stwórzmy klasę TestNG o nazwie TestEmployeeDetails.javaw C: \> TestNG_WORKSPACE. Klasa TestNG to klasa Java zawierająca co najmniej jedną adnotację TestNG. Ta klasa zawiera przypadki testowe do przetestowania. Test TestNG można skonfigurować za pomocą adnotacji @BeforeXXX i @AfterXXX (zobaczymy to w rozdziale TestNG - Procedura wykonania ), co pozwala na wykonanie pewnej logiki Javy przed i po określonym punkcie.

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

public class TestEmployeeDetails {
   EmpBusinessLogic empBusinessLogic = new EmpBusinessLogic();
   EmployeeDetails employee = new EmployeeDetails();

   @Test
   public void testCalculateAppriasal() {
   
      employee.setName("Rajeev");
      employee.setAge(25);
      employee.setMonthlySalary(8000);
      
      double appraisal = empBusinessLogic.calculateAppraisal(employee);
      Assert.assertEquals(500, appraisal, 0.0, "500");
   }

   // Test to check yearly salary
   @Test
   public void testCalculateYearlySalary() {
   
      employee.setName("Rajeev");
      employee.setAge(25);
      employee.setMonthlySalary(8000);
      
      double salary = empBusinessLogic.calculateYearlySalary(employee);
      Assert.assertEquals(96000, salary, 0.0, "8000");
   }
}

TestEmployeeDetails klasa służy do testowania metod EmpBusinessLogicklasa. Wykonuje następujące czynności -

  • Testuje roczne wynagrodzenie pracownika.

  • Testuje wycenę pracownika.

Zanim będzie można uruchomić testy, należy skonfigurować TestNG przy użyciu specjalnego pliku XML, nazywanego umownie testng.xml. Składnia tego pliku jest bardzo prosta, a jego zawartość jest pokazana poniżej. Utwórz ten plik wC:\>TestNG_WORKSPACE.

<?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 = "TestEmployeeDetails"/>
      </classes>
   </test>
</suite>

Szczegóły powyższego pliku są następujące -

  • Zestaw jest reprezentowany przez jeden plik XML. Może zawierać jeden lub więcej testów i jest definiowany przez tag <suite>.

  • Tag <test> reprezentuje jeden test i może zawierać jedną lub więcej klas TestNG.

  • Tag <class> reprezentuje klasę TestNG. Jest to klasa Java, która zawiera co najmniej jedną adnotację TestNG. Może zawierać jedną lub więcej metod testowych.

Skompiluj klasy przypadków testowych przy użyciu javac.

C:\TestNG_WORKSPACE>javac EmployeeDetails.java EmpBusinessLogic.java TestEmployeeDetails.java

Teraz TestNG za pomocą następującego polecenia -

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

Jeśli wszystko zostało zrobione poprawnie, powinieneś zobaczyć wyniki swoich testów w konsoli. Ponadto TestNG tworzy bardzo ładny raport HTML w folderze o nazwietest-outputktóry jest automatycznie tworzony w bieżącym katalogu. Jeśli go otworzysz i załadujesz index.html, zobaczysz stronę podobną do tej na obrazku poniżej -

Tradycyjnym sposobem wskazywania metod testowych w JUnit 3 jest poprzedzanie ich nazw przedrostkiem test. Jest to bardzo skuteczna metoda oznaczania pewnych metod w klasie jako mających specjalne znaczenie, ale nazewnictwo nie jest dobrze skalowane (a co jeśli chcemy dodać więcej tagów dla różnych frameworków?) I jest raczej nieelastyczne (co jeśli chcesz przekazać dodatkowe parametry do platformy testowej?).

Adnotacje zostały formalnie dodane do języka Java w JDK 5, a TestNG zdecydował się na użycie adnotacji do adnotacji klas testowych.

Oto lista adnotacji obsługiwanych przez TestNG -

Sr.No. Adnotacja i opis
1

@BeforeSuite

Metoda z adnotacjami zostanie uruchomiona tylko raz przed wykonaniem wszystkich testów w tym pakiecie.

2

@AfterSuite

Metoda z adnotacjami zostanie uruchomiona tylko raz po wykonaniu wszystkich testów w tym pakiecie.

3

@BeforeClass

Metoda z adnotacjami zostanie uruchomiona tylko raz przed wywołaniem pierwszej metody testowej w bieżącej klasie.

4

@AfterClass

Metoda z adnotacjami zostanie uruchomiona tylko raz po uruchomieniu wszystkich metod testowych w bieżącej klasie.

5

@BeforeTest

Metoda z adnotacjami zostanie uruchomiona przed uruchomieniem jakiejkolwiek metody testowej należącej do klas wewnątrz tagu <test>.

6

@AfterTest

Metoda z adnotacjami zostanie uruchomiona po uruchomieniu wszystkich metod testowych należących do klas wewnątrz tagu <test>.

7

@BeforeGroups

Lista grup, dla których ta metoda konfiguracji będzie działać wcześniej. Ta metoda jest gwarantowana na krótko przed wywołaniem pierwszej metody testowej należącej do którejkolwiek z tych grup.

8

@AfterGroups

Lista grup, po których będzie działać ta metoda konfiguracji. Ta metoda zostanie uruchomiona wkrótce po wywołaniu ostatniej metody testowej należącej do którejkolwiek z tych grup.

9

@BeforeMethod

Opisana metoda zostanie uruchomiona przed każdą metodą testową.

10

@AfterMethod

Opisana metoda zostanie uruchomiona po każdej metodzie testowej.

11

@DataProvider

Oznacza metodę jako dostarczającą dane dla metody testowej. Metoda z adnotacjami musi zwracać Object [] [], gdzie do każdego obiektu [] można przypisać listę parametrów metody testowej. Metoda @Test, która chce odbierać dane od tego dostawcy danych, musi używać nazwy dostawcy danych równej nazwie tej adnotacji.

12

@Factory

Oznacza metodę jako fabrykę, która zwraca obiekty, które będą używane przez TestNG jako klasy Test. Metoda musi zwracać Object [].

13

@Listeners

Definiuje słuchaczy w klasie testowej.

14

@Parameters

Opisuje sposób przekazywania parametrów do metody @Test.

15

@Test

Oznacza klasę lub metodę jako część testu.

Korzyści z używania adnotacji

Oto niektóre zalety korzystania z adnotacji -

  • TestNG identyfikuje metody, którymi jest zainteresowany, wyszukując adnotacje. Dlatego nazwy metod nie są ograniczone do żadnego wzorca ani formatu.

  • Do adnotacji możemy przekazać dodatkowe parametry.

  • Adnotacje są silnie wpisane, więc kompilator od razu oznaczy wszelkie błędy.

  • Klasy testowe nie muszą już niczego rozszerzać (na przykład TestCase, dla JUnit 3).

W tym rozdziale wyjaśniono procedurę wykonywania metod w TestNG. Wyjaśnia kolejność wywoływanych metod. Oto procedura wykonania metod testowego API TestNG wraz z przykładem.

Utwórz nazwę pliku klasy Java TestngAnnotation.java w C:\>TestNG_WORKSPACE do testowania adnotacji.

import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.AfterSuite;

public class TestngAnnotation {
   // test case 1
   @Test
   public void testCase1() {
      System.out.println("in test case 1");
   }

   // test case 2
   @Test
   public void testCase2() {
      System.out.println("in test case 2");
   }

   @BeforeMethod
   public void beforeMethod() {
      System.out.println("in beforeMethod");
   }

   @AfterMethod
   public void afterMethod() {
      System.out.println("in afterMethod");
   }

   @BeforeClass
   public void beforeClass() {
      System.out.println("in beforeClass");
   }

   @AfterClass
   public void afterClass() {
      System.out.println("in afterClass");
   }

   @BeforeTest
   public void beforeTest() {
      System.out.println("in beforeTest");
   }

   @AfterTest
   public void afterTest() {
      System.out.println("in afterTest");
   }

   @BeforeSuite
   public void beforeSuite() {
      System.out.println("in beforeSuite");
   }

   @AfterSuite
   public void afterSuite() {
      System.out.println("in afterSuite");
   }

}

Następnie utwórzmy plik testng.xml w C:\>TestNG_WORKSPACE do wykonywania adnotacji.

<?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 = "TestngAnnotation"/>
      </classes>
   </test>
</suite>

Skompiluj klasę przypadku testowego przy użyciu javac.

C:\TestNG_WORKSPACE>javac TestngAnnotation.java

Teraz uruchom plik testng.xml, który uruchomi przypadek testowy zdefiniowany w podanej klasie Test Case.

C:\TestNG_WORKSPACE>java org.testng.TestNG testng.xml

Sprawdź dane wyjściowe.

in beforeSuite
in beforeTest
in beforeClass
in beforeMethod
in test case 1
in afterMethod
in beforeMethod
in test case 2
in afterMethod
in afterClass
in afterTest
in afterSuite

===============================================
Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================

W oparciu o powyższe dane wyjściowe procedura wykonania jest następująca -

  • Przede wszystkim metoda beforeSuite () jest wykonywana tylko raz.

  • Wreszcie metoda afterSuite () jest wykonywana tylko raz.

  • Nawet metody beforeTest (), beforeClass (), afterClass () i afterTest () są wykonywane tylko raz.

  • Metoda beforeMethod () jest wykonywana dla każdego przypadku testowego, ale przed wykonaniem przypadku testowego.

  • afterMethod () jest wykonywana dla każdego przypadku testowego, ale po wykonaniu przypadku testowego.

  • Każdy przypadek testowy jest wykonywany pomiędzy beforeMethod () i afterMethod ().

Przypadki testowe są wykonywane przy użyciu TestNGklasa. Ta klasa jest głównym punktem wejścia do uruchamiania testów w ramach TestNG. Użytkownicy mogą tworzyć własne obiekty TestNG i wywoływać je na wiele różnych sposobów, na przykład -

  • W istniejącym pliku testng.xml.

  • Na syntetycznym testng.xml, stworzonym w całości z Javy.

  • Poprzez bezpośrednie ustawienie klas testowych.

Możesz także zdefiniować, które grupy chcesz uwzględnić lub wykluczyć, przypisać parametry itp. Parametry wiersza poleceń to -

  • -d katalog wyjściowy: określ katalog wyjściowy.

  • -testclass nazwa_klasy: określa jedną lub kilka nazw klas.

  • -testjar nazwa_jar: określa jar zawierający testy.

  • -sourcedir src1; src2:; oddzielna lista katalogów źródłowych (używana tylko wtedy, gdy używane są adnotacje javadoc).

  • -target

  • -groups

  • -testrunfactory

  • -listener

W poniższym przykładzie utworzymy obiekt TestNG jako istniejący testng.xml.

Utwórz klasę

Utwórz klasę Java do przetestowania, powiedzmy MessageUtil.java w C:\>TestNG_WORKSPACE.

/*
* This class prints the given message on console.
*/

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;
   }   
}

Utwórz klasę przypadku testowego

  • Utwórz klasę testową java, powiedzmy, SampleTest.java.

  • Dodaj metodę testową testPrintMessage () do swojej klasy testowej.

  • Dodaj adnotację @Test do metody testPrintMessage ().

  • Zaimplementuj warunek testowy i sprawdź warunek za pomocą funkcji API assertEquals TestNG.

Utwórz plik klasy Java o nazwie SampleTest.java w C:\>TestNG_WORKSPACE.

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

public class SampleTest {
	
   String message = "Hello World";
   MessageUtil messageUtil = new MessageUtil(message);

   @Test
   public void testPrintMessage() {
      Assert.assertEquals(message, messageUtil.printMessage());
   }
}

Utwórz plik testng.xml

Następnie stwórzmy plik testng.xml w formacie C:\>TestNG_WORKSPACE, do wykonania przypadków testowych. Ten plik zawiera wszystkie testy w formacie XML. Ten plik ułatwia opisanie wszystkich zestawów testów i ich parametrów w jednym pliku, który można sprawdzić w repozytorium kodu lub wysłać e-mailem do współpracowników. Ułatwia również wyodrębnianie podzbiorów testów lub dzielenie kilku konfiguracji środowiska wykonawczego (np. Testngdatabase.xml może uruchamiać tylko testy sprawdzające bazę danych).

<?xml version = "1.0" encoding = "UTF-8"?>

<suite name = "Sample test Suite">
   <test name = "Sample test">
      <classes>
         <class name = "SampleTest" />
      </classes>
   </test>
</suite>

Skompiluj przypadek testowy przy użyciu javac.

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

Teraz uruchom testng.xml, który uruchomi przypadek testowy zdefiniowany w tagu <test>.

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

Sprawdź dane wyjściowe.

Hello World

===============================================
Sample test Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================

ZA test suiteto zbiór przypadków testowych przeznaczonych do testowania zachowania lub zestawu zachowań programu. W TestNG nie możemy zdefiniować zestawu w testowaniu kodu źródłowego, ale jest on reprezentowany przez jeden plik XML, ponieważ zestaw jest funkcją wykonania. Pozwala również na elastyczną konfigurację testów . Zestaw może zawierać jeden lub więcej testów i jest definiowany przez tag <suite>.

<suite> to główny tag pliku testng.xml. Opisuje zestaw testów, który z kolei składa się z kilku sekcji <test>.

W poniższej tabeli wymieniono wszystkie atrybuty prawne, które akceptuje <suite>.

Sr.No. Atrybut i opis
1

name

Nazwa tego zestawu. To jestmandatory atrybut.

2

verbose

Poziom lub szczegółowość tego przebiegu.

3

parallel

Czy TestNG powinien uruchamiać różne wątki, aby uruchomić ten pakiet.

4

thread-count

Liczba wątków do użycia, jeśli tryb równoległy jest włączony (w przeciwnym razie jest ignorowany).

5

annotations

Typ adnotacji, których używasz w testach.

6

time-out

Domyślny limit czasu, który będzie używany we wszystkich metodach testowych znalezionych w tym teście.

W tym rozdziale pokażemy przykład, w którym dwie klasy testowe, Test1 i Test2, działają razem przy użyciu Test Suite.

Utwórz klasę

Utwórz klasę Java do przetestowania, powiedzmy MessageUtil.java w C:\>JUNIT_WORKSPACE.

/*
* This class prints the given message on console.
*/

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;
   }
}

Utwórz klasy przypadków testowych

Utwórz plik klasy Java o nazwie Test1.java w C:\>TestNG_WORKSPACE.

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

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

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

Utwórz plik klasy Java o nazwie Test2.java w C:\>TestNG_WORKSPACE.

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

public class Test2 {
   String message = "Manisha";	
   MessageUtil messageUtil = new MessageUtil(message);
	 
   @Test
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Manisha";
      Assert.assertEquals(message,messageUtil.salutationMessage());
   }
}

Teraz napiszmy plik testng.xml w formacie C:\>TestNG_WORKSPACE, który zawierałby tag <suite> w następujący sposób -

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

<suite name = "Suite1">

   <test name = "exampletest1">
      <classes>
         <class name = "Test1" />
      </classes>
   </test>
  
   <test name = "exampletest2">
      <classes>
         <class name = "Test2" />
      </classes>
   </test>
  
</suite>

Suite1 zawiera exampletest1 i exampletest2.

Skompiluj wszystkie klasy Java za pomocą javac.

C:\TestNG_WORKSPACE>javac MessageUtil.java Test1.java Test2.java

Teraz uruchom plik testng.xml, który uruchomi przypadek testowy zdefiniowany w podanej klasie Test Case.

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

Sprawdź dane wyjściowe.

Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha

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

Możesz również sprawdzić folder test-output . W folderze Suite1 można zobaczyć dwa utworzone pliki html, exampletest1.html i exampletest2.html, które wyglądałyby następująco -

Czasami zdarza się, że nasz kod nie jest gotowy i przypadek testowy napisany w celu przetestowania tej metody / kodu zawodzi. W takich przypadkach adnotacja@Test(enabled = false) pomaga wyłączyć ten przypadek testowy.

Jeśli metoda testowa jest opatrzona adnotacją @Test (enabled = false) , przypadek testowy, który nie jest gotowy do testowania, jest pomijany.

Teraz zobaczmy, jak @Test (enabled = false) działa.

Utwórz klasę

Utwórz klasę Java do przetestowania, powiedzmy MessageUtil.java w C:\>TestNG_WORKSPACE.

/*
* This class prints the given message on console.
*/

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;
   }   
}

Utwórz klasę przypadku testowego

  • Utwórz klasę testową java, powiedzmy, IgnoreTest.java.

  • Dodaj metody testowe, testPrintMessage () i testSalutationMessage () do swojej klasy testowej.

  • Dodaj adnotację @Test (enabled = false) do metody testPrintMessage ().

Utwórz plik klasy Java o nazwie IgnoreTest.java w C:\>TestNG_WORKSPACE.

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

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

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

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

Utwórz plik testng.xml

Utwórz plik testng.xml w formacie C:\>TestNG_WORKSPACE do wykonania przypadków testowych.

<?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 = "IgnoreTest" />
      </classes>
   </test>
</suite>

Skompiluj MessageUtil i klasy przypadków testowych przy użyciu javac.

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

Teraz uruchom testng.xml, który nie uruchomi testPrintMessage () przypadku testowego zdefiniowanego w podanej klasie Test Case.

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

Sprawdź dane wyjściowe. Przypadek testowy testPrintMessage () nie jest testowany.

Inside testSalutationMessage()
Hi!Manisha

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

Możesz też zignorować grupę testów, które zostaną omówione w następnym rozdziale.

Test grupowy to nowa innowacyjna funkcja w TestNG, która nie istnieje we frameworku JUnit. Umożliwia wysyłanie metod do odpowiednich porcji i wykonywanie wyrafinowanych grup metod testowych.

Możesz nie tylko zadeklarować metody należące do grup, ale możesz także określić grupy zawierające inne grupy. Następnie można wywołać TestNG i poprosić o uwzględnienie określonego zestawu grup (lub wyrażeń regularnych), jednocześnie wykluczając inny zestaw.

Testy grupowe zapewniają maksymalną elastyczność podziału testów i nie wymagają rekompilowania niczego, jeśli chcesz uruchomić dwa różne zestawy testów jeden po drugim.

Grupy są określane w pliku testng.xml za pomocą tagu <groups>. Można go znaleźć pod tagiem <test> lub <suite>. Grupy określone w tagu <suite> mają zastosowanie do wszystkich tagów <test> poniżej.

A teraz weźmy przykład, aby zobaczyć, jak działa test grupowy.

Utwórz klasę

Utwórz klasę Java do przetestowania, powiedzmy MessageUtil.java w C:\> TestNG_WORKSPACE.

/*
* This class prints the given message on console.
*/
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 "tutorialspoint" to the message
   public String salutationMessage() {
      message = "tutorialspoint" + message;
      System.out.println(message);
      return message;
   }

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

Utwórz klasę przypadku testowego

  • Utwórz klasę testową Java, na przykład GroupTestExample.java.

  • Dodaj metody testowe, testPrintMessage () i testSalutationMessage (), do swojej klasy testowej.

  • Pogrupuj metodę badawczą w dwie kategorie -

    • Check-in tests (checkintest)- Te testy należy przeprowadzić przed przesłaniem nowego kodu. Zwykle powinny być szybkie i upewnić się, że żadna podstawowa funkcjonalność nie jest uszkodzona.

    • Functional tests (functest) - Testy te powinny obejmować wszystkie funkcje oprogramowania i być uruchamiane co najmniej raz dziennie, chociaż najlepiej byłoby, gdybyś chciał je uruchamiać w sposób ciągły.

Utwórz plik klasy Java o nazwie GroupTestExample.java w C:\>TestNG_WORKSPACE.

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

public class GroupTestExample {
   String message = ".com";
   MessageUtil messageUtil = new MessageUtil(message);

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

   @Test(groups = { "checkintest" })
   
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "tutorialspoint" + ".com";
      Assert.assertEquals(message, messageUtil.salutationMessage());
   }

   @Test(groups = { "functest" })
   
   public void testingExitMessage() {
      System.out.println("Inside testExitMessage()");
      message = "www." + "tutorialspoint"+".com";
      Assert.assertEquals(message, messageUtil.exitMessage());
   }  
}

Utwórz plik testng.xml

Utwórz plik testng.xml w formacie C:\> TestNG_WORKSPACE, do wykonania przypadków testowych. Tutaj wykonywalibyśmy tylko te testy, które należą do grupy functest .

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

<suite name = "Suite1">
   <test name = "test1">
   
      <groups>
         <run>
            <include name = "functest" />
         </run>
      </groups>

      <classes>
         <class name = "GroupTestExample" />
      </classes>
   
   </test>
</suite>

Skompiluj MessageUtil, klasy przypadków testowych przy użyciu javac.

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

Teraz uruchom plik testng.xml, który uruchomi tylko metodę testPrintMessage (), ponieważ należy do grupy functest .

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

Sprawdź dane wyjściowe. Wykonywana jest tylko metoda testPrintMessage ().

Inside testPrintMessage()
.com
Inside testExitMessage()
www..com

===============================================
Suite1
Total tests run: 2, Failures: 1, Skips: 0
===============================================

Grupa grup

Grupy mogą również zawierać inne grupy. Te grupy są nazywaneMetaGroups. Na przykład, można zdefiniować grupę całą który zawiera checkintest i functest . Zmodyfikujmy nasz plik testng.xml w następujący sposób -

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
   <test name = "test1">
   
      <groups>
      
         <define name = "all">
            <include name = "functest"/>
            <include name = "checkintest"/>
         </define>
         
         <run>
            <include name = "all"/>
         </run>
         
      </groups>
      
      <classes>
         <class name = "GroupTestExample" />
      </classes>
      
   </test>
</suite>

Uruchomienie powyższego testng.xml spowoduje wykonanie wszystkich trzech testów i da następujący wynik -

Inside testPrintMessage()
.com
Inside testSalutationMessage()
tutorialspoint.com
Inside testExitMessage()
www.tutorialspoint.com

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

Grupy wykluczeń

Możesz zignorować grupę, używając tagu <exclude>, jak pokazano poniżej -

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

      <groups>
         <define name = "all">
            <exclude name = "functest"/>
            <include name = "checkintest"/>
         </define>

         <run>
            <include name = "all"/>
         </run>
      </groups>

      <classes>
         <class name = "GroupTestExample" />
      </classes>

   </test>
</suite>

TestNG zapewnia opcję śledzenia obsługi wyjątków kodu. Możesz sprawdzić, czy kod zgłasza żądany wyjątek, czy nie. TutajexpectedExceptionsparametr jest używany wraz z adnotacją @Test. A teraz zobaczmy@Test(expectedExceptions) w akcji.

Utwórz klasę

Utwórz klasę Java do przetestowania, powiedzmy MessageUtil.java w C:\> TestNG_WORKSPACE. Dodaj warunek błędu wewnątrz metody printMessage ().

/*
* This class prints the given message on console.
*/
public class MessageUtil {

   private String message;

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

   // prints the message
   public void printMessage() {
      System.out.println(message);
      int a =0;
      int b = 1/a;
   }   

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

Utwórz klasę przypadku testowego

  • Utwórz klasę testową java, powiedzmy, ExpectedExceptionTest.java.

  • Dodaj oczekiwany wyjątek ArithmeticException do przypadku testowego testPrintMessage ().

Utwórz plik klasy Java o nazwie ExpectedExceptionTest.java w C:\> TestNG_WORKSPACE.

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

public class ExpectedExceptionTest {
   String message = "Manisha";	
   MessageUtil messageUtil = new MessageUtil(message);
	   
   @Test(expectedExceptions = ArithmeticException.class)
   public void testPrintMessage() {	
      System.out.println("Inside testPrintMessage()");     
      messageUtil.printMessage();     
   }
   
   @Test
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Manisha";
      Assert.assertEquals(message,messageUtil.salutationMessage());
   }
}

Utwórz test runner

Utwórz plik testng.xml w formacie C:\>TestNG_WORKSPACE do wykonania przypadków testowych.

<?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 = "ExpectedExceptionTest" />
      </classes>
   </test>
</suite>

Skompiluj MessageUtil, klasy przypadków testowych przy użyciu javac.

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

Teraz uruchom Test Runner, który uruchomi przypadki testowe zdefiniowane w podanej klasie Test Case.

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

Sprawdź dane wyjściowe. Przypadek testowy testPrintMessage () zostanie zaliczony.

Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha

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

Czasami może zajść potrzeba wywołania metod w przypadku testowym w określonej kolejności lub możesz chcieć udostępnić niektóre dane i stan między metodami. Ten rodzaj zależności jest obsługiwany przez TestNG, ponieważ obsługuje deklarację jawnych zależności między metodami testowymi.

TestNG pozwala określić zależności za pomocą -

  • Korzystanie z atrybutu dependsOnMethods w adnotacjach @Test, LUB.

  • Korzystanie z atrybutu dependsOnGroups w adnotacjach @Test.

Przykład Korzystanie z dependOnMethods

Utwórz klasę

Utwórz klasę Java do przetestowania, powiedzmy MessageUtil.java w 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;
   }
}

Utwórz klasę przypadku testowego

  • Utwórz klasę testową java, na przykład DependencyTestUsingAnnotation.java.

  • Dodaj metody testowe, testPrintMessage () i testSalutationMessage () oraz initEnvironmentTest () do swojej klasy testowej.

  • Dodaj atrybut dependsOnMethods = {"initEnvironmentTest"} do adnotacji @Test dla testSalutationMessage() metoda.

Utwórz nazwę pliku klasy Java DependencyTestUsingAnnotation.java w 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");
   }
}

Utwórz plik testng.xml

Utwórz plik testng.xml w formacie C:\>TestNG_WORKSPACE do wykonania przypadków testowych.

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

Skompiluj MessageUtil, klasy przypadków testowych przy użyciu javac.

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

Teraz uruchom testng.xml, który uruchomi metodę testSalutationMessage () dopiero po wykonaniu metody initEnvironmentTest ().

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

Sprawdź dane wyjściowe.

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

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

Przykład Korzystanie z dependOnGroups

Możesz także mieć metody zależne od całych grup. Zobaczmy przykład, aby to zademonstrować.

Utwórz klasę

Utwórz klasę Java do przetestowania, powiedzmy MessageUtil.java w 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;
   }
}

Utwórz klasę przypadku testowego

  • Utwórz klasę testową java, na przykład DependencyTestUsingAnnotation.java.

  • Dodaj metody testowe, testPrintMessage () testSalutationMessage () i initEnvironmentTest () do swojej klasy testowej, a następnie dodaj je do grupy „init”.

  • Dodaj atrybut dependsOnMethods = {"init.*"} do adnotacji @Test dla testSalutationMessage() metoda.

Utwórz plik klasy Java o nazwie DependencyTestUsingAnnotation.java w 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");
   }
}

W tym przykładzie testSalutationMessage () jest zadeklarowana jako zależna od dowolnej grupy, pasująca do wyrażenia regularnego „init. *”, Co gwarantuje, że metody testPrintMessage () i initEnvironmentTest () będą zawsze wywoływane przed testSalutationMessage ().

Jeśli metoda zależna od niej nie powiedzie się i masz od niej twardą zależność (alwaysRun = false, co jest wartością domyślną), metody od niej zależne nie są oznaczane jako FAIL, ale jako SKIP. Pominięte metody będą zgłaszane jako takie w raporcie końcowym (w kolorze, który nie jest ani czerwony, ani zielony w HTML), co jest ważne, ponieważ pominięte metody niekoniecznie oznaczają awarie.

Utwórz plik testng.xml

Utwórz plik testng.xml w formacie C:\>TestNG_WORKSPACE do wykonania przypadków testowych.

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

Skompiluj MessageUtil, klasy przypadków testowych przy użyciu javac.

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

Teraz uruchom testng.xml, który uruchomi metodę testSalutationMessage () dopiero po wykonaniu metody initEnvironmentTest () .

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

Sprawdź dane wyjściowe.

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

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

dependOnGroups Vs dependsOnMethods

  • Korzystając z grup, nie jesteśmy już narażeni na problemy z refaktoryzacją. Dopóki nie zmodyfikujemy atrybutów dependOnGroups lub groups, nasze testy będą działały z odpowiednio skonfigurowanymi zależnościami.

  • Ilekroć trzeba dodać nową metodę do wykresu zależności, wystarczy umieścić ją we właściwej grupie i upewnić się, że zależy od właściwej grupy. Nie musimy modyfikować żadnej innej metody.

Inną interesującą funkcją dostępną w TestNG jest parametric testing. W większości przypadków napotkasz scenariusz, w którym logika biznesowa wymaga bardzo zróżnicowanej liczby testów.Parameterized tests pozwalają programistom na wielokrotne przeprowadzanie tego samego testu przy użyciu różnych wartości.

TestNG umożliwia przekazywanie parametrów bezpośrednio do metod testowych na dwa różne sposoby -

  • Z testng.xml
  • Z dostawcami danych

Przekazywanie parametrów z testng.xml

Za pomocą tej techniki definiujesz proste parametry w pliku testng.xml , a następnie odwołujesz się do tych parametrów w plikach źródłowych. Podajmy przykład, aby zademonstrować, jak używać tej techniki do przekazywania parametrów.

Utwórz klasę przypadku testowego

  • Utwórz klasę testową Java, na przykład ParameterizedTest1.java.

  • Dodaj metodę testową parameterTest () do swojej klasy testowej. Ta metoda przyjmuje ciąg jako parametr wejściowy.

  • Dodaj adnotację @Parameters („myName”) do tej metody. Do parametru zostanie przekazana wartość z pliku testng.xml, co zobaczymy w następnym kroku.

Utwórz plik klasy Java o nazwie ParameterizedTest1.java w C:\>TestNG_WORKSPACE.

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class ParameterizedTest1 {
   @Test
   @Parameters("myName")
   public void parameterTest(String myName) {
      System.out.println("Parameterized value is : " + myName);
   }
}

Utwórz plik testng.xml

Utwórz plik testng.xml w formacie C:\>TestNG_WORKSPACE do wykonania przypadków testowych.

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

<suite name = "Suite1">
   <test name = "test1">
   
      <parameter name = "myName" value="manisha"/> 
      
      <classes>
         <class name = "ParameterizedTest1" />
      </classes>
      
   </test>
</suite>

Możemy również zdefiniować parametry na poziomie <suite>. Załóżmy, że zdefiniowaliśmy myName na obu poziomach <suite> i <test>. W takich przypadkach obowiązują zwykłe zasady określania zakresu. Oznacza to, że każda klasa wewnątrz tagu <test> zobaczy wartość parametru zdefiniowanego w <test>, podczas gdy klasy w pozostałej części pliku testng.xml zobaczą wartość zdefiniowaną w <suite>.

Skompiluj klasę przypadku testowego przy użyciu javac.

C:\TestNG_WORKSPACE>javac ParameterizedTest1.java

Teraz uruchom testng.xml, który uruchomi metodę parameterTest . TestNG spróbuje znaleźć parametr o nazwie myName najpierw w tagu <test>, a następnie, jeśli nie może go znaleźć, wyszuka w tagu <suit>, który go otacza.

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

Sprawdź dane wyjściowe.

Parameterized value is : manisha

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

TestNG automatycznie spróbuje przekonwertować wartość określoną w testng.xml na typ parametru. Oto obsługiwane typy -

  • String
  • int/Integer
  • boolean/Boolean
  • byte/Byte
  • char/Character
  • double/Double
  • float/Float
  • long/Long
  • short/Short

Przekazywanie parametrów z dostawcami danych

Gdy trzeba przekazać złożone parametry lub parametry, które muszą zostać utworzone z języka Java (złożone obiekty, obiekty odczytane z pliku właściwości lub bazy danych itp.), Parametry można przekazać za pomocą dostawców danych.

Dostawca danych to metoda z adnotacją @DataProvider. Ta adnotacja ma tylko jeden atrybut ciągu: jego nazwę. Jeśli nazwa nie jest podana, nazwa dostawcy danych automatycznie przyjmuje nazwę metody. Dostawca danych zwraca tablicę obiektów.

Poniższe przykłady pokazują, jak używać dostawców danych. Pierwszy przykład dotyczy @DataProvider używającego Vector, String lub Integer jako parametru, a drugi przykład dotyczy @DataProvider używającego obiektu jako parametru.

Przykład 1

Tutaj @DataProvider przekazuje jako parametr liczbę całkowitą i logiczną.

Create Java class

Utwórz klasę Java o nazwie PrimeNumberChecker.java. Ta klasa sprawdza, czy liczba jest liczbą pierwszą. Utwórz tę klasę wC:\>TestNG_WORKSPACE.

public class PrimeNumberChecker {
   public Boolean validate(final Integer primeNumber) {
   
      for (int i = 2; i < (primeNumber / 2); i++) {
         if (primeNumber % i == 0) {
            return false;
         }
      }
      return true;
   }
}

Create Test Case Class

  • Utwórz klasę testową Java, na przykład ParamTestWithDataProvider1.java.

  • Zdefiniuj metodę primeNumbers (), która jest zdefiniowana jako dostawca danych przy użyciu adnotacji. Ta metoda zwraca tablicę obiektów.

  • Dodaj metodę testową testPrimeNumberChecker () do swojej klasy testowej. Ta metoda przyjmuje wartości typu Integer i Boolean jako parametry wejściowe. Ta metoda sprawdza, czy przekazany parametr jest liczbą pierwszą.

  • Dodaj adnotację @Test (dataProvider = "test1") do tej metody. Atrybut dataProvider jest mapowany na „test1”.

Utwórz plik klasy Java o nazwie ParamTestWithDataProvider1.java w C:\>TestNG_WORKSPACE.

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

public class ParamTestWithDataProvider1 {
   private PrimeNumberChecker primeNumberChecker;

   @BeforeMethod
   public void initialize() {
      primeNumberChecker = new PrimeNumberChecker();
   }

   @DataProvider(name = "test1")
   public static Object[][] primeNumbers() {
      return new Object[][] {{2, true}, {6, false}, {19, true}, {22, false}, {23, true}};
   }

   // This test will run 4 times since we have 5 parameters defined
   @Test(dataProvider = "test1")
   public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) {
      System.out.println(inputNumber + " " + expectedResult);
      Assert.assertEquals(expectedResult, primeNumberChecker.validate(inputNumber));
   }
}

Create testng.xml

Utwórz plik testng.xml C:\>TestNG_WORKSPACE do wykonania przypadków testowych.

<?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 = "ParamTestWithDataProvider1" />
      </classes>
   </test>
</suite>

Skompiluj klasę przypadku testowego przy użyciu javac.

C:\TestNG_WORKSPACE>.javac ParamTestWithDataProvider1.java PrimeNumberChecker.java

Teraz uruchom testng.xml.

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

Sprawdź dane wyjściowe.

2 true
   6 false
   19 true
   22 false
   23 true

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

Przykład 2

Tutaj @DataProvider przekazuje Object jako parametr.

Create Java class

Utwórz klasę java Bean.java, która jest prostym obiektem z metodami get / set, w formacie C:\>TestNG_WORKSPACE.

public class Bean {
   private String val;
   private int i;
   
   public Bean(String val, int i) {
      this.val = val;
      this.i = i;
   }
   
   public String getVal() {
      return val;
   }
   
   public void setVal(String val) {
      this.val = val;
   }
   
   public int getI() {
      return i;
   }
   
   public void setI(int i) {
      this.i = i;
   }
}

Create Test Case Class

  • Utwórz klasę testową Java, na przykład ParamTestWithDataProvider2.java.

  • Zdefiniuj metodę primeNumbers (), która jest zdefiniowana jako dostawca danych za pomocą adnotacji. Ta metoda zwraca tablicę obiektów.

  • Dodaj metodę testową testMethod () do swojej klasy testowej. Ta metoda przyjmuje jako parametr komponent bean obiektu.

  • Dodaj adnotację @Test (dataProvider = "test1") do tej metody. Atrybut dataProvider jest mapowany na „test1”.

Utwórz plik klasy java o nazwie ParamTestWithDataProvider2.java w programie C:\>TestNG_WORKSPACE.

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ParamTestWithDataProvider2 {
   @DataProvider(name = "test1")
   public static Object[][] primeNumbers() {
      return new Object[][] { { new Bean("hi I am the bean", 111) } };
   }

   @Test(dataProvider = "test1")
   public void testMethod(Bean myBean) {
      System.out.println(myBean.getVal() + " " + myBean.getI());
   }
}

Create testng.xml

Utwórz plik testng.xml w formacie C:\>TestNG_WORKSPACE do wykonania przypadków testowych.

<?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 = "ParamTestWithDataProvider2" />
      </classes>
   </test>
</suite>

Skompiluj klasę przypadku testowego przy użyciu javac.

C:\TestNG_WORKSPACE>javac ParamTestWithDataProvider2.java Bean.java

Teraz uruchom testng.xml.

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

Sprawdź dane wyjściowe.

hi I am the bean 111

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

Teraz, gdy zrozumiałeś TestNG i jego różne testy, musisz się już martwić, jak refaktoryzować istniejący kod JUnit. Nie musisz się martwić, ponieważ TestNG zapewnia sposób na przejście z JUnit do TestNG we własnym tempie. Możesz wykonać swoje istniejące przypadki testowe JUnit za pomocą TestNG.

TestNG może automatycznie rozpoznawać i uruchamiać testy JUnit, dzięki czemu możesz używać TestNG jako narzędzia do uruchamiania wszystkich istniejących testów i pisać nowe testy za pomocą TestNG. Wszystko, co musisz zrobić, to umieścić bibliotekę JUnit w ścieżce klas TestNG, aby mogła znaleźć i używać klas JUnit, zmienić program uruchamiający testy z JUnit na TestNG w Ant, a następnie uruchomić TestNG w trybie „mieszanym”. W ten sposób możesz mieć wszystkie swoje testy w tym samym projekcie, nawet w tym samym pakiecie i zacząć używać TestNG. Takie podejście umożliwia również stopniową konwersję istniejących testów JUnit do TestNG.

Podajmy przykład, aby zademonstrować tę niesamowitą zdolność TestNG.

Utwórz klasę przypadku testowego JUnit

Utwórz klasę Java, która jest klasą testową JUnit, TestJunit.java w formacie C:\>TestNG_WORKSPACE.

import org.junit.Test;
import static org.testng.AssertJUnit.assertEquals;

public class TestJunit {
   @Test
   public void testAdd() {
      String str = "Junit testing using TestNG";
      AssertEquals("Junit testing using TestNG",str);
   }
}

Teraz napiszmy plik testng.xml w formacie C:\>TestNG_WORKSPACE, który zawierałby tag <suite> w następujący sposób -

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

<suite name = "Converted JUnit suite" >
   <test name = "JUnitTests" junit="true">
      <classes>
         <class name = "TestJunit" />
      </classes>
   </test>
</suite>

Aby wykonać przypadki testowe JUnit, zdefiniuj właściwość junit = "true", jak w powyższym xml. Klasa przypadku testowego JUnit TestJunit jest zdefiniowana w nazwie klasy.

W przypadku JUnit 4 TestNG użyje runnera org.junit.runner.JUnitCore do uruchomienia testów.

Skompiluj wszystkie klasy Java za pomocą javac.

C:\TestNG_WORKSPACE>javac TestJunit.java

Teraz uruchom testng.xml, który uruchomi przypadek testowy JUnit jako TestNG.

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE:C:\TestNG_WORKSPACE\lib\junit-4.11.jar" org.testng.TestNG testng.xml

Tutaj umieściliśmy junit-4.11.jar w C: \ TestNG_WORKSPACE \ lib \ junit-4.11.jar.

Sprawdź dane wyjściowe.

===============================================
   Converted JUnit suite

   Total tests run: 1, Failures: 0, Skips: 0
===============================================

Raportowanie jest najważniejszą częścią każdego wykonania testu, ponieważ pomaga użytkownikowi zrozumieć wynik wykonania testu, punkt awarii i przyczyny niepowodzenia. Z drugiej strony rejestrowanie jest ważne, aby obserwować przepływ wykonywania lub debugować w przypadku jakichkolwiek awarii.

TestNG domyślnie generuje inny typ raportu na potrzeby wykonania testu. Obejmuje to dane wyjściowe raportu HTML i XML. TestNG umożliwia także swoim użytkownikom pisanie własnego reportera i używanie go z TestNG. Istnieje również możliwość napisania własnych rejestratorów, które są powiadamiane w czasie wykonywania przez TestNG.

Istnieją dwa sposoby generowania raportu za pomocą TestNG -

  • Listeners- Aby zaimplementować klasę detektora, klasa musi zaimplementować interfejs org.testng.ITestListener . Te klasy są powiadamiane w czasie wykonywania przez TestNG, gdy test rozpoczyna się, kończy, kończy się niepowodzeniem, pomija lub przechodzi.

  • Reporters- Aby zaimplementować klasę raportowania, klasa musi zaimplementować interfejs org.testng.IReporter . Te klasy są wywoływane po zakończeniu całego przebiegu zestawu. Obiekt zawierający informacje o całym przebiegu testu jest przekazywany do tej klasy po wywołaniu.

W tym rozdziale będziemy mieć cztery różne przykłady, aby zademonstrować cztery różne przypadki raportowania i rejestrowania -

Sr.No. Przypadek i przykład
1 Rejestrowanie niestandardowe

Ten przykład ilustruje, jak napisać własny rejestrator.

2 Custom Reporter

Ten przykład ilustruje, jak napisać własnego reportera.

3 Raport HTML i XML

Ten przykład ilustruje domyślny raport HTML i XML wygenerowany przez TestNG.

4 Raporty JUnit

Ten przykład ilustruje sposób generowania raportów JUnit na podstawie raportów TestNG.

W tym rozdziale pokażemy, jak uruchomić TestNG przy użyciu ANT. Wykonajmy kroki podane poniżej -

Krok 1: Pobierz Apache Ant

Pobierz najnowszą wersję Apache Ant

OS Nazwa archiwum
Windows apache-ant-1.8.4-bin.zip
Linux apache-ant-1.8.4-bin.tar.gz
Prochowiec apache-ant-1.8.4-bin.tar.gz

Krok 2: Ustaw środowisko mrówki

Ustaw ANT_HOMEzmienną środowiskową, aby wskazywała lokalizację katalogu podstawowego, w którym na komputerze są przechowywane biblioteki ANT. Załóżmy, że przechowujemy biblioteki Ant w folderze apache-ant-1.8.4.

OS Wynik
Windows Ustaw zmienną środowiskową ANT_HOME na C: \ Program Files \ Apache Software Foundation \ apache-ant-1.8.4
Linux Eksportuj ANT_HOME = / usr / local / apache-ant-1.8.4
Prochowiec Eksportuj ANT_HOME = / Library / apache-ant-1.8.4

Dołącz lokalizację kompilatora Ant do ścieżki systemowej w następujący sposób -

OS Opis
Windows Dołącz ciąg% ANT_HOME \ bin na końcu zmiennej systemowej Path.
Linux ŚCIEŻKA eksportu =$PATH:$ANT_HOME / bin /
Prochowiec Nie wymagane.

Krok 3: Pobierz archiwum TestNG

Pobierz wymagane pliki jar http://www.testng.org.

OS Nazwa archiwum
Windows testng-6.8.jar
Linux testng-6.8.jar
Prochowiec testng-6.8.jar

Krok 4: Utwórz strukturę projektu

  • Utwórz folder TestNGWithAnt w C:\>TestNG_WORKSPACE.

  • Utwórz folder src w C:\>TestNG_WORKSPACE>TestNGWithAnt.

  • Utwórz folder test w C:\>TestNG_WORKSPACE>TestNGWithAnt.

  • Utwórz folder lib w C:\>TestNG_WORKSPACE>TestNGWithAnt.

  • Stwórz MessageUtil klasa w C:\>TestNG_WORKSPACE>TestNGWithAnt>src teczka.

/*
* This class prints the given message on console.
*/

public class MessageUtil {

   private String message;

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

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

   // add "Hi!" to the message
   public String salutationMessage() {
      message = "Hi!" + message;
      System.out.println(message);
      return message;
   }   
}
  • Utwórz klasę TestMessageUtil w programie C:\>TestNG_WORKSPACE>TestNGWithAnt>src teczka.

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


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

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

   @Test
   public void testSalutationMessage() {
      System.out.println("Inside testSalutationMessage()");
      message = "Hi!" + "Manisha";
      Assert.assertEquals(message,messageUtil.salutationMessage());
   }
}
  • Skopiuj plik testng-6.8.jar w C:\>TestNG_WORKSPACE>TestNGWithAnt>lib teczka.

Utwórz plik build.xml ANT

Najpierw musimy zdefiniować zadanie TestNG Ant w następujący sposób -

<taskdef name = "testng" classname = "org.testng.TestNGAntTask">
   <classpath>
      <pathelement location = "lib/testng-6.8.jar"/>
   </classpath>
</taskdef>

Wtedy będziemy używać <testng> zadanie w Ant, aby wykonać nasze przypadki testowe TestNG.

Plik build.xml plik wygląda następująco -

<project name = "TestNGTest" default = "test" basedir = ".">

   <!-- Define <testng> task -->

   <taskdef name = "testng" classname = "org.testng.TestNGAntTask">
      <classpath>
         <pathelement location = "lib/testng-6.8.jar"/>
      </classpath>
   </taskdef>

   <property name = "testdir" location = "test" />
   <property name = "srcdir" location = "src" />
   <property name = "libdir" location = "lib" />
   <property name = "full-compile" value="true" />
   
   <path id = "classpath.base"/>
   <path id = "classpath.test">
   
   <fileset dir = "${libdir}"> <include name = "**/*.jar" /> </fileset> <pathelement location = "${testdir}" />
   <pathelement location = "${srcdir}" /> <path refid = "classpath.base" /> </path> <target name = "clean" > <delete verbose="${full-compile}">
         <fileset dir = "${testdir}" includes="**/*.class" /> </delete> </target> <target name = "compile" depends="clean"> <javac srcdir = "${srcdir}" destdir = "${testdir}" verbose="${full-compile}">
         <classpath refid = "classpath.test"/>
      </javac>
   </target>
   
   <target name = "test" depends="compile">
      <testng outputdir = "${testdir}" classpathref="classpath.test"> <xmlfileset dir = "${srcdir}" includes="testng.xml"/> 
      </testng>
   </target>
   
</project>

Uruchom następujące polecenie Ant.

C:\TestNG_WORKSPACE\TestNGWithAnt>ant

Sprawdź dane wyjściowe.

test:
   [testng] [TestNG] Running:
   [testng]   C:\TestNG_WORKSPACE\TestNGWithAnt\src\testng.xml
   [testng] 
   [testng] Inside testPrintMessage()
   [testng] Manisha
   [testng] Inside testSalutationMessage()
   [testng] Hi!Manisha
   [testng] 
   [testng] ===============================================
   [testng] Plug ANT test Suite
   [testng] Total tests run: 2, Failures: 0, Skips: 0
   [testng] ===============================================
   [testng] 

BUILD SUCCESSFUL
Total time: 1 second

Aby skonfigurować TestNG z Eclipse, wykonaj kroki podane poniżej -

Krok 1: Pobierz archiwum TestNG

Pobierz najnowszą wersję pliku jar TestNG z witryny http://www.testng.org

OS Nazwa archiwum
Windows testng-6.8.jar
Linux testng-6.8.jar
Prochowiec testng-6.8.jar

Zakładamy, że skopiowałeś powyższy plik JAR do folderu C: \> TestNG.

Krok 2: Ustaw środowisko Eclipse

  • Otwórz eclipse → kliknij prawym przyciskiem myszy projekt i przejdź do właściwości → Build Path → Configure Build Path i dodaj testng-6.8.jar do bibliotek za pomocą przycisku Add External Jar .

  • Zakładamy, że Twój Eclipse ma wbudowaną wtyczkę TestNG; jeśli nie jest dostępny, pobierz najnowszą wersję za pomocą witryny aktualizacji.

    • W swoim Eclipse IDE wybierz Pomoc / Aktualizacje oprogramowania / Znajdź i zainstaluj .

    • Wyszukaj nowe funkcje do zainstalowania.

    • Nowa lokalizacja zdalna.

    • W przypadku Eclipse 3.4 i nowszych wprowadź http://beust.com/eclipse.

    • W przypadku Eclipse 3.3 i starszych wprowadź http://beust.com/eclipse1.

    • Upewnij się, że pole wyboru obok adresu URL jest zaznaczone i kliknij Dalej .

    • Eclipse poprowadzi Cię przez ten proces.

Teraz Twój Eclipse jest gotowy do tworzenia przypadków testowych TestNG.

Krok 3: Sprawdź instalację TestNG w Eclipse

  • Utwórz projekt TestNGProject w Eclipse w dowolnym miejscu.

  • Utwórz klasę MessageUtil, aby przetestować w projekcie.

/*
* This class prints the given message on console.
*/

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;
   }   
}
  • Utwórz w projekcie klasę testową TestNGExample.

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

public class TestNGExample {
   String message = "Hello World";	
   MessageUtil messageUtil = new MessageUtil(message);

   @Test
   public void testPrintMessage() {	  
      Assert.assertEquals(message,messageUtil.printMessage());
   }
}

Struktura projektu powinna wyglądać następująco -

Na koniec sprawdź wyjście programu, klikając program prawym przyciskiem myszy i uruchamiając jako TestNG.

Sprawdź wynik.