data driven parameterized testing with spock framework
Poznaj sposoby pisania testów opartych na danych lub parametryzowanych za pomocą Spock Framework:
W tym Seria bezpłatnych samouczków szkoleniowych Spocka , zbadaliśmy wszystko Testy jednostkowe w Spocku oraz Urządzenia testowe, potwierdzenia i raportowanie w naszym poprzednim samouczku.
W tym samouczku postaramy się zrozumieć, czym są testy parametryzowane i jak można wykorzystać wbudowane funkcje Spocka do testowania opartego na danych.
Zaczynajmy!!
Obejrzyj samouczek wideo
Czego się nauczysz:
- Co to są testy sparametryzowane?
- Pisanie sparametryzowanych testów w Spocku
- Cykl życia bloku „gdzie”
- Porady & Triki
- Wniosek
- rekomendowane lektury
Co to są testy sparametryzowane?
Dla każdego, kto pracował z automatyzacją / testami jednostkowymi, testowanie oparte na danych nie jest nowym terminem.
Testy parametryzowane to nic innego, jak wszelkiego rodzaju testy, które mają tę samą logikę wykonania i różnią się tylko danymi wejściowymi i wynikiem w niektórych przypadkach.
Przykład: Załóżmy, że masz aplikację Kalkulator, aby całkowicie przetestować funkcjonalność, możesz chcieć przeprowadzić testy z innym zestawem wejściowym.
Przykład: Wartości ujemne, ułamkowe, normalne liczby całkowite, liczby całkowite zbliżone do maksymalnego dopuszczalnego zakresu itp. Bez względu na to, jakie wartości wejściowe masz, chcesz uruchomić tę samą logikę wykonywania.
Innym dobrym powodem pisania testów sparametryzowanych jest to, że nie tylko testuje to szczęśliwą ścieżkę, ale także testuje ścieżkę błędu lub negatywne scenariusze.
Przykład: Załóżmy, że istnieje aplikacja, która zwraca, czy dane rozszerzenie pliku jest prawidłowe, czy nie. Testy oparte na danych mogą szybko umożliwić programiście wykonanie testów dla obsługiwanych rozszerzeń plików i wszelkich scenariuszy błędów lub negatywnych testów wejściowych.
Teraz tradycyjnie można pomyśleć o napisaniu lub skopiowaniu testów dla wielu wartości wejściowych, ale nie jest to właściwy ani inteligentny sposób wykonania tego rodzaju testów. Ponadto, ponieważ liczba testów w Twojej aplikacji zacznie wzrastać, testy te będą trudne do utrzymania.
Pisanie sparametryzowanych testów w Spocku
Gdzie: blok
Blok gdzie w teście Spocka jest blokiem przechowującym dane dla testu sparametryzowanego. Może opcjonalnie zawierać zarówno wartości wejściowe, jak i oczekiwane wartości wyjściowe. Ważną kwestią do zapamiętania na temat tego bloku jest to, że powinien to być ostatni blok w teście Spocka.
Powiedziawszy to, można go łączyć ze wszystkimi innymi blokami, jak podano, kiedy i wtedy, ale powinien być ostatnim blokiem.
Spójrzmy na przykład, aby lepiej to zrozumieć
Będziemy używać kalkulatora, który pobiera 2 parametry wejściowe i zwraca sumę podanych danych wejściowych. Będziemy pisać sparametryzowany test dostarczający wielu danych wejściowych i oczekiwanych wartości wyjściowych.
def 'sample parameterized test'() input2
W powyższym przykładzie kodu widać:
- Blok „gdzie” zawierający dane do uruchomienia testu.
- Blok „gdzie” jest ostatnim blokiem testu.
- „Gdzie” jest łączone z innymi blokami, tj. Podane, kiedy i wtedy.
- Reprezentacja danych to specjalny format zwany tabelami danych, któremu szczegółowo przyjrzymy się w kolejnych sekcjach tego samouczka.
- Nagłówek danych to zasadniczo właściwości / zmienne wejściowe, które mogą być bezpośrednio użyte w teście. Na przykład. Zapoznaj się ze stwierdzeniem w bloku „kiedy”, w którym używaliśmy go bezpośrednio wejście 1 i wejście 2 jako parametry wejściowe bez ich jawnego definiowania.
Korzystanie z danych
Spróbujmy teraz szczegółowo zrozumieć tabele danych. Każdy wiersz tabeli danych przedstawia dane dla indywidualnego scenariusza (wykonanie testu).
Zgodnie z konwencją, tj. Wartości wejściowe są poprzedzone pojedynczą kreską („|”), a wartości wyjściowe są poprzedzone podwójną kreską („||”). Nie ma to żadnego logicznego znaczenia, ale jest to konwencja i poprawia czytelność. Zatem oba poniższe przykłady są prawdziwe.
input1 |input2 |expectedResult 10 |15 |25 -4 |6 |2 input1 |input2 || expectedResult 10 |15 || 25 -4 |6 || 2
Wiersz nagłówka, jak pokazano powyżej, ma nazwę dla każdego parametru dostarczonego jako dane do przetestowania. W tym miejscu należy zauważyć, że nazwy tych parametrów nie powinny kolidować z żadnymi istniejącymi zmiennymi lokalnymi / globalnymi w teście, w przeciwnym razie błędy w czasie kompilacji do rozwiązywania nazw zmiennych.
Ważną kwestią, na którą należy zwrócić uwagę podczas korzystania z tabel danych, jest to, że wymagane są co najmniej 2 kolumny. Jeśli potrzebujesz tylko jednej kolumny, pusta kolumna z wartościami jako znak podkreślenia to obejście, jak poniżej.
input1 ||_ 10 ||_ -4 ||_
Zaletą tego formatu jest prostota, czytelność i rozszerzalność. Dodanie nowego wejścia danych jest tak proste, jak dodanie nowego wiersza z wartościami danych.
Kolejną kwestią, na którą należy zwrócić uwagę, jest to, że tabele danych mogą być używane do przechowywania dowolnego typu zmiennych, klas, obiektów, wyliczeń itp., Co czyni je jeszcze bardziej wydajnymi. Ponieważ groovy jest językiem opcjonalnym, jeśli nie określono jawnego typu, zmienne w tabeli danych implikują zależność od typu dostarczonych danych.
Zobaczmy inny Przykład używanie tabel danych z listą ciągów jako danych wejściowych i wyjściowych jako liczby elementów w ciągu.
def 'sample parameterized test with list data type'() when: def actualCount = input1.size() then: actualCount == expectedCount where: input1
W powyższym przykładzie można zauważyć, że podaliśmy dane wejściowe w postaci listy ciągów znaków, a dane wyjściowe mają rozmiar tej listy tablic. Dzięki temu posiadanie danych wejściowych różnych typów daje dużą elastyczność.
Możesz również po prostu wspomnieć o wyrażeniach, które zwracają dane odpowiedniego typu danych wejściowych i które są używane bezpośrednio w tabelach danych.
Cykl życia bloku „gdzie”
W przypadku testów zawierających gdzie blok i próbki danych w postaci tabel danych, każdy wiersz danych reprezentuje jedno wykonanie metody testowej.
Na przykład, jeśli jest 5 wierszy danych, a test zawiera bloki „dany” i „kiedy”, to dla takiego wiersza danych bloki testowe zostaną wykonane raz. Tak więc w sumie będzie 5 wykonań metody testowej.
Porady & Triki
Zobaczmy kilka porad i wskazówek dotyczących testów parametryzowanych podczas pracy z tymi tabelami danych.
# 1) Wyświetlanie wyników wykonania poszczególnych wierszy oddzielnie. Jak widzieliśmy w sekcji cyklu życia, dla każdego wiersza danych jest wykonywane jedno wykonanie kodu testowego. Aby te wiersze lub wyniki były wyświetlane osobno dla każdego takiego wiersza, do takich testów można użyć adnotacji „@Unroll”.
Spróbujmy to zrozumieć na przykładzie:
Będziemy używać tej samej aplikacji kalkulatora z 3 zestawami danych wejściowych dostarczanych do testowanej metody.
klasyczny prywatny serwer World of Warcraft
def 'sample parameterized test'() -20
Bez adnotacji „@Unroll” zobaczmy, jak wygląda wynik w terminalu (a także w raportach HTML). Przy tego rodzaju danych wyjściowych trudno jest ustalić, który zestaw danych wejściowych spowodował niepowodzenie testu.
Zobaczmy teraz, jak wyniki testu są raportowane osobno dla każdego wiersza po dodaniu adnotacji „@Unroll” do metody testowej (która zawiera tabele danych jako dane wejściowe).
#dwa) Teraz zrozummy, jak dodać znaczące informacje do tych testów opartych na danych (zamiast niektórych automatycznie dołączanych indeksów, jak na powyższym zrzucie ekranu).
Możemy użyć symboli zastępczych dla właściwości wejściowych i wyjściowych (zgodnie z tabelą danych), a następnie możemy zobaczyć wartości wypełnione w nazwach testów danymi z tabel danych.
Skorzystajmy z tego samego przykładu i zaktualizujmy nazwę testu, aby uzyskać dane z wejścia i oczekiwanego wyniku, jak wspomniano w tabelach danych:
@Unroll def 'result of adding #input1 & #input2 should be #expectedResult'() given: def app = new CalculatorApp() when: def resultSum = app.add(input1, input1) then: resultSum == 2 * input1 where: input1
Zobaczmy teraz, jak wyglądają dane wyjściowe w terminalu i raportach HTML:
Tak więc, jak widać tutaj, dane z wejścia i wyjścia są teraz wyświetlane wraz z nazwami testów, kiedy są wykonywane. W ten sposób znacznie ułatwia rozwiązywanie problemów i debugowanie, ponieważ wyraźnie wskazuje, które dane wejściowe spowodowały niepowodzenie lub nieprawidłowe działanie testu.
Wniosek
W tym samouczku dowiedzieliśmy się o pisaniu testów parametryzowanych za pomocą frameworka Spock. Omówiliśmy również różne funkcje tabel danych i sposoby ich wykorzystania.
Zapoznaj się z naszym nadchodzącym samouczkiem, aby dowiedzieć się, jak używać makiet i kodów kreskowych ze Spockiem !!
POPRZEDNIA samouczek | NEXT Tutorial
rekomendowane lektury
- Pisanie testów jednostkowych w Spock Framework
- Pytania do wywiadu Spocka z odpowiedziami (najpopularniejsze)
- Spock do integracji i testowania funkcjonalnego z selenem
- Spock Mocking and Stubbing (przykłady z samouczkami wideo)
- Samouczek Spocka: Testowanie ze Spockiem i Groovym
- Data Driven Framework w Selenium WebDriver przy użyciu Apache POI
- Jak przeprowadzić testy oparte na danych za pomocą narzędzia TestComplete
- Jak działa testowanie oparte na danych (przykłady QTP i selenu)