Budowanie aplikacji w dowolnej technologii z wykorzystaniem techniki TDD (ang. test driven development), czyli w skrócie rozwijania kodu poprzez pisanie niedziałających testów, doprowadzenie kodu, by testy działały i aplikacja realizowała daną funkcję, a następnie refaktorowanie kodu aplikacji oraz testów, pozwala implementować rozwiązania posiadające mniej błędów. Jakich narzędzi i bibliotek warto użyć do testowania ?
W zależności od rodzaju testów (jednostkowych, integracyjnych, E2E), można dla każdej z technologi, w której budujemy aplikacji, znaleźć bardzo dużą liczbę narzędzi i bibliotek do testowania, dlatego poniższa lista z pewnością nie jest kompletna, ale zawiera kilka przykładów tego, czego często można spotkać.
Narzędzia
- Selenium – jeden z najbardziej znanych narzędzi do testowania aplikacji webowych poprzez symulowanie akcji wykonywanych przez użytkownika w przeglądarce internetowej
- Appium – narzędzie do testowania nie tylko apliakcji webowych, lecz również mobilnych
- Robot Framework – potężny kombajn do budowania testów różnorodnych aplikacji, posiadający wiele bibliotek np. do baz danych, platform mobilnych czy nawet protokołów sieciowych jak telnet. Poniżej przykład testu:
*** Settings *** Documentation A test suite with a single test for valid login. ... ... This test has a workflow that is created using keywords in ... the imported resource file. Resource resource.txt *** Test Cases *** Valid Login Open Browser To Login Page Input Username demo Input Password mode Submit Credentials Welcome Page Should Be Open [Teardown] Close Browser
Biblioteki
- Spock – pozwala na pisanie testów w formacie given-when-then, albo expect-where, wprowadzając dużo większą przejrzystość i utrzymywalność.
- TestNG – dostarcza wiele adnotacji, pozwala na dużo większą elastyczność niż JUnit4, a czasem nawet większą czytelność niż JUnit5.
- AssertJ – pozwala na pisanie testów w sposób ciągły:
assertThat(xmlFile).exists();
assertThat(contentOf(xmlFile)).startsWith("<?xml version=");
- Gherkin language – składnia wykorzystywana np. w Cucumber w technice BDD (ang. behaviour driven development)
- REST Assured, WireMock – narzędzia do testowania REST API w Javie
- Mockito – jeden z najpopularniejszych w Javie narzędzi do mockowania
- Spring Cloud Contract, Pact – jedne z najpopularnieszych w świecie Javy, ale nie tylko, rozwiązania do testów kontraktowych.
Przykłady kodu
Ucząc się testowania aplikacji na publicznych repozytoriach GitHub umieściłem 3 aplikacje:
- FizzBuzz – kod, w którym oprócz zwykłych testów jednostkowych, zbudowałem kilka testów parametryzowanych oraz wykorzystujących Spock’a,
- BonusCalculator – kod budowany technika TDD z testami w JUnit,
- SnowMocksKata – aplikacja mająca testy wykorzystujące Mockito.
Przykładowo testy parametryzowane można budować jak niżej:
@ParameterizedTest
@ValueSource(ints = { 25, 65, 55 })
public void should_return_fizz_when_many_inputs_is_dividable_by_5(int number) {
String fizzBuzzResult = fizzBuzz.fizzBuzz(number);
assertThat(fizzBuzzResult).isEqualTo("Fizz");
}
Z kolei pisanie specyfikacji i testy w Spock’u mogą wyglądać następująco:
class FizzBuzzSpecification extends Specification {
def "should return number when input is 1"() {
given:
def fizzBuzz = new FizzBuzz()
when:
def fizzBuzzResult = fizzBuzz.fizzBuzz(1);
then:
fizzBuzzResult == "1"
}
def "should return buzz is when input is dividable by 7"(int input, String output) {
given:
def fizzBuzz = new FizzBuzz()
expect:
output == fizzBuzz.fizzBuzz(input)
where:
input | output
21 | "Buzz"
14 | "Buzz"
49 | "Buzz"
}
}
Podsumowanie
Niezależnie od technologii budowania aplikacji, warto ją testować na każdym poziomie piramidy testowania, dlatego część wymienionych narzędzie może kogoś zainspiruje do sięgnięcia po niektóre z nich.