junit test execution order
W tym samouczku wyjaśniono, jak ustawić kolejność wykonywania przypadków testowych JUnit. Dowiesz się o adnotacjach i klasach, aby ustawić kolejność wykonywania testów JUnit w JUnit 4 vs JUnit 5:
Dowiedzieliśmy się, jak stworzyć zestaw testów, jak dodać kategorię lub tag do przypadków testowych i jak odfiltrować testy (wykluczyć lub dołączyć przypadki testowe) na podstawie kategorii lub tagu z naszego poprzedniego samouczka.
Poza tym dowiedzieliśmy się, że w JUnit 4 mamy @Kategoria, @IncludeCategory, i @ExcludeCategory do filtrowania przypadków testowych, podczas gdy JUnit 5 ma @IncludeTags i @ExcludeTags zrobić to samo.
JUnit 5 ma dodatkowe opcje filtrowania za pomocą adnotacji @IncludePackages, @ExcludePackages, a także adnotacje do włączania lub wykluczania klas przy użyciu wzorców nazw klas.
=> Zajrzyj tutaj, aby zobaczyć samouczki szkoleniowe od A do Z JUnit .
Czego się nauczysz:
Zlecenie wykonania testu JUnit
W tym samouczku nauczymy się, jak ustawić kolejność dla każdego przypadku testowego, aby działały w ustalonej kolejności. Dowiemy się, jak zamawiać testy w JUnit 4 oraz JUnit 5.
Metody testowe domyślnie nie mają określonej kolejności.Przypadki testowe nie muszą koniecznie być wykonywane w kolejności, w jakiej zostały napisane.
Istnieją różne sposoby lub tryby ustawiania kolejności wykonywania przypadków testowych. Zagłębimy się również w to, jak JUnit 4 różni się w kolejności przypadków testowych w porównaniu z JUnit 5.
JUnit 4: @FixedMethodOrder, Class MethodSorters
Począwszy od JUnit 4.11, mamy adnotację @FixMethodOrder i MethodSorters.class wspomaganie łatwości ustalenia kolejności wykonania testu.
Paczka org.junit.runners. * należy zaimportować, aby uwzględnić klasę MethodSorters . Ta klasa decyduje, w jaki sposób należy uporządkować przypadki testowe. MethodSorters mieć trzy enum wartości.
Poniżej podano wartości wyliczenia klasy wraz z celem każdej z wartości:
MethodSorters.DEFAULT | Ta wartość wyliczenia sortuje wykonanie testu w określonej kolejności. Jednak nigdy nie można przewidzieć, w jakiej kolejności może uruchamiać przypadki testowe. |
Dlatego masz kontrolę nad swoją decyzją, który przypadek testowy powinien zostać uruchomiony jako pierwszy, a który następny. | |
Zauważyłem, że klasa z wieloma metodami posortowana za pomocą DEFAULT enum po wykonaniu, kolejność pozostaje taka sama za każdym razem podczas wykonywania testu. | |
Jednak w żaden sposób nie mógłbym przewidzieć ani dowiedzieć się, w jaki sposób zamówienie zostało ustawione. | |
MethodSorters.JVM | Kolejność wykonywania testów z wyliczeniem JVM jest taka, jak wskazuje nazwa, jest określana przez maszynę JVM. |
W takim przypadku za każdym razem, gdy uruchomisz klasę, testy będą wykonywane nie w tej samej, ale losowej kolejności. | |
Innymi słowy, kolejność testów zmienia się podczas każdego przebiegu. | |
MethodSorters.NAME_ASCENDING | To wyliczenie sortuje metody testowe w leksykograficznym porządku nazwy metody. Dlatego możesz być spokojny, ponieważ jest to najbardziej przewidywalny sposób zlecenia wykonania testu. |
Możesz zatem wcześniej zdecydować o kolejności testów na podstawie ustalonego porządku leksykograficznego jego nazwy. |
Adnotacja @FixedMethodOrder przyjmuje parametr wejściowy MethodSorters z jego wartością wyliczeniową. Pakiet potrzebny do adnotacji to org.junit.FixedMethodOrder.
Zobaczmy, jak jest wdrażany za pomocą kodu.
Implementacja kodu dla MethodSorters.DEFAULT
Utwórzmy plik klasy JUnit „ Junit4TestOrder.java ” gdzie będziemy używać MethodSorters.DEFAULT
Kod Junit4TestOrder.java
@FixMethodOrder(MethodSorters.DEFAULT) public class JUnit4TestOrder { @Test public void Testcase_3() { System.out.println('Testcase_3 executes'); } @Test public void Testcase_1() { System.out.println('Testcase_1 executes'); } @Test public void Testcase_2() { System.out.println('Testcase_2 executes '); } }
Uruchamiamy klasę trzykrotnie i widzimy taką samą kolejność uruchamiania testów jak poniżej, jednak przypadki testowe mogą, ale nie muszą, być wykonywane w kolejności posortowanej.
Okno konsoli pokazało wyniki jak poniżej - kolejność wykonywania testów to TestCase_3, TestCase_1 i TestCase_2, a kolejność nie zmienia się wraz z liczbą uruchomień.
Implementacja kodu dla MethodSorters. JVM
Zaktualizujemy teraz „Junit4TestOrder.java”, aby mieć MethodSorters.JVM
Fragment kodu Junit4TestOrder.java
@FixMethodOrder(MethodSorters . JVM ) public class JUnit4TestOrder {
Uruchamiamy klasę dwukrotnie, a kolejność wykonywania testów zmienia się z każdym uruchomieniem.
Okno konsoli dla pierwszy przebieg jest jak pokazano poniżej:
Okno konsoli dla druga przebieg jest jak pokazano poniżej:
Uważnie obserwuj zmianę kolejności wykonywania testów w obu przebiegach. Kolejność testów w obu seriach różniła się.
Implementacja kodu dla MethodSorters.NAME_ASCENDING
Zaktualizujemy teraz „Junit4TestOrder.java”, aby mieć MethodSorters.NAME_ASCENDING
Fragment kodu Junit4TestOrder.java
@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class JUnit4TestOrder {
Uruchamiamy klasę dwukrotnie, kolejność wykonywanych testów pozostaje taka sama i jest wykonywana według rosnącej kolejności nazwy metody.
W oknie konsoli są wyświetlane wyniki testów wykonanych w kolejności TestCase_1, TestCase_2 i TestCase_3.
JUnit 5: @TestMethodOrder, @Order, Interface MethodOrderer
Aby kontrolować kolejność wykonywania testów, poniższe jednostki pomagają zrobić to samo:
- Adnotacja @TestMethodOrder
- Adnotacja @Order
- Klasy, które należą do interfejsów MethodOrderer
Wbudowane klasy MethodOrderer i ich szczegóły są następujące:
MethodOrderer wbudowane w klasę | Z paczki | Detale |
---|---|---|
Alfanumeryczne | org.junit.jupiter.api.MethodOrderer.Alphanumeric | Sortuje metody testowe alfanumerycznie na podstawie ich nazw |
Zamówienie Adnotacja | org.junit.jupiter.api.MethodOrderer.OrderAnnotation | Sortuje metody testowe numerycznie na podstawie wartości przekazanych do adnotacji @Order |
Losowy | org.junit.jupiter.api.MethodOrderer.Random | Sortuje metody testowe losowo, tak jak w przypadku MethodSorters.JVM w JUnit 4 |
Przyjrzyjmy się teraz demonstracji każdej z tych strategii zamawiania:
Implementacja kodu dla Alphanumeric.class
Utwórzmy plik klasy JUnit 5 o nazwie JUnit5TestOrder.java tak samo jak JUnit4TestOrder.java i użyjmy adnotacji z Alphanumeric.class, aby uporządkować testy alfanumerycznie.
Kod Junit5TestOrder.java
@TestMethodOrder(Alphanumeric.class) public class JUnit5TestOrder { @Test public void Testcase_3() { System.out.println('Testcase_3 executes'); } @Test public void Testcase_1() { System.out.println('Testcase_1 executes'); } @Test public void Testcase_2() { System.out.println('Testcase_2 executes '); } }
Uruchomiliśmy klasę trzykrotnie i nadal widzimy tę samą kolejność wykonywanych testów w kolejności alfanumerycznej według nazwy metody testowej.
Po wykonaniu pliku klasy kolejność wykonywania testu:
- Testcase_1,
- Testcase_2 i
- Przypadek testowy_3
Uwaga: Strategia sortowania alfanumerycznego rozróżnia wielkość liter na wypadek gdybyśmy mieli inny przypadek testowy o nazwie testcase_1.
Kolejność wykonania byłaby następująca:
- Testcase_1,
- Testcase_2,
- Testcase_3,
- testcase_1.
W związku z tym duże litery mają pierwszeństwo przed nazwami metod składającymi się z małych liter.
Implementacja kodu dla Random.class
Zaktualizujemy teraz klasę JUnit 5 JUnit5TestOrder.java, aby używała adnotacji z Random.class
Fragment kodu Junit5TestOrder.java
@TestMethodOrder (Random.class) public class JUnit5TestOrder {
Uruchomiliśmy klasę dwukrotnie i widzieliśmy, że za każdym razem, gdy uruchamialiśmy klasę, kolejność wykonywania testów była losowa.
Po wykonaniu pliku klasy dla pierwszy raz kolejność wykonywania testów była następująca:
- Testcase_2,
- Testcase_1
- Przypadek testowy_3
Kolejność wykonywania podczas uruchamiania dla druga czas pokazał:
- Testcase_2,
- Przypadek testowy_3
- Testcase_1 .
Implementacja kodu dla OrderAnnotation.class
Zaktualizujemy teraz klasę JUnit 5 JUnit5TestOrder.java, aby używała adnotacji z OrderAnnotation.class. Adnotacja @Zamówienie będzie również odgrywać ważną rolę w ustalaniu priorytetów metod badawczych.
Fragment kodu Junit5TestOrder.java
@TestMethodOrder(OrderAnnotation.class) public class JUnit5TestOrder { @Test @Order(1) public void Testcase_3() { System.out.println('Testcase_3 executes'); } @Test @Order(2) public void Testcase_1() { System.out.println('Testcase_1 executes'); } @Test @Order(3) public void Testcase_2() { System.out.println('Testcase_2 executes '); } }
Tak więc w tej strategii ustawiania kolejności wykonywania testów adnotacja @Order wymusza uruchomienie metod testowych zgodnie z wartość zamówienia jest na to przygotowany.
Im niższa wartość @Order dla metody testowej, tym wyższy jest jej priorytet podczas wykonywania.
Po wykonaniu kolejność testów przebiegała następująco:
- Testcase_3,
- Testcase_1
- Testcase_2, ponieważ kolejność przypadków testowych to odpowiednio 1,2 i 3.
Dlatego nie ma znaczenia, czy przypadki testowe są napisane w kolejności. Poza tym nie ma znaczenia, czy nazwy metod są w porządku alfanumerycznym, czy nie.
JUnit 5: Tworzenie zamówienia niestandardowego
Oprócz wbudowanych klas Order, JUnit 5 obsługuje również zamówienia niestandardowe poprzez implementację interfejsu MethodOrderer . Począwszy od JUnit 5 w wersji 5.4 obsługiwane jest sortowanie niestandardowe.
Zobaczmy szybko, jak utworzyć i wdrożyć niestandardowe zamówienie według długości metody.
Krok 1: Utworzono niestandardową klasę zamówienia implementującą interfejs MethodOrderer i nazwano ją jako TestCaseLengthOrder
Kod dla TestCaseLengthOrder.java
public class TestCaseLengthOrder implements MethodOrderer { @Override public void orderMethods(MethodOrdererContext context) { MethodDescriptor md1; MethodDescriptor md2; context.getMethodDescriptors().sort((md1, md2)-> md1.getMethod().getName().length().compareTo(md2.getMethod().getName().length())); } }
TestCaseLength Objaśnienie kodu zamówienia:
- Klasa zamówienia niestandardowego jest tworzona przez implementację interfejsu MethodOrderer.
- void orderMethods (MethodOrderContext context) {}, która jest metodą wbudowaną zaimplementowaną z Interface MethodOrderer. Tutaj definiujesz implementację logiki kolejności testów.
- MethodDescriptor to interfejs, który zawiera szczegóły dotyczące metody:
- Metoda MethodDescriptor.getMethod () pobiera nazwę metody dla tego deskryptora.
- Nazwa metody jest konwertowana na String za pomocą metody getName (), tj. MethodDescriptor.getMethod (). GetName () i
- Metoda length () pobiera długość metody (podobnie jak string.length () pobiera długość wartości ciągu).
- Wszystkie nazwy metod są porównywane ze sobą za pomocą metody compareTo ().
- Metoda getMethodDescriptors () pobiera listę wszystkich deskryptorów metod w klasie.
- Metoda sort () sortuje obiekty MethodDescriptor.
Teraz, gdy jasno zrozumieliśmy każde API MethodOrderer, mamy nadzieję, że powyższy kod będzie łatwy do zinterpretowania.
Krok 2 : Użyj niestandardowej klasy zamówienia, tak jak w przypadku dowolnej kolejności wbudowanej w klasie testowej.
Jako dane wejściowe do adnotacji @TestMethodOrder.
Kod dla JUnit_CustomOrder.java
@TestMethodOrder(TestCaseLengthOrder.class) class JUnit_CustomOrder{ @Test public void subt(){ } @Test public void add(){ } @Test public void multiply(){ } @Test public void divide(){ }
Krok 3:
Po wykonaniu JUnit_CustomOrder.class , kolejność wykonywania testów jest następująca, w oparciu o rosnącą kolejność nazw przypadków testowych:
- Dodaj(),
- subt (),
- podzielić ()
- zwielokrotniać()
Wniosek
Na zakończenie tego samouczka dotyczącego kolejności wykonywania testów JUnit.
- Dowiedzieliśmy się, jak ustawić kolejność przypadków testowych za pomocą określonych adnotacji, a także określonych klas.
- Dowiedzieliśmy się również, jak zamawiać testy dla JUnit 4 i JUnit 5, na podstawie których zmieniły się strategie zamawiania.
- Poza tym dowiedzieliśmy się, jak w JUnit 5 mogliśmy również stworzyć niestandardową klasę sortowania i używać jej do porządkowania przypadków testowych podczas ich wykonywania.
=> Zapoznaj się z przewodnikiem dla początkujących JUnit tutaj.
rekomendowane lektury
- Testy JUnit: Jak pisać przypadki testowe JUnit z przykładami
- Lista adnotacji JUnit: JUnit 4 Vs JUnit 5
- JUnit Ignore Test Case: JUnit 4 @Ignore Vs JUnit 5 @Disabled
- JUnit Test Suite i filtrowanie przypadków testowych: JUnit 4 Vs JUnit 5
- Co to jest urządzenie testowe JUnit: samouczek z przykładami JUnit 4
- Samouczek JUnit dla początkujących - co to jest testowanie JUnit
- Wiele sposobów wykonywania testów JUnit
- Jak równolegle przeprowadzać testy Appium na dużą skalę