Iată cum testează API-urile externe în Elixir cu bypass

$config[ads_kvadrat] not found

⚡ Don't build this 12V DC to 120V AC inverter circuit.

⚡ Don't build this 12V DC to 120V AC inverter circuit.

Cuprins:

Anonim

Prioritizăm principiile de arhitectură orientată pe servicii la Invers. Asta înseamnă că avem componente mici, de întreținut, cu responsabilități clar definite. Ei comunică unul cu celălalt (în cea mai mare parte), prin transferul de stat reprezentant sau REST, API.

Acest lucru oferă flexibilitate și ne-a ajutat bine, cu excepția unei fațete semnificative: Testarea. Când se testează, trebuie evitate:

  • Dependența de serviciile externe care rulează pe aceeași mașină.
  • Teste lente.

Deoarece aplicațiile se bazează în mod inerent pe servicii externe, este esențial să existe o strategie de testare pentru aceste dependențe.

Recent am început să folosim Bypass și voi explica cum am ajuns acolo și în mod specific cum îl folosim.

Trecutul

Modificați metodele și returnați câteva exemple de date, cum ar fi:

Asta a fost (și cred că este încă) "calea de parcurs" în lumea Ruby / Rails. Din păcate, acest lucru favorizează un comportament rău, după cum cel mai bine explicat aici, de José Valim.

Apoi am început să folosim ExVCR, care este o mare bibliotecă, dar are și dezavantaje similare cu mocks / stubs: încurajează lenea și nu favorizează separarea preocupărilor care sunt critice pentru API-urile bine definite. ExVCR permite înregistrarea și redarea datelor live. Este foarte ușor să se integreze (inclusiv câteva rânduri din testul dvs. și orice altceva este îngrijit). Dar, în mod ideal, trebuie să vă gândiți la dependențele externe ale testelor, nu să le eliminați. S-ar putea să fie o opțiune viabilă pentru scenarii atunci când comportamentul punctului final ar trebui testat cu un minim de cheltuieli generale (îl folosim pentru testarea apelurilor la serviciile AWS ale Amazonului, cum ar fi S3).

Introduceți adaptoarele

Adaptorii lucrează excelent și promovează deliberarea în jurul contractelor API și limitele clar definite de comunicare. Încă mai folosim această abordare, mai ales când adaptorul este mai complex (cum ar fi un soclu JSON-RPC).

Acesta este modul în care un adaptor ar putea arăta:

Dar, pentru simple puncte de referință HTTP, adaptoarele par a fi o mulțime de lucruri și au un dezavantaj major: părăsesc bibliotecile pe care le consumă din ecuația de testare. Dacă se schimbă ceva în bibliotecile HTTP sau JSON, testele nu o vor prinde. Valoarea codului critic pentru producție care nu este testată de această abordare este inacceptabilă.

Prezentul și viitorul

Bypass-ul ne permite să începem un server web foarte simplu în teste care simulează serviciile externe pe care le folosim.

Acum, putem testa întreaga stivă, inclusiv biblioteca HTTP, biblioteca de codare / decodare JSON și mecanisme de autentificare. Bypass README este bine scris, așa că voi economisi detalii de implementare. Cu toate acestea, modificăm puțin modul în care îl folosim pentru a menține testele concise și lizibile:

În primul rând, uneori dorim să apelăm la Facebook atunci când testele sunt executate ca o suită de integrare completă. Facem acest lucru neregulat pentru a ne asigura că API-ul Facebook încă funcționează conform așteptărilor noastre. adăugare - include integrarea la testul de amestec nu simulează API ci, în schimb, solicită serviciului extern (linii 5, 7).

Suntem explicit atunci când simulează cererile pentru servicii externe, astfel încât fiecare test care utilizează Bypass trebuie să aibă @tag facebook_bypass (linia 7).

În cele din urmă, handle_fb (liniile 30-39) este numit (având în vedere că request_path chibrituri). Îmi place împerecherea în capul funcției, deoarece explică în ce mod ne reacționăm și ne permite să definim diferite funcții pentru diferite căi.

Deci, Bypass rulează numai cu teste etichetate cu @tag: bypass și când nu ne conducem suita de integrare. Un lucru pe care îl facem în timp ce setăm Bypass este permiterea etichetei să treacă printr-un id de pagină (linii 8, 20). Deci, aici este modul în care un test care utilizează Bypass arată în toată gloria sa:

După cum puteți vedea, facebook_bypass tag-ul explică faptul că simulăm API (dacă nu suntem în modul de integrare). Aceasta ne permite să transmitem informații API-ului simulat și este foarte ușor să reutilizăm aceeași configurare Bypass pentru diferite teste.

Sper că acest lucru vă ajută să testați API-uri externe. Mă puteți găsi pe Twitter (vedeți mai jos) dacă aveți întrebări suplimentare.

$config[ads_kvadrat] not found