Slik tester du eksterne APIer i Elixir med bypass

Intro to Postman Part 3: writing API tests

Intro to Postman Part 3: writing API tests

Innholdsfortegnelse:

Anonim

Vi prioriterer Service Oriented Architecture-prinsipper på Omvendt. Det betyr at vi har små, vedlikeholdsfrie komponenter med klart definert ansvar. De kommuniserer med hverandre (for det meste), via Representative State Transfer, eller REST, APIer.

Dette gir fleksibilitet og har tjent oss bra med unntak av en betydelig fasett: Testing. Ved testing bør man unngå:

  • Avhengighet av eksterne tjenester som kjører på samme maskin.
  • Sakte tester.

Fordi applikasjoner i utgangspunktet er avhengige av eksterne tjenester, er det viktig å ha en teststrategi for disse avhengighetene.

Vi har nylig begynt å bruke Bypass, og jeg vil forklare hvordan vi ankom dit og spesifikt hvordan vi bruker det.

Fortiden

Mock metoder og returnere noen eksempel data som dette:

Det var (og jeg tror fortsatt er) "vei å gå" i Ruby / Rails verden. Dessverre fremmer dette dårlig oppførsel som best forklart her av José Valim.

Vi begynte da å bruke ExVCR, som er et flott bibliotek, men har lignende ulemper som mocks / stubber: Det oppfordrer latskap og fremmer ikke adskillelsen av bekymringer som er kritiske for veldefinerte APIer. ExVCR gjør det mulig å "registrere" og "avspille" sanntidsdata. Det er veldig enkelt å integrere (inkludert noen få linjer i testen og alt annet blir tatt vare på). Men ideelt sett må du tenke på eksterne avhengigheter i tester, ikke abstrahere dem ut. Det kan fortsatt være et levedyktig valg for scenarier når endepunktsadferden skal testes med minimal overhead (vi bruker den til å teste anrop til Amazonas AWS-tjenester som S3).

Skriv inn adaptere

Adaptere fungerer bra og fremmer overveielse rundt API-kontrakter og tydelig definerte kommunikasjonsgrenser. Vi bruker fortsatt denne tilnærmingen, spesielt når adapteren er mer kompleks (som en JSON-RPC-kontakt).

Slik ser en adapter ut:

Men for enkle HTTP-sluttpunkter virker adaptrene som mye arbeid og har en stor ulempe: De forlater bibliotekene de forbruker ut av testekvasjonen. Hvis noe i HTTP- eller JSON-bibliotekene endres, vil testene ikke fange det. Mengden av produksjonskritisk kode som ikke er testet ved denne tilnærmingen, er uakseptabel.

Nåtid og fremtid

Bypass tillater oss å starte en veldig enkel webserver i tester som simulerer eksterne tjenester vi bruker.

Nå kan vi teste hele stakken, inkludert HTTP-biblioteket, JSON-kodings- / dekodingsbiblioteket og godkjenningsmekanismer. Bypass README er godt skrevet, så jeg vil spare detaljer om implementering. Vi endrer imidlertid litt hvordan vi bruker det for å holde testene konsise og lesbare:

For det første ønsker vi noen ganger å ringe til Facebook når tester kjøres som en full integrering suite. Vi gjør dette uregelmessig for å sikre at Facebook API fortsatt fungerer etter våre forventninger. legge - inkludere integrering til blandetest simulerer ikke API-en, men i stedet ringer den eksterne tjenesten (linjer 5, 7).

Vi er eksplisitte når vi simulerer forespørsler til eksterne tjenester, slik at hver test som bruker Bypass må ha @tag facebook_bypass (linje 7).

Til slutt, handle_fb funksjon (linjer 30-39) blir kalt (gitt at request_path fyrstikker). Jeg liker å matche i funksjonshodet, da det tydeliggjør hvilken vei vi reagerer på, og lar oss definere forskjellige funksjoner for forskjellige baner.

Så Bypass kjøres på bare tester merket med @tag: bypass og når vi ikke kjører integrationspakken vår. En ting vi gjør mens du konfigurerer bypass, gjør at taggen kan passere et sidens id (linjer 8, 20). Så her er hvordan en test som bruker Bypass ser i all sin herlighet:

Som du kan se, er facebook_bypass tag gjør det eksplisitt at vi simulerer API-en (med mindre vi er i integrasjonsmodus). Det tillater oss å sende informasjon til den simulerte API, og det er veldig enkelt å gjenbruke samme Bypass-konfigurasjon for forskjellige tester.

Jeg håper dette hjelper deg med å teste eksterne APIer. Du finner meg på Twitter (se nedenfor) hvis du har flere spørsmål.