
Temat tego artykułu przyszedł do mnie podczas lektury publikacji naukowej pt. „Analiza porównawcza sposobów testowania aplikacji internetowych” autorstwa Tomasza Smyka, Wojciecha Supersona oraz Małgorzaty Plechawskiej-Wójcik (2023). Autorzy omawiają wybór technik testerskich oraz rodzaje testów, które należy przeprowadzić w aplikacjach monolitycznych i mikroserwisowych. Podczas czytania zwróciłam uwagę na ciekawy rodzaj testów — testowanie kontraktowe.
Testy Integracyjne i kontraktu – definicja i znaczenie
Zgodnie z definicją ISTQB:
- Testowanie integracyjne – poziom testów koncentrujący się na interakcjach pomiędzy modułami lub systemami.
- Testowanie kontraktu – rodzaj testów integracyjnych, weryfikujący, czy interfejsy są używane zgodnie z ich kontraktami.
Testy integracyjne pozwalają sprawdzić powiązania między systemami i wykryć błędy wynikające z nieprawidłowej komunikacji lub wymiany danych. Przykłady scenariuszy integracyjnych obejmują:
- Połączenie procesu rejestracji użytkownika z automatycznym wysłaniem maila powitalnego.
- Przekierowanie do panelu klienta po dokonaniu płatności.
- Integracja modułów aplikacji z bazą danych, np. aktualizacja danych osobowych użytkownika.
- Integracja z zewnętrznym systemem autoryzacji (np. logowanie przez Google lub Facebooka).
- Połączenie modułu raportowania z bazą danych w celu generowania aktualnych raportów.
- Komunikacja między mikroserwisami, np. mikroserwis zamówień przekazuje dane do mikroserwisu fakturowania.
Testowanie kontraktowe – czym jest kontrakt?
W testowaniu kontraktowym kontrakt jest formalną specyfikacją oczekiwanego zachowania i zasad komunikacji pomiędzy komponentami, usługami lub systemami. Definiuje on:
- Interfejs – metody lub endpointy API wraz z parametrami i typami danych.
- Format danych – struktura i typy wymienianych danych (JSON, XML).
- Warunki wstępne (prerequisites) – np. uwierzytelnienie, poprawność danych lub dostępność zasobów.
- Warunki końcowe (postconditions) – oczekiwany rezultat operacji, zmiany danych i efekty uboczne.
- Niezmienniki (invariants) – reguły obowiązujące podczas całej interakcji.
- Obsługa błędów – sposób zgłaszania i komunikowania błędów między usługami.
Przykład kontraktu – API zamówień
Rozważmy endpoint /orders w sklepie internetowym, umożliwiający utworzenie nowego zamówienia.
- Żądanie JSON:
{
"productId": 123,
"quantity": 2,
"address": "Warszawa, ul. Testowa 1"
}
- Warunki wstępne: Produkt istnieje w systemie i jest dostępny w wymaganej ilości.
- Odpowiedź JSON:
{
"orderId": 987,
"status": "CREATED"
}
- Postcondition: Zamówienie jest zapisane w systemie, status jest jednym z dozwolonych (CREATED, PAID, SHIPPED).
- Obsługa błędów: Jeśli produkt nie istnieje lub brak wystarczającej ilości, zwracany jest kod HTTP 400 lub 404.
Wykorzystanie kontraktów w testach
Kontrakty pozwalają automatycznie sprawdzać, czy żądania i odpowiedzi są zgodne ze specyfikacją. Ręczna weryfikacja jest czasochłonna i podatna na błędy, dlatego korzysta się z narzędzi do walidacji schematów JSON/XML.
Podczas walidacji mogą wystąpić trzy scenariusze:
a) Żądanie i odpowiedź zgodne z kontraktem
b) Żądanie niezgodne z kontraktem (błąd po stronie konsumenta)
c) Odpowiedź niezgodna z kontraktem (błąd po stronie dostawcy usługi)
Narzędzia do testów kontraktowych i integracyjnych
🔹 Contract Testing (consumer–provider)
- Pact – testy kontraktowe dla mikroserwisów, consumer-driven.
- Spring Cloud Contract – generowanie testów po stronie producenta i stubów dla konsumenta.
- Hoverfly – symulacja usług i testowanie komunikacji.
- Karate – framework do testów API z walidacją schematów JSON/XML.
🔹 Walidacja schematów
- AJV – walidacja JSON, często używana w Postmanie i testach JS.
- OpenAPI Validator – sprawdzanie zgodności request/response ze specyfikacją OpenAPI.
- JSON Schema Validator – implementacje w Javie, Pythonie, JS.
🔹 Testowanie API
- SoapUI / ReadyAPI – testy REST i SOAP, walidacja schematów i kontraktów.
- Rest Assured – biblioteka w Javie do testów API.
- Insomnia – klient API umożliwiający testy kontraktowe.
🔹 Automatyzacja i CI/CD
- Newman – uruchamianie kolekcji Postmana w pipeline’ach.
- Jenkins, GitHub Actions, GitLab CI – automatyczne uruchamianie testów kontraktowych przy każdej zmianie API.
Podsumowanie
Testy integracyjne i kontraktowe są kluczowe w nowoczesnym wytwarzaniu oprogramowania, szczególnie w systemach mikroserwisowych. Testy integracyjne sprawdzają poprawną współpracę komponentów, natomiast testy kontraktowe formalizują oczekiwania komunikacyjne między usługami. W połączeniu z automatyzacją i narzędziami do walidacji schematów, pozwalają wykrywać błędy na wczesnym etapie, zmniejszając ryzyko problemów w produkcji.
Źródła:
- Smyk, T., & Plechawska-Wójcik, M. (2023). Analiza porównawcza sposobów testowania aplikacji internetowych. Journal of Computer Sciences Institute, 28.
- https://glossary.istqb.org/pl_PL/term/testowanie-integracyjne?term=integracyjne&exact_matches_first=true
- https://glossary.istqb.org/pl_PL/term/testowanie-kontraktu?term=kontrakt&exact_matches_first=true
- https://puchatekbaby.pl/przyklady-testow-integracyjnych-ktore-pomoga-uniknac-bledow-w-oprogramowaniu
- https://medium.com/@josueparra2892/integration-testing-a-comprehensive-guide-851c5e46e1d5
- https://medium.com/contract-testing/introduction-to-contract-testing-a02156fb1279