Izolacja testów z zewnętrznymi usługami to konieczny warunek niezawodnej automatyzacji.
Historia pytania: Wczesne systemy automatyzacji "zderzały się" z zewnętrznymi API i bazami danych, które często były albo niedostępne, albo zwracały nieprzewidziane dane. Bez izolacji testów automatycznych, wynik jest niemożliwy do odtworzenia: fluktuacje, awarie z powodu problemów ze strony, losowe błędy.
Problem:
Rozwiązanie:
Użycie "mocków" i "stubbów" — lokalnych atrap, które symulują odpowiedzi z zewnętrznych API. Popularne są WireMock (Java), httpmock (Python), MockServer, TestContainers.
Emulacja bazy danych za pomocą rozwiązań in-memory lub fixture'ów, które są czyszczone i ponownie wypełniane przed każdym testem.
Przenieś identyfikatory danych testowych do zmiennych, aby testy mogły być uruchamiane równolegle i nie "zachodziły" na siebie.
import requests BASE_URL = "http://localhost:1080/api" def test_order_creation(): mock_response = {"orderId": 12345, "state": "created"} # W rzeczywistych testach odpowiedź zwróci serwer mockujący # Tutaj wywołanie requests.post i assert ...
Kluczowe cechy:
Czy konieczne jest przeprowadzanie testów integracyjnych z rzeczywistymi usługami przy każdym uruchomieniu?
Nie. Regularnie można używać mocków/stubbów, a testy integracyjne uruchamiać osobno, rzadziej i pod kontrolą.
Czy testy z rzeczywistym zewnętrznym API zawsze dają bardziej niezawodny wynik?
Nie. Wręcz przeciwnie, są mniej stabilne, mogą zawodzić z powodu zmian po stronie partnera. Ciągłe testy fluktuacyjne pogarszają jakość pipeline'u.
Czy można użyć tych samych danych testowych dla równoległych testów automatycznych z zewnętrznymi usługami?
Nie. Może to prowadzić do kolizji, "wyścigów" i niestabilności. Identyfikatory i stan muszą być unikalne dla testu/wątku.
W firmie zdecydowano, aby z szybkością uruchamiać wszystkie testy automatyczne na rzeczywistych zewnętrznych API (bramka płatnicza). Kilka razy testy zostały zablokowane, pojawiły się limity, trzeba było odzyskiwać dostęp, dane "przeciekały" do rzeczywistych raportów, pojawiały się fałszywe alarmy.
Zalety:
Wady:
Skonfigurowano MockServer i fikcyjną bazę danych in-memory. Przed każdym testem stan był zerowany, dane — unikalne. Rzeczywiste testy integracyjne były uruchamiane osobno i rzadziej.
Zalety:
Wady: