Oto jak testuje zewnętrzne interfejsy API w eliksirie z obejściem

$config[ads_kvadrat] not found

Mazda 6 III - Samochód na szóstkę? | Test OTOMOTO TV

Mazda 6 III - Samochód na szóstkę? | Test OTOMOTO TV

Spisu treści:

Anonim

Priorytetowo traktujemy zasady architektury zorientowanej na usługi na Odwrotność. Oznacza to, że mamy małe, łatwe do utrzymania komponenty o jasno określonych obowiązkach. Komunikują się ze sobą (głównie) za pośrednictwem API przedstawicielstwa State Transfer lub REST.

Zapewnia to elastyczność i dobrze nam służy z wyjątkiem jednego istotnego aspektu: testowania. Podczas testowania należy unikać:

  • Zależność od usług zewnętrznych działających na tym samym komputerze.
  • Powolne testy.

Ponieważ aplikacje z natury opierają się na usługach zewnętrznych, kluczowe jest posiadanie strategii testowania tych zależności.

Niedawno zaczęliśmy używać Bypass i wyjaśnię, jak tam dotarliśmy, a zwłaszcza, jak go używamy.

Przeszłość

Metody próbne i zwróć niektóre przykładowe dane w następujący sposób:

To był (i uważam, że nadal jest) „sposób na przejście” w świecie Ruby / Rails. Niestety, sprzyja to złym zachowaniom, co najlepiej wyjaśnia tutaj José Valim.

Zaczęliśmy używać ExVCR, która jest świetną biblioteką, ale ma podobne wady jak makiety / stuby: zachęca do lenistwa i nie sprzyja rozdzieleniu spraw krytycznych dla dobrze zdefiniowanych API. ExVCR umożliwia „nagrywanie” i „odtwarzanie” rzeczywistych danych. Integracja jest bardzo łatwa (w tym kilka wierszy w teście i wszystko inne jest załatwione). Ale najlepiej, abyś w testach myślał o zewnętrznych zależnościach, a nie je streszczał. Nadal może to być realny wybór dla scenariuszy, w których zachowanie punktu końcowego powinno być testowane przy minimalnym obciążeniu (używamy go do testowania połączeń do usług AWS Amazon, takich jak S3).

Wpisz Adaptery

Adaptery działają świetnie i promują rozważania wokół umów API i jasno określonych granic komunikacji. Nadal stosujemy to podejście, zwłaszcza gdy adapter jest bardziej złożony (jak gniazdo JSON-RPC).

Tak może wyglądać adapter:

Ale w przypadku prostych punktów końcowych HTTP Adaptery wydają się być bardzo pracochłonne i mają poważną wadę: zostawiają zużyte biblioteki z równania testowego. Jeśli cokolwiek w bibliotekach HTTP lub JSON ulegnie zmianie, testy go nie przechwycą. Ilość kodu krytycznego dla produkcji, który nie został przetestowany przez to podejście, jest niedopuszczalna.

Teraźniejszość i przyszłość

Bypass pozwala nam uruchomić bardzo prosty serwer internetowy w testach, które symulują używane przez nas usługi zewnętrzne.

Teraz możemy przetestować cały stos, w tym bibliotekę HTTP, bibliotekę kodowania / dekodowania JSON i mechanizmy uwierzytelniania. Bypass README jest dobrze napisany, więc oszczędzę szczegóły implementacji. Zmieniamy jednak nieco sposób, w jaki używamy go, aby testy były zwięzłe i czytelne:

Po pierwsze, czasami chcemy zadzwonić do Facebooka, gdy testy są uruchamiane jako pełny pakiet integracyjny. Robimy to nieregularnie, aby zapewnić, że API Facebooka nadal funkcjonuje zgodnie z naszymi oczekiwaniami. Dodawanie - Włącz integrację do test mieszany nie symuluje interfejsu API, a zamiast tego wywołuje usługę zewnętrzną (linie 5, 7).

Jesteśmy jednoznaczni, gdy symulujemy żądania do usług zewnętrznych, tak aby każdy test korzystający z obejścia musiał mieć @tag facebook_bypass (linia 7).

Wreszcie handle_fb funkcja (linie 30–39) jest wywoływana (biorąc pod uwagę, że ścieżka_zapytania mecze). Lubię dopasowywać głowę funkcji, ponieważ wyraźnie określa, na którą ścieżkę reagujemy i pozwala nam zdefiniować różne funkcje dla różnych ścieżek.

Tak więc Bypass działa tylko na testach oznaczonych @tag: bypass a kiedy nie korzystamy z naszego pakietu integracyjnego. Jeszcze jedną rzeczą, którą robimy podczas konfigurowania Bypass, jest umożliwienie tagowi przekazania identyfikatora strony (linie 8, 20). Oto jak test, który wykorzystuje Bypass, wygląda w całej okazałości:

Jak widać, facebook_bypass tag sprawia, że ​​jawnie symulujemy API (chyba że jesteśmy w trybie integracji). Pozwala nam przekazywać informacje do symulowanego API i bardzo łatwo jest użyć tej samej konfiguracji obejścia do różnych testów.

Mam nadzieję, że pomoże to przetestować zewnętrzne interfejsy API. Jeśli masz dodatkowe pytania, możesz mnie znaleźć na Twitterze (patrz poniżej).

$config[ads_kvadrat] not found