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