Zde je návod, jak testuje externí API v Elixiru s bypassem

$config[ads_kvadrat] not found

ADH secretion | Renal system physiology | NCLEX-RN | Khan Academy

ADH secretion | Renal system physiology | NCLEX-RN | Khan Academy

Obsah:

Anonim

Prioritou jsou principy architektury orientované na služby na adrese Inverzní. To znamená, že máme malé, udržovatelné komponenty s jasně definovanými povinnostmi. Komunikují mezi sebou (většinou) prostřednictvím reprezentačních státních převodů, nebo REST, API.

To poskytuje flexibilitu a sloužilo nám dobře s výjimkou jedné významné stránky: Testování. Při testování je třeba se vyvarovat:

  • Závislost na externích službách běžících na stejném počítači.
  • Pomalé testy.

Protože aplikace neodmyslitelně závisí na externích službách, je důležité mít pro tyto závislosti zavedenou strategii testování.

Nedávno jsme začali používat Bypass a vysvětlím, jak jsme tam dorazili a konkrétně jak ho používáme.

Minulost

Vysmívat metody a vrátit některá příkladná data takto:

To bylo (a věřím, že je) „cesta“ ve světě Ruby / Rails. Bohužel, toto podporuje špatné chování, jak to zde nejlépe vysvětluje José Valim.

Pak jsme začali používat ExVCR, což je skvělá knihovna, ale má podobné nevýhody jako mock / stubs: Podporuje lenost a nepodporuje oddělení zájmů, které jsou kritické pro dobře definované API. ExVCR umožňuje „nahrávat“ a „přehrávat“ reálná data. Integrace je velmi snadná (včetně několika řádků ve vašem testu a vše ostatní je o ně postaráno). Ale v ideálním případě musíte přemýšlet o vnějších závislostech v testech, ne abstraktně. Pro scénáře může být stále životaschopnou volbou, pokud by mělo být testováno chování koncového bodu s minimální režií (používáme jej pro testování hovorů služby Amazon AWS Services jako S3).

Zadejte adaptéry

Adaptéry fungují skvěle a podporují jednání o smlouvách API a jasně definovaných komunikačních hranicích. Tento přístup stále používáme, zejména když je Adaptér složitější (jako zásuvka JSON-RPC).

Takto může vypadat adaptér:

Pro jednoduché koncové body HTTP se však adaptéry jeví jako hodně práce a mají hlavní nevýhodu: ponechávají knihovny, které spotřebovávají, z testovací rovnice. Pokud se něco změní v knihovnách HTTP nebo JSON, testy to nezachytí. Množství kódu kritického pro výrobu, který tento přístup nevyzkouší, je nepřijatelné.

Současnost a budoucnost

Bypass nám umožňuje spustit velmi jednoduchý webový server v testech, které simulují externí služby, které používáme.

Nyní můžeme otestovat celý zásobník, včetně knihovny HTTP, knihovny kódování / dekódování JSON a ověřovacích mechanismů. Bypass README je dobře napsaný, takže budu šetřit detaily implementace. Nicméně, mírně změníme způsob, jakým je používáme, abychom udrželi testy stručné a srozumitelné:

Nejprve chceme někdy zavolat na Facebook, když jsou testy spuštěny jako úplná integrační sada. Děláme to nepravidelně, abychom zajistili, že rozhraní API služby Facebook stále funguje podle našich očekávání. Přidání - zahrnovat integraci na mix test neanalyzuje API, ale místo toho volá na externí službu (řádky 5, 7).

Jsme explicitní, když simulujeme požadavky na externí služby, takže každý test, který používá Bypass, musí mít @tag facebook_bypass (řádek 7).

Konečně handle_fb funkce (řádky 30–39) se volají (vzhledem k tomu, že request_path zápasy). Mám rád přizpůsobení v hlavě funkce, protože dává jasně najevo, na kterou cestu reagujeme a která nám umožňuje definovat různé funkce pro různé cesty.

Takže Bypass běží pouze na testech označených @tag: bypass a když neběží naše integrační sada. Ještě jedna věc, kterou děláme při nastavování Bypassu, je umožnit tagu projít id stránky (řádky 8, 20). Tak tady je, jak test, který používá Bypass vypadá v celé své slávě:

Jak vidíte, facebook_bypass značce, že simulujeme API (pokud jsme v integračním režimu). Umožňuje nám předávat informace do simulovaného rozhraní API a je velmi snadné znovu použít stejnou konfiguraci Bypass pro různé testy.

Doufám, že vám to pomůže otestovat externí rozhraní API. Máte-li další otázky, můžete mě najít na Twitteru (viz níže).

$config[ads_kvadrat] not found