Vyskúšajte rozhranie REST API v prostredí Java

1. Prehľad

Tento výukový program sa zameriava na základné princípy a mechaniku programu testovanie rozhrania REST API so živými integračnými testami (s užitočným zaťažením JSON).

Hlavným cieľom je poskytnúť úvod do testovania základnej správnosti API - a pre príklady použijeme najnovšiu verziu GitHub REST API.

Pre internú aplikáciu bude tento druh testovania zvyčajne prebiehať ako neskorý krok v procese nepretržitej integrácie, keď sa rozhranie REST API použije už po jeho nasadení.

Pri testovaní zdroja REST je zvyčajne niekoľko ortogonálnych zodpovedností, na ktoré by sa testy mali zamerať:

  • HTTP kód odpovede
  • iný HTTP hlavičky v odpovedi
  • the užitočné zaťaženie (JSON, XML)

Každý test by sa mal zameriavať iba na jednu zodpovednosť a mal by obsahovať jediné tvrdenie. Zameranie na jasné oddelenie má vždy svoje výhody, ale pri tomto druhu čiernej skrinky je testovanie ešte dôležitejšie, pretože všeobecná tendencia je písať zložité testovacie scenáre na samom začiatku.

Ďalším dôležitým aspektom integračných testov je dodržiavanie Princíp jednej úrovne abstrakcie - logika v rámci testu by mala byť napísaná na vysokej úrovni. Podrobnosti, ako je vytvorenie požiadavky, odoslanie žiadosti HTTP na server, riešenie IO atď., By sa nemali robiť inline, ale pomocou obslužných metód.

2. Testovanie stavového kódu

@Test public void givenUserDoesNotExists_whenUserInfoIsRetrieved_then404IsReceived () vyvolá ClientProtocolException, IOException {// Given String name = RandomStringUtils.randomAlphabetic (8); HttpUriRequest request = new HttpGet ("//api.github.com/users/" + meno); // When HttpResponse httpResponse = HttpClientBuilder.create (). Build (). Execute (request); // Potom assertThat (httpResponse.getStatusLine (). GetStatusCode (), equalTo (HttpStatus.SC_NOT_FOUND)); }

Toto je pomerne jednoduchý test - overuje, či funguje základná šťastná cesta, bez toho, aby to bolo na testovacej súprave príliš zložité.

Ak z nejakého dôvodu zlyhá, nie je potrebné hľadať žiadny ďalší test pre túto adresu URL, kým nebude opravený.

3. Testovanie typu média

@Test public void givenRequestWithNoAcceptHeader_whenRequestIsExecuted_thenDefaultResponseContentTypeIsJson () vyvolá ClientProtocolException, IOException {// Given String jsonMimeType = "application / json"; HttpUriRequest request = new HttpGet ("//api.github.com/users/eugenp"); // Keď HttpResponse response = HttpClientBuilder.create (). Build (). Execute (request); // Potom String mimeType = ContentType.getOrDefault (response.getEntity ()). GetMimeType (); assertEquals (jsonMimeType, mimeType); }

To zaisťuje, že odpoveď skutočne obsahuje údaje JSON.

Ako ste si mohli všimnúť, sledujeme logický postup testov - najskôr kód stavu odpovede (aby sme sa uistili, že požiadavka bola v poriadku), potom typ média odpovede a až v ďalšom teste sa pozrieme na skutočné užitočné zaťaženie JSON.

4. Testovanie užitočného zaťaženia JSON

@Test public void givenUserExists_whenUserInformationIsRetrieved_thenRetrievedResourceIsCorrect () vyvolá ClientProtocolException, IOException {// Daná požiadavka HttpUriRequest = nová HttpGet ("//api.github.com/users/eugenp"); // Keď HttpResponse response = HttpClientBuilder.create (). Build (). Execute (request); // Potom GitHubUser resource = RetrieveUtil.retrieveResourceFromResponse (response, GitHubUser.class); assertThat ("eugenp", Matchers.is (resource.getLogin ())); }

V tomto prípade viem, že predvolené zastúpenie zdrojov GitHubu je JSON, ale zvyčajne Druh obsahu hlavička odpovede by sa mala otestovať spolu s súhlasiť hlavička požiadavky - klient požiada o konkrétny typ zastúpenia prostredníctvom súhlasiť, ktoré by mal server ctiť.

5. Pomôcky na testovanie

Použijeme Jackson 2 na zrušenie zdieľania surového reťazca JSON s typovo bezpečnou entitou Java:

public class GitHubUser {private String login; // štandardné getre a setre}

Používame iba jednoduchý nástroj na zaistenie čistoty, čitateľnosti a vysokej abstrakcie testov:

public static T retrieveResourceFromResponse (HttpResponse response, Class clazz) hodí IOException {String jsonFromResponse = EntityUtils.toString (response.getEntity ()); ObjectMapper mapovač = nový ObjectMapper () .configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return mapper.readValue (jsonFromResponse, clazz); }

Všimnite si, že Jackson ignoruje neznáme vlastnosti, ktoré nám zasiela GitHub API - to je jednoducho preto, lebo zastúpenie používateľského zdroja na GitHube je dosť zložité - a my tu nepotrebujeme žiadne z týchto informácií.

6. Závislosti

Pomôcky a testy využívajú nasledujúce knižnice, ktoré sú k dispozícii v centrálnom serveri Maven:

  • HttpClient
  • Jackson 2
  • Hamcrest (voliteľné)

7. Záver

Toto je iba jedna časť kompletnej testovacej súpravy integrácie. Testy sa zameriavajú na zabezpečenie základnej správnosti rozhrania REST API, bez toho, aby sme prešli na zložitejšie scenáre,

Nie sú pokryté napríklad tieto položky: Objaviteľnosť API, spotreba rôznych reprezentácií pre ten istý zdroj atď.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete na serveri Github - jedná sa o projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


$config[zx-auto] not found$config[zx-overlay] not found