run test cases parallel generate reports using karate tool
Ten poradnik wyjaśnia, jak wykonywać podstawowe operacje na API, równolegle uruchamiać przypadki testowe i generować raporty za pomocą Karate Framework:
Nauczyliśmy się, jak stworzyć podstawowy skrypt testowy w naszym poprzednim samouczku, możemy teraz przejść do przodu, ucząc się podstawowych operacji, które można wykonać podczas pracy z API i Karate Framework. Jest wiele takich operacji i omówimy kilka z nich najczęściej używanych w tym samouczku.
Zagłębimy się również w proces równoległego uruchamiania przypadków testowych, stosując podejście krok po kroku. Omówimy również bieżący raport, który jest generowany automatycznie i porównamy go z raportem Ogórek, który możemy wygenerować poprzez integrację wtyczki.
Czego się nauczysz:
- Praca z narzędziem do testowania API i Karate
- Uruchom przypadki testowe równolegle
- Zintegruj wtyczkę Cucumber do raportowania
- Wniosek
Praca z narzędziem do testowania API i Karate
Jak omówiono w poprzednim samouczku, w .funkcja plik, który stworzyliśmy, moglibyśmy używać różnych słów kluczowych do wykonywania różnych operacji w interfejsie API. Karate Framework dostarcza nam kilka słów kluczowych, które mogą być używane do wykonywania różnych działań.
=> Zalecana lektura: Testowanie API w Karate Framework
Wykonywanie różnych operacji
# 1) Drukowanie odpowiedzi w konsoli
Wydrukować jest słowem kluczowym udostępnianym przez Karate Framework do drukowania wyniku w konsoli lub pliku. Jednym z najczęstszych zastosowań jest wydrukowanie odpowiedzi interfejsu API. Może to być bardzo przydatne dla użytkownika.
Możemy to zrobić, używając następujących wierszy kodu:
Feature: fetching User Details Scenario: testing the get call for User Details Given url 'https://reqres.in/api/users/2' When method GET Then status 200 #We are printing the Response of the API using the print keyword# Then print response
Powyższe wiersze kodu dadzą następujące dane wyjściowe:
18:15:44.495 [main] INFO com.intuit.karate - [print] { 'ad': { 'company': 'StatusCode Weekly', 'text': 'A weekly newsletter focusing on software development, infrastructure, the server, performance, and the stack end of things.', 'url': 'http://statuscode.org/' }, 'data': { 'last_name': 'Weaver', 'id': 2, 'avatar': 'https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg', 'first_name': 'Janet', 'email': 'janet.weaver@reqres.in' } }
W ten sposób możemy wydrukować odpowiedź API w konsoli w celu odczytu, który może być użyty podczas debugowania.
# 2) Deklarowanie zmiennych
Możemy zadeklarować zmienne za pomocą słowa kluczowego pok we frameworku Karate, a następnie użyj zadeklarowanych zmiennych w kodzie tam, gdzie to konieczne.
W poniższym przykładzie dodaliśmy kilka dodatkowych wierszy kodu do istniejącego pliku userDetails.feature plik, aby pomóc w zadeklarowaniu zmiennych w skrypcie.
Feature: fetching User Details Scenario: testing the get call for User Details Given url 'https://reqres.in/api/users/2' When method GET Then status 200 #We are printing the Response of the API using the print keyword Then print response # Declaring and assigning a string value: Given def varName = 'value' # using a variable Then print varName
# 3) Potwierdzenie rzeczywistej odpowiedzi na oczekiwaną odpowiedź
Karate Framework pomaga w wykonywaniu operacji związanych z Asercją przy użyciu mecz słowo kluczowe. Plik mecz jest sprytny, ponieważ spacje nie mają dla niego znaczenia, a kolejność kluczy nie jest ważna.
Za korzystanie dopasuj słowo kluczowe, musimy użyć podwójnego znaku równości „==”, który reprezentuje porównanie.
Teraz postaramy się opisać niektóre zastosowania mecz słowo kluczowe.
a) Gdy cała oczekiwana odpowiedź jest wymieniona w samym pliku .feature.
Czasami mamy pewne dane, które chcielibyśmy natychmiast zweryfikować w samym pliku. Zwykle tego typu dane są wymieniane podczas debugowania kodu.
Moglibyśmy zrobić to samo w samym pliku .feature, jak pokazano poniżej:
Feature: fetching User Details Scenario: testing the get call for User Details Given url 'https://reqres.in/api/users/2' When method GET Then status 200 #Asserting the reponse #response variable is holding the Actual response from API #Right hand side value is holding the expected Response And match response == {'ad':{'company':'StatusCode Weekly','text':'A weekly newsletter focusing on software development, infrastructure, the server, performance, and the stack end of things.','url':'http://statuscode.org/'},'data':{'last_name':'Weaver','id':2,'avatar': 'https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg','first_name':'Janet', 'email':'janet.weaver@reqres.in'}}
Jeśli wyślesz żądanie na adres URL „Https://reqres.in/api/users/2” w przeglądarce, a następnie otrzymasz następującą odpowiedź:
{ 'ad': { 'company': 'StatusCode Weekly', 'text': 'A weekly newsletter focusing on software development, infrastructure, the server, performance, and the stack end of things.', 'url': 'http://statuscode.org/' }, 'data': { 'last_name': 'Weaver', 'id': 2, 'avatar': 'https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg', 'first_name': 'Janet', 'email': 'janet.weaver@reqres.in' } }
Próbujemy zweryfikować powyższą odpowiedź za pomocą pliku * .feature.
Użyliśmy mecz słowo kluczowe dostarczane przez Karate Framework, które pomaga w wykonywaniu różnych rodzajów Asercje w odpowiedzi API.
Uwaga : Musielibyśmy przekształcić odpowiedź API w jednym wierszu, aby wykonać powyższy krok. Możesz użyć dowolnego z dostępnych narzędzi online.
b) Gdy oczekiwane dane wyjściowe są przechowywane w zewnętrznym pliku JSON.
W powyższym przykładzie omówiliśmy scenariusz, w którym mieliśmy ograniczone dane i taką samą odpowiedź, która była łatwa w obsłudze, ale w rzeczywistych scenariuszach będziemy mieli gigantyczne zestawy odpowiedzi JSON, które być może będziemy musieli ocenić.
Dlatego w takich przypadkach lepiej jest zachować odpowiedź w pliku zewnętrznym, a następnie zweryfikować to samo.
W poniższym przykładzie omówimy dalej to samo:
- Musisz utworzyć plik ExpectedOutput.json plik w naszym folderze projektu, jak pokazano na poniższym obrazku.
Utwórz nowy zasób pakietu -> Utwórz nowy plik ExpectedOutput.json
I zapisz odpowiedź JSON w tym pliku i zapisz ją.
Musisz napisać następujący kod w swoim userDetails.feature plik:
Feature: fetching User Details Scenario: testing the get call for User Details Given url 'https://reqres.in/api/users/2' When method GET Then status 200 #Verifying the JSON response by providing same in feature file And match response == {'ad':{'company':'StatusCode Weekly','text':'A weekly newsletter focusing on software development, infrastructure, the server, performance, and the stack end of things.','url':'http://statuscode.org/'},'data':{'last_name':'Weaver','id':2,'avatar': 'https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg','first_name': 'Janet','email':'janet.weaver@reqres.in'}} #Reading the file ExpectedOutput.json and storing same response in variable expectedResult Given expectedResult=read('./resources/ExpectedOutput.json') #Asserting the Actual Response with the Expected Response And match response == expectedResult
W powyższym przykładzie najpierw czytamy plik ExpectedOutput.json i przechowywanie odpowiedzi w zmiennej Spodziewany wynik używając następujące wiersze kodu:
Given expectedResult=read('./resources/ExpectedOutput.json')
Następnie umieszczamy Asercję przy użyciu następujących wierszy kodu, w których dopasowujemy rozszerzenie Rzeczywista odpowiedź z Spodziewany wynik odpowiedź z „ == ' operator.
And match response == expectedResult
c) Dopasowanie / weryfikacja pewnych wartości z Odpowiedzi
Do tej pory zweryfikowaliśmy całą odpowiedź interfejsu API, ale za każdym razem nie chcesz weryfikować całej odpowiedzi. Czasami chciałbyś ocenić tylko część odpowiedzi. Zwykle robimy to samo, gdy używamy innych narzędzi do testowania API lub podczas tworzenia frameworka.
Aby lepiej to zrozumieć, weźmy następującą odpowiedź JSON jako przykład:
{ 'ad': { 'company': 'StatusCode Weekly' } }
Jeśli chcemy sprawdzić, czy parametr firma powinien mieć wartość as StatusCode Weekly, wtedy będziemy musieli stworzyć ścieżkę JSON. Można to zrobić, przechodząc przez plik JSON i używając znaku „.” (Operator kropki)
Ścieżka JSON dla powyższej odpowiedzi będzie wyglądać następująco:
ad.company == „StatusCode Weekly”
Poniżej znajduje się fragment kodu, który pomoże nam ocenić wartości danego parametru. Ten kod należy do .funkcja plik.
Feature: fetching User Details Scenario: testing the get call for User Details Given url 'https://reqres.in/api/users/2' When method GET Then status 200 #Verifying the JSON response by providing same in feature file And match response == {'ad':{'company':'StatusCode Weekly', 'text':'A weekly newsletter focusing on software development, infrastructure, the server, performance, and the stack end of things.', 'url':'http://statuscode.org/'},'data':{'last_name':'Weaver','id':2,'avatar': 'https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg', 'first_name':'Janet','email':'janet.weaver@reqres.in'}} #Reading the file ExpectedOutput.json and storing same response in variable expectedResult Given expectedResult=read('./resources/ExpectedOutput.json') #Asserting the Actual Response with the Expected Response And match response == expectedResult ##Creating JSON path to verify the values of particular parameters## And match response.ad.url == 'http://statuscode.org/' And match response.data.first_name == 'Janet'
Poniżej znajduje się wiersz kodu, który wykonuje asercje parametryczne.
And match response.ad.url == 'http://statuscode.org/' And match response.data.first_name == 'Janet'
Korzystając ze ścieżki JSON, oceniamy wartości parametrów.
Wykonywanie operacji pocztowych
Do tej pory omówiliśmy podstawowe scenariusze testowania API, gdy metoda była „ OTRZYMAĆ'. Ale kiedy pracujemy w rzeczywistym środowisku, musimy wysyłać dużo informacji do serwera, więc w takim przypadku używamy „ POCZTA' metoda .
Ta sekcja daje wgląd w pracę z podstawowym żądaniem POST.
Zobaczmy kilka krótkich pomysłów na temat parametrów potrzebnych do wysłania żądania POST.
# 1) Tworzenie żądania POST, gdy treść JSON jest wymieniona w pliku * .feature
- Utwórz userDetailsPost.feature, wykonując podobne kroki opisane w poprzednim samouczku.
- Napisz następujące wiersze kodu:
Feature: Posting User Details Scenario: testing the POST call for User Creation Given url 'https://reqres.in/api/users' And request '{'name': 'morpheus','job': 'leader'}' When method POST Then status 201
Ponieważ jest to żądanie POST, któremu zawsze musi towarzyszyć treść, którą należy wysłać na serwer w celu uzyskania określonej odpowiedzi, wspomnieliśmy o tym w następującym komponencie:
żądanie: Pobiera treść JSON jako żądanie, które jest wymagane w metodzie POST.
# 2) Tworzenie żądania POST, gdy treść JSON jest wymieniona w pliku zewnętrznym
Zwykle będziemy mieć ogromną treść żądania, o której trudno byłoby wspomnieć w pliku *.funkcja plik. Dlatego lepiej zachować go w pliku zewnętrznym.
- Musisz utworzyć plik PostBody.json w naszym folderze projektu, jak pokazano poniżej. Utwórz nowy zasób pakietu -> Utwórz nowy plik PostBody.json i zapisz treść JSON w tym pliku i zapisz go.
Uwaga: Wspomnieliśmy o treści metody POST w powyższym pliku JSON.
- Musisz napisać następujący kod w swoim userDetailsPost .funkcja plik:
Feature: Posting User Details Scenario: testing the POST call for User Creation using External File Given url 'https://reqres.in/api/users' Given postBody=read('./resources/PostBody.json') And request postBody When method POST Then status 201
Odczytujemy treść JSON z PostBody.json przy użyciu następujących wierszy kodu:
Given postBody=read('./resources/PostBody.json')
Uwaga: Wszystkie userDeatils.feature Pliki, które stworzyliśmy do tej pory, będą wymagały podstawowego TestRunner.java plik do ich wykonania, który stworzyliśmy w naszym tutorialu Basic Test Script, jak pokazano poniżej:
import org.junit.runner.RunWith; import com.intuit.karate.junit4.Karate; @RunWith(Karate.class) public class TestRunner { }
Uruchom przypadki testowe równolegle
Teraz, skoro nauczyliśmy się, jak stworzyć podstawowy skrypt testowy i wykonać kilka podstawowych operacji na API, czas zacząć pracę w rzeczywistym środowisku.
Zwykle musimy uruchamiać przypadki testowe równolegle, aby przyspieszyć wykonanie. Zasadniczo chodzi o to, aby uzyskać większą wydajność w krótszym czasie.
Jest to podstawowa cecha frameworka i nie zależy od JUnit, Maven ani Grade. Pozwala nam:
- Z łatwością wybieraj funkcje i tagi, aby w prosty sposób uruchamiać zestawy testów.
- Wyświetl wyniki równoległe w folderze surefire-plugin.
- Możemy nawet zintegrować raporty Cucumber JSON, aby uzyskać lepszy interfejs użytkownika (co zostanie omówione wkrótce).
W Karate Framework nie musimy wykonywać wielu kroków, aby rozpocząć równoległe wykonywanie naszych przypadków testowych. Musimy tylko wykonać następujące kroki:
1) Musimy teraz zmienić TestRunner.java plik, którego używaliśmy do tej pory. Kod do wykonania równoległego należy zapisać w powyższym pliku.
Podczas wykonywania kodu równolegle pamiętaj o następującym wierszu:
jakie jest najlepsze oprogramowanie do zamiany tekstu na mowę
** Nie możemy używać adnotacji @RunWith (Karate.class), gdy próbujemy pracować w środowisku równoległym.
Otwórz oryginał TestRunner.java plik i użyj teraz następującego kodu:
import com.intuit.karate.Results; import com.intuit.karate.Runner; import org.junit.Test; // important: do not use @RunWith(Karate.class) ! public class TestRunner { @Test public void testParallel() { Results results = Runner.parallel(getClass(),5); } }
** Poniższy kod będzie miał zastosowanie do Zależność JUnit 4 Maven
W powyższym fragmencie kodu zawarliśmy poniższy wiersz kodu -
Wyniki wyników = Runner.parallel (getClass (), 5);
Ten wiersz instruuje, aby uruchomić wystąpienie przypadków testowych równolegle przez dynamiczne pobieranie klas w czasie wykonywania.
2) Utwórz duplikat userDetails.feature plik, jak wspomniano poniżej w src / test / java teczka.
Teraz wszyscy jesteśmy gotowi do wykonywania równoległego z dwa . funkcje plik.
3) Iść do TestRunner.java plik utworzony w powyższym kroku i uruchom go jako JUnit Test. Dzięki temu będziemy wykonywać nasze przypadki testowe w formacie równoległym.
Dla ułatwienia czytania, niektóre informacje są prezentowane przez Karate Framework w konsoli po zakończeniu wykonywania testu.
Wynik wygląda mniej więcej tak:
W przypadku wykonywania równoległego wszystkie funkcje będą wykonywane równolegle, a scenariusze również będą działać w formacie równoległym.
Postępując zgodnie z powyższymi krokami, będziesz mógł rozpocząć bardzo podstawowe równoległe wykonywanie testu API, używając Karate Framework.
** Możesz zapoznać się z testowaniem równoległym, przechodząc przez różne filtry na stronie Wykonywanie równoległe
Zintegruj wtyczkę Cucumber do raportowania
Ponieważ używamy JUnit runner do realizacji różnych scenariuszy, które zostały wymienione w różnych *.funkcja pliki, automatycznie tworzy raport dla każdego pliku funkcji, który jest przechowywany w ścieżce target / surefire-reports.
Generuje plik Podstawowy raport w formacie interfejsu użytkownika do przedstawiania przypadków testowych, które zostały wykonane.
Ale generowane raporty nie są zbyt przyjemne pod względem interfejsu użytkownika, a aby udostępniać raporty interesariuszom, potrzebujemy czegoś, co jest bardziej przyjazne dla użytkownika i łatwiejsze do zrozumienia.
Aby osiągnąć taki format raportowania, Karate Framework daje możliwość integracji Wtyczka raportująca ogórki co pomoże nam wygenerować raport w formie graficznej, który będzie bardziej reprezentacyjny.
Oto kroki, aby zintegrować to samo:
# 1) Dodaj następujące elementy Raportowanie ogórków zależność od pliku POM.xml
net.masterthought cucumber-reporting 3.8.0 test
#dwa) Edytuj plik TestRunner.java, gdy jest tylko jeden *.funkcja plik w projekcie.
Musimy zaktualizować nasz plik TestRunner.java za pomocą następującej metody geneReport () dla wtyczki Cucumber.
public class TestRunner { @Test public void testParallel() { generateReport(results.getReportDir()); assertTrue(results.getErrorMessages(), results.getFailCount() == 0); } public static void generateReport(String karateOutputPath) { Collection jsonFiles = FileUtils.listFiles(new File(karateOutputPath), new String[] {'json'}, true); final List jsonPaths = new ArrayList(jsonFiles.size()); jsonFiles.forEach(file -> jsonPaths.add(file.getAbsolutePath())); Configuration config = new Configuration(new File('target'), 'demo'); ReportBuilder reportBuilder = new ReportBuilder(jsonPaths, config); reportBuilder.generateReports(); } }
W powyższym kodzie wykonujemy następujące czynności:
- Tworzenie nowej instancji pliku
- Podanie ścieżki do przechowywania plików w folderze docelowym
- Tworzenie obiektu ReportBuilder, który utworzy nowy raport Cucumber
Uwaga : Powyższy kod działa dobrze, gdy mamy jednego *. funkcja plik w naszym projekcie.
# 3) Edytuj plik TestRunner.java, gdy jest dostępny wiele * .funkcja pliki w projekcie.
Musielibyśmy dodać wiersz kodu (wyróżniony poniżej pogrubioną czcionką), aby zapewnić równoległe wykonywanie podczas wykonywania scenariuszy generowania raportu.
public class TestRunner { @Test public void testParallel() { System.setProperty('karate.env', 'demo'); // ensure reset if other tests (e.g. mock) had set env in CI Results results = Runner.parallel(getClass(),5); generateReport(results.getReportDir()); assertTrue(results.getErrorMessages(), results.getFailCount() == 0); } public static void generateReport(String karateOutputPath) { Collection jsonFiles = FileUtils.listFiles(new File(karateOutputPath), new String[] {'json'}, true); final List jsonPaths = new ArrayList(jsonFiles.size()); jsonFiles.forEach(file -> jsonPaths.add(file.getAbsolutePath())); Configuration config = new Configuration(new File('target'), 'demo'); ReportBuilder reportBuilder = new ReportBuilder(jsonPaths, config); reportBuilder.generateReports(); } }
Po wykonaniu wyżej wymienionych czynności będziemy mogli z powodzeniem stworzyć dobrze reprezentowany raport graficzny interfejsu użytkownika przy użyciu rozszerzenia Ogórek - raportowanie podłącz.
Raport możemy znaleźć pod następującą ścieżką w naszym projekcie, jak pokazano na poniższym obrazku:
Poniższy raport został wygenerowany dla naszego projektu, dla wszystkich operacji, które wykonaliśmy do tej pory w tym samouczku Karate Framework:
Wniosek
Podsumowując, w tym samouczku omówiliśmy podstawowe operacje, które są przydatne na co dzień podczas pracy z Karate Framework i jak wykonać wiele plików * .feature równolegle. Dowiedzieliśmy się również, jak tworzyć raporty graficzne dla użytkowników korzystających z Raportowanie ogórków podłącz.
Najpierw omówiliśmy podstawowe operacje, które można wykonać w interfejsie API. Omówiliśmy, w jaki sposób możemy wysłać treść / żądanie POST do serwera, wymieniając treść w samym pliku * .feature (co zwykle nie jest zalecaną praktyką) lub używając pliku zewnętrznego (zalecana praktyka, w celu utrzymywać czysty kod).
Po drugie, po wykonaniu kilku podstawowych kroków mogliśmy pomyślnie wykonać wynik testu dla dwóch osób *.funkcja pliki, które były wykonywane równolegle, po prostu przez dodanie kilku wierszy kodu w pliku TestRunner.java plik umożliwiający rozpoczęcie biegu równoległego.
Ponadto dowiedzieliśmy się, jak przekształcić natywny raport testu JUnit w raport ogórka, integrując rozszerzenie Raportowanie ogórków podłącz. Wtyczka pozwala nam generować raporty, które mają lepszy interfejs użytkownika, są znacznie bardziej zrozumiałe dla użytkownika, a tym samym zapewniają lepsze wrażenia użytkownika dla interesariuszy, którym te raporty są udostępniane.
Do tej pory powinieneś być w stanie wykonać podstawowe operacje, równolegle uruchamiać przypadki testowe i generować łatwy do odczytania raport dla użytkowników.
rekomendowane lektury
- Samouczek Karate Framework: Automatyczne testowanie API z Karate
- 10 najlepszych narzędzi do testowania API w 2021 roku (narzędzia testowe SOAP i REST API)
- Jak uruchomić ogórka z Jenkinsem: samouczek z przykładami
- Przewodnik po generowaniu raportów rozszerzonych w Selenium WebDriver
- Raportowanie Specflow: jak generować raporty z testów i przeprowadzać testy selektywne
- Jak zarządzać wymaganiami, wykonywać przypadki testowe i generować raporty za pomocą TestLink - samouczek nr 2
- Równoległe uruchamianie testów Appium przy użyciu Appium Studio for Eclipse
- Jak równolegle przeprowadzać testy Appium na dużą skalę