Teszteljen egy REST API-t Java-val
1. Áttekintés
Ez az oktatóanyag a következők alapelveire és mechanikájára összpontosít egy REST API tesztelése élő integrációs tesztekkel (JSON hasznos teherrel).
A fő cél egy bevezetés bemutatása az API alapvető helyességének teszteléséhez - és a példákhoz a GitHub REST API legújabb verzióját fogjuk használni.
Belső alkalmazás esetében ez a fajta tesztelés a késõbbi lépésként fut a folyamatos integrációs folyamat során, és a REST API-t már a telepítése után elfogyasztja.
A REST erőforrás tesztelésekor általában néhány ortogonális felelősségre van szükség, amelyekre a teszteknek összpontosítaniuk kell:
- a HTTP válaszkód
- egyéb HTTP fejlécek válaszában
- a hasznos teher (JSON, XML)
Minden tesztnek csak egyetlen felelősségre kell összpontosítania, és egyetlen állítást kell tartalmaznia. A világos elkülönítésre való összpontosításnak mindig előnyei vannak, de az ilyen típusú fekete doboz végrehajtása során a tesztelés még fontosabb, mivel az általános tendencia az, hogy a legelején összetett tesztforgatókönyveket ír.
Az integrációs tesztek másik fontos szempontja a Az absztrakciós elv egyetlen szintje - a teszten belüli logikát magas szinten kell megírni. Az olyan részleteket, mint például a kérelem létrehozása, a HTTP-kérés elküldése a szerverre, az IO-val való foglalkozás stb., Nem inline, hanem segédprogramokkal kell végrehajtani.
2. Az állapotkód tesztelése
@Test public void givenUserDoesNotExists_whenUserInfoIsRetrieved_then404IsReceived () dobja a ClientProtocolException, IOException {// adott karakterlánc neve = RandomStringUtils.randomAlphabetic (8); HttpUriRequest kérés = új HttpGet ("//api.github.com/users/" + név); // Amikor HttpResponse httpResponse = HttpClientBuilder.create (). Build (). Végrehajtani (kérés); // Ezután assertThat (httpResponse.getStatusLine (). GetStatusCode (), equalTo (HttpStatus.SC_NOT_FOUND)); }
Ez egy meglehetősen egyszerű teszt - igazolja, hogy működik egy alapvető boldog út, anélkül, hogy túl sok bonyolultságot adna a tesztcsomaghoz.
Ha valamilyen okból kifolyólag nem sikerül, akkor nem kell más vizsgálatot végezni ezen az URL-en addig, amíg ezt nem javítják.
3. A hordozótípus tesztelése
@Test public void givenRequestWithNoAcceptHeader_whenRequestIsExecuted_thenDefaultResponseContentTypeIsJson () dobja a ClientProtocolException, IOException {// adott karakterláncot jsonMimeType = "application / json"; HttpUriRequest kérés = új HttpGet ("//api.github.com/users/eugenp"); // Amikor a HttpResponse response = HttpClientBuilder.create (). Build (). Execute (request); // Akkor String mimeType = ContentType.getOrDefault (response.getEntity ()). GetMimeType (); assertEquals (jsonMimeType, mimeType); }
Ez biztosítja, hogy a Válasz valóban tartalmaz JSON-adatokat.
Mint észrevehette, logikusan haladunk a teszteken - először a Válasz állapotkódja (annak biztosítása érdekében, hogy a kérés rendben legyen), majd a Válasz adathordozó típusa, és csak a következő tesztben nézzük meg a tényleges JSON hasznos terhet.
4. A JSON hasznos terhelésének tesztelése
@Test public void givenUserExists_whenUserInformationIsRetrieved_thenRetrievedResourceIsCorrect () dobja a ClientProtocolException, IOException {// adott HttpUriRequest kérést = új HttpGet ("//api.github.com/users/eugenp"); // Amikor a HttpResponse response = HttpClientBuilder.create (). Build (). Execute (request); // Akkor GitHubUser erőforrás = RetrieveUtil.retrieveResourceFromResponse (válasz, GitHubUser.class); assertThat ("eugenp", Matchers.is (erőforrás.getLogin ())); }
Ebben az esetben tudom, hogy a GitHub erőforrások alapértelmezett ábrázolása a JSON, de általában a
Tartalom típus A válasz fejlécét a Elfogad a kérés fejléce - az ügyfél egy adott típusú ábrázolást kér a következőn keresztül: Elfogad, amelyet a szervernek tiszteletben kell tartania.
5. Segédprogramok a teszteléshez
A Jackson 2-t használjuk a nyers JSON karakterlánc típusbiztonsági Java-entitássá bontására:
public class GitHubUser {private String login; // szabványos mérőeszközök és beállítók}
Csak egy egyszerű segédprogramot használunk a tesztek tisztaságának, olvashatóságának és magas absztrakciós szintjének megőrzéséhez:
public static T retrieveResourceFromResponse (HttpResponse response, Class clazz) dobja az IOException {String jsonFromResponse = EntityUtils.toString (response.getEntity ()); ObjectMapper mapper = új ObjectMapper () .configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, hamis); return mapper.readValue (jsonFromResponse, clazz); }
Figyelje meg, hogy Jackson figyelmen kívül hagyja azokat az ismeretlen tulajdonságokat, amelyeket a GitHub API küld nekünk - egyszerűen azért, mert a felhasználói erőforrások GitHubon való ábrázolása meglehetősen összetetté válik -, és itt nincs szükségünk ezekre az információkra.
6. Függőségek
A segédprogramok és tesztek a következő könyvtárakat használják, amelyek mind elérhetőek a Maven központjában:
- HttpClient
- Jackson 2
- Hamcrest (opcionális)
7. Következtetés
Ez csak egy része annak, aminek a teljes integrációs tesztkészletnek lennie kell. A tesztek a következőkre összpontosítanak a REST API alapvető helyességének biztosítása, anélkül, hogy bonyolultabb forgatókönyvekbe menne,
Például a következők nem tartoznak ide: az API felfedezhetősége, különböző reprezentációk fogyasztása ugyanazon erőforráshoz stb.
Ezeknek a példáknak és kódrészleteknek a megvalósítása megtalálható a Github-on - ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.