Testowanie aplikacji

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

  1. Spock – pozwala na pisanie testów w formacie given-when-then, albo expect-where, wprowadzając dużo większą przejrzystość i utrzymywalność.
  2. TestNG – dostarcza wiele adnotacji, pozwala na dużo większą elastyczność niż JUnit4, a czasem nawet większą czytelność niż JUnit5.
  3. AssertJ – pozwala na pisanie testów w sposób ciągły:
    assertThat(xmlFile).exists();
    assertThat(contentOf(xmlFile)).startsWith("<?xml version=");
  4. Gherkin language – składnia wykorzystywana np. w Cucumber w technice BDD (ang. behaviour driven development)
  5. REST Assured, WireMock – narzędzia do testowania REST API w Javie
  6. Mockito – jeden z najpopularniejszych w Javie narzędzi do mockowania
  7. 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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Time limit is exhausted. Please reload CAPTCHA.