Hier leest u hoe externe API's in Elixer met bypass worden getest

$config[ads_kvadrat] not found

Postman API Builder - Webinar

Postman API Builder - Webinar

Inhoudsopgave:

Anonim

We prioriteren de principes van Service Oriented Architecture bij omgekeerde. Dat betekent dat we kleine, onderhoudbare componenten hebben met duidelijk omschreven verantwoordelijkheden. Ze communiceren (meestal) met elkaar, via Representational State Transfer of REST, API's.

Dit biedt flexibiliteit en heeft ons goed gediend met uitzondering van één belangrijk facet: testen. Tijdens het testen moet men vermijden:

  • Afhankelijkheid van externe services die op dezelfde computer worden uitgevoerd.
  • Trage tests.

Omdat toepassingen inherent afhankelijk zijn van externe services, is het van cruciaal belang om een ​​teststrategie te hebben voor die afhankelijkheden.

We zijn onlangs begonnen met het gebruik van Bypass en ik zal uitleggen hoe we daar aankwamen en specifiek hoe we het gebruiken.

Het verleden

Bespottingsmethoden en retourneer enkele voorbeeldgegevens zoals deze:

Dat was (en dat geloof ik nog steeds) de "way to go" in de wereld van Ruby / Rails. Helaas bevordert dit slecht gedrag zoals het best uitgelegd door José Valim.

We zijn toen begonnen met het gebruik van ExVCR, wat een geweldige bibliotheek is, maar heeft soortgelijke nadelen als moppen / stubs: het moedigt luiheid aan en bevordert niet de scheiding van zorgen die cruciaal zijn voor goed gedefinieerde API's. ExVCR maakt het mogelijk om real-live data te "opnemen" en "af te spelen". Het is heel gemakkelijk te integreren (inclusief een paar regels in je test en al het andere wordt behandeld). Maar idealiter moet je nadenken over externe afhankelijkheden in tests, niet abstraheren. Het kan nog steeds een haalbare keuze zijn voor scenario's waarbij het gedrag van het eindpunt moet worden getest met minimale overhead (we gebruiken het voor het testen van oproepen naar Amazon's AWS Services zoals S3).

Voer Adapters in

Adapters werken goed en bevorderen de afweging rond API-contracten en duidelijk gedefinieerde communicatiegrenzen. We gebruiken deze benadering nog steeds, vooral als de adapter complexer is (zoals een JSON-RPC-socket).

Dit is hoe een adapter eruit zou kunnen zien:

Maar voor eenvoudige HTTP-eindpunten lijken Adapters veel werk en hebben ze een groot nadeel: ze laten de bibliotheken die ze consumeren uit de testvergelijking. Als iets in de HTTP- of JSON-bibliotheken verandert, zullen de tests het niet vangen. De hoeveelheid productiekritieke code die niet wordt getest door deze aanpak is onaanvaardbaar.

Het heden en de toekomst

Met bypass kunnen we een zeer eenvoudige webserver starten in tests die externe services simuleren die we gebruiken.

Nu kunnen we de volledige stapel testen, inclusief de HTTP-bibliotheek, JSON-codering / decodeerbibliotheek en authenticatiemechanismen. De README van bypass is goed geschreven, dus ik zal implementatiedetails missen. We veranderen echter enigszins hoe we het gebruiken om tests beknopt en leesbaar te houden:

Ten eerste willen we soms naar Facebook bellen als tests worden uitgevoerd als een volledige integratiesuite. We doen dit onregelmatig om ervoor te zorgen dat de Facebook API nog steeds werkt volgens onze verwachtingen. Het toevoegen - omvat integratie naar mengtest simuleert de API niet, maar roept in plaats daarvan naar de externe service (regels 5, 7).

We zijn expliciet wanneer we verzoeken aan externe services simuleren, zodat elke test die Bypass gebruikt, de @tag facebook_bypass (regel 7).

eindelijk, de handle_fb functie (regels 30-39) wordt aangeroepen (gezien het feit dat de request_path wedstrijden). Ik vind matching in de functiekop leuk omdat het expliciet maakt op welk pad we reageren en ons in staat stelt om verschillende functies voor verschillende paden te definiëren.

Dus Bypass werkt alleen op tests die zijn getagd met @tag: bypass en wanneer we onze integratie suite niet gebruiken. Nog een ding dat we doen tijdens het instellen van Bypass, is dat de tag een pagina-ID kan passeren (regels 8, 20). Dus hier is hoe een test die Bypass gebruikt in al zijn glorie kijkt:

Zoals je kunt zien, de facebook_bypass tag maakt het expliciet dat we de API simuleren (tenzij we in de integratiemodus zijn). Hiermee kunnen we informatie doorgeven aan de gesimuleerde API, en het is heel gemakkelijk om dezelfde Bypass-configuratie opnieuw te gebruiken voor verschillende tests.

Ik hoop dat dit u helpt bij het testen van externe API's. Je kunt me op Twitter vinden (zie hieronder) als je nog vragen hebt.

$config[ads_kvadrat] not found