Štai kaip bandymai atlieka išorines API Elixir'e su aplinkkeliu

$config[ads_kvadrat] not found

ClassRoom Formos/Testai

ClassRoom Formos/Testai

Turinys:

Anonim

Mes teikiame pirmenybę paslaugų orientuotos architektūros principams Inversinis. Tai reiškia, kad turime nedidelius, prieinamus komponentus, aiškiai apibrėžtus įsipareigojimus. Jie bendrauja vienas su kitu (dažniausiai) per reprezentacinį valstybinį perdavimą arba REST, API.

Tai suteikia lankstumo ir gerai tarnavo mums, išskyrus vieną svarbų aspektą: testavimas. Bandant reikia vengti:

  • Priklausomybė nuo toje pačioje mašinoje veikiančių išorinių paslaugų.
  • Lėtas testavimas.

Kadangi programos iš esmės remiasi išorinėmis paslaugomis, labai svarbu, kad šioms priklausomybėms būtų įdiegta testavimo strategija.

Neseniai pradėjome naudoti „Bypass“ ir paaiškinsiu, kaip mes atvykome į ją ir konkrečiai, kaip mes jį naudojame.

Praeitis

Išspręskite metodus ir grąžinkite tokius pavyzdinius duomenis:

Tai buvo (ir manau, kad vis dar yra) „kelias eiti“ Ruby / Rails pasaulyje. Deja, tai skatina blogą elgesį, kaip geriausiai paaiškino José Valim.

Tada mes pradėjome naudoti „ExVCR“, kuri yra puiki biblioteka, tačiau turi panašių trūkumų kaip „mock“ / „stubs“: tai skatina tinginybę ir neskatina atskirti problemas, kurios yra labai svarbios gerai apibrėžtoms API. „ExVCR“ leidžia „įrašyti“ ir „atkurti“ realius duomenis. Tai labai lengva integruoti (įskaitant kelias eilutes jūsų bandyme ir visa kita rūpinamasi). Bet geriausia, kad jūs turėtumėte pagalvoti apie išorines priklausomybes testuose, o ne iš abstrakčių. Tai vis tiek gali būti naudingas pasirinkimas scenarijų atveju, kai pasekmių elgesys turėtų būti išbandytas su minimaliomis pridėtinėmis vertėmis (mes jį naudojame bandant skambučius į „Amazon“ AWS paslaugas, pvz., S3).

Įveskite adapterius

Adapteriai puikiai veikia ir skatina aptarti API sutartis ir aiškiai apibrėžtas ryšio ribas. Mes vis dar naudojame šį metodą, ypač kai adapteris yra sudėtingesnis (kaip JSON-RPC lizdas).

Taip gali atrodyti adapteris:

Tačiau paprasti HTTP galutiniai taškai, adapteriai atrodo kaip daug darbo ir turi didelį trūkumą: jie palieka bibliotekas, kurias jie naudoja, iš bandymo lygties. Jei pasikeičia HTTP arba JSON bibliotekose esanti informacija, bandymai jo nepriims. Nepriimtinas yra gamybos požiūriu kritinio kodo kiekis, kuris nėra išbandytas pagal šį metodą.

Dabartinė ir ateitis

Perdavimas leidžia mums pradėti labai paprastą žiniatinklio serverį bandymuose, kurie imituoja išorines paslaugas, kurias naudojame.

Dabar mes galime išbandyti visą krūvą, įskaitant HTTP biblioteką, JSON kodavimo / dekodavimo biblioteką ir autentifikavimo mechanizmus. „Bypass README“ yra gerai parašyta, todėl išsinuomosiu įgyvendinimo detales. Vis dėlto mes šiek tiek pakeisime, kaip mes jį naudojame, kad testai būtų glausti ir suprantami:

Pirmiausia mes kartais norime pasikviesti į „Facebook“, kai bandymai atliekami kaip visiškas integracijos rinkinys. Tai darome netaisyklingai, kad „Facebook“ API vis dar veiktų pagal mūsų lūkesčius. Pridedant - įtraukti integraciją į ištirti neimuliuoja API, bet vietoj to kreipiasi į išorinę paslaugą (5, 7 eilutės).

Esame aiškūs, kai imituojame prašymus išorinėms paslaugoms, kad kiekvienas testas, kuriame naudojamas aplinkkelis, turėtų turėti @tag facebook_bypass (7 eilutė).

Galiausiai, handle_fb funkcija (eilutės 30–39) yra iškviestos (atsižvelgiant į tai, kad request_path degtukai). Man patinka suderinti funkcijų galvą, nes ji aiškiai nurodo, kurį kelią reaguojame ir leidžia mums apibrėžti skirtingas funkcijas skirtingiems keliams.

Taigi „Bypass“ veikia tik bandymuose, pažymėtuose @tag: aplinkkelis ir kai mes neturime savo integracijos rinkinio. Dar vienas dalykas, kurį mes atliekame nustatydami aplinkkelį, leidžia žymei perduoti puslapio ID (8, 20 eilutės). Taigi čia, kaip testas, kuris naudoja aplinkkelį, atrodo visame šlovėje:

Kaip matote, facebook_bypass žyma aiškiai nurodo, kad mes imituojame API (nebent mes esame integracijos režime). Tai leidžia mums perduoti informaciją į imituotą API ir labai paprasta pakartotinai naudoti tą patį aplinkkelio konfigūravimą skirtingiems bandymams.

Tikiuosi, kad tai padės išbandyti išorines API. Jūs galite rasti mane „Twitter“ (žr. Žemiau), jei turite daugiau klausimų.

$config[ads_kvadrat] not found