Restito Aracını kullanarak REST İstemci Testi

İçindekiler:

Anonim

REST nedir?

REST , belirli bir zamanda herhangi iki sistem arasında yeni bir iletişim yolu olan "Temsili Durum Transferi" anlamına gelir. Sistemlerden biri 'REST Client', diğeri 'REST Server' olarak adlandırılır.

Bu REST eğitiminde şunları öğreneceksiniz:

  • REST nedir?
  • REST İstemcisi nedir?
  • REST Sunucusu nedir?
  • Restito nedir?
  • Restito kullanarak REST istemcisi nasıl test edilir?
  • REST istemci testi için Restito Framework kullanmanın avantajları
  • REST istemci testi için Restito Framework kullanmanın dezavantajları

Restito Framework for REST istemci testi hakkında bilgi edinmeden önce, önce birkaç temel bilgiyi öğrenelim.

REST İstemcisi nedir?

REST İstemcisi, herhangi bir sistem veya hizmet sağlayıcısı tarafından iletişim için kullanıma sunulan bir REST hizmet API'sini çağırmak için bir yöntem veya araçtır. Örneğin: Google'dan bir rota hakkında gerçek zamanlı trafik bilgisi almak için bir API açığa çıkarılırsa, Google trafik API'sini çağıran yazılım / araç REST istemcisi olarak adlandırılır.

REST Sunucusu nedir?

Herhangi bir sistem veya servis sağlayıcı tarafından iletişime maruz bırakılan bir yöntem veya API'dir. Örneğin, Google, belirli bir rotada gerçek zamanlı trafik bilgisi almak için bir API sunar.

Burada, Google sunucusunun, farklı istemcilerden gelen açık API'ye yönelik istekleri dinlemek için çalışır durumda olması gerekir.

Misal:

Yukarıdaki tanımlardan eksiksiz bir Uçtan Uca senaryo oluşturmanın zamanı geldi.

Bir şirketin, belirli bir aracın bulunduğu güzergahların etrafındaki trafik durumu hakkında gerçek zamanlı bilgiye ihtiyacı olduğu için Uber gibi taksi rezervasyon uygulamalarını ele alalım.

Dinlenme İstemcisi:

Burada müşteri, sürücünün oturum açtığı bir Uber mobil uygulamasıdır. Bu uygulama, gerçek zamanlı verileri almak için Google haritaları tarafından gösterilen REST API'ye bir istek gönderir. Örneğin, bir HTTP GET isteği.

Dinlenme Sunucusu:

Bu örnekte, Google Servis sağlayıcıdır ve Google haritalarının API'si, Uber uygulamasının isteğine gerekli ayrıntılarla yanıt verir.

REST iletişiminde hem istemci hem de sunucu eşit derecede önemlidir.

Burada, yalnızca REST İstemcisinin otomasyon testi için örnekler uyguladık. REST sunucusunu test etmek için https://www.guru99.com/top-6-api-testing-tool.html adresine bakın.

Restito nedir?

Restito, Mkotsur tarafından geliştirilmiş bir çerçevedir. Her türlü HTTP İsteğini yürütmenize yardımcı olacak hafif bir uygulamadır. Restito'yu REST API'lerinizi test etmek ve uygulamanızdaki veya ağınızdaki sorunları aramak için kullanabilirsiniz.

Restito kullanarak REST istemcisi nasıl test edilir?

Alıştırmayı aşağıdaki 4 adıma ayıralım:

  1. Herhangi bir sunucu uç noktasına HTTP GET isteği göndermek için bir HTTP istemcisi ve yöntemi oluşturun. Şimdilik, uç noktanın http: // localhost: 9092 / getevents olduğunu düşünün.
  1. Localhost http: // localhost: 9092 / getevents içindeki 'getevents' uç noktasına gönderilen istekleri dinlemek ve yakalamak için bir Restito sunucusu başlatın.
  1. Yukarıdaki istemciyi test etmek için bir test sınıfı oluşturun. 'Getevents' API'sine bir GET isteği başlatmak için HTTP istemcisinin 'sendGETRequest' yöntemini çağırın.
  1. Restito çerçevesini kullanarak HTTP GET çağrısını doğrulayın.

Yukarıdaki adımların her birine derinlemesine dalalım.

Adım 1) Herhangi bir sunucu uç noktasına HTTP GET isteği göndermek için bir HTTP istemcisi ve yöntemi oluşturun.

========== JAVA KODU Başlıyor ===========

paket com.chamlabs.restfulservices.client;içe aktar java.util.HashMap;içe aktar java.util.Map;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.HttpClientBuilder;import org.json.JSONObject;/ *** Bu sınıf bir HTTP İstemcisi oluşturur ve HTTP GET isteği göndermek için bir yönteme sahiptir:* sendGETRequest (…)* /public class RestClient {/ *** RestClient sınıfı için kurucu* /public RestClient () {System.out.println ("RestClient yapıcısı yaratılıyor");}/ *** GET isteğini http: // localhost: <
> / getevents'e Gönderme Yöntemi* @param bağlantı noktası* GET isteği başarıyla gönderilirse @return true. Yanlış, aksi halde.* /public static boolean sendGETRequest (int bağlantı noktası) {Deneyin {HttpClient istemci = HttpClientBuilder.create (). Build ();HttpGet getRequest = new HttpGet ("http: // localhost: + bağlantı noktası + "/ getevents");// HttpResponse response = client.execute (istek);client.execute (getRequest);System.out.println ("HTTP isteği başarıyla gönderildi."+ "Geri Dönen Doğru");doğruya dön;}catch (İstisna e) {e.printStackTrace ();}System.out.println ("HTTP İstemcisi oluşturulurken bazı istisnalar oluştu."+ "Yanlış döndürülüyor");yanlış dönüş;}}

========== JAVA KODU Bitiyor ===========

Adım 2) localhost http: // localhost: 9092 / getevents içindeki 'getevents' uç noktasına gönderilen istekleri dinlemek ve yakalamak için bir Restito sunucusu başlatın.

========== JAVA KODU Başlıyor ===========

paket com.chamlabs.restfultesting.util;statik com.xebialabs.restito.builder.stub.StubHttp.whenHttp dosyasını içe aktarın;statik com.xebialabs.restito.semantics.Action.status dosyasını içe aktarın;statik com.xebialabs.restito.semantics.Condition.get'i içe aktarın;statik com.xebialabs.restito.semantics.Condition.post'u içe aktarın;import java.util.List;import org.glassfish.grizzly.http.util.HttpStatus;import com.xebialabs.restito.semantics.Call;import com.xebialabs.restito.server.StubServer;/ *** Bu yardımcı program sınıfı, aşağıdakiler gibi birkaç yardımcı yöntem içerir:* restartRestitoServerForGETRequests (…)* restartRestitoServerForPOSTRequests (…)* waitAndGetCallList (…)** @author cham6* @ e-posta: [email protected]* @fork: https://github.com/cham6/restfultesting.git** /public class TestUtil {/ *** GET isteklerini kabul etmek için restito saplama sunucusunu başlatmak için yardımcı program yöntemi* @param sunucusu* @param bağlantı noktası* @param durumu* /public static void restartRestitoServerForGETRequests (StubServer sunucusu, int bağlantı noktası, HttpStatus durumu){// Restito sunucusunu öldürüneğer (server! = null) {server.stop ();}// Saplama sunucusunun daha yeni bir örneğini başlatın ve yapılandırınserver = new StubServer (port) .run ();whenHttp (server) .match (get ("/ getevents")). then (status (status));}/ *** POST isteklerini kabul etmek için restito saplama sunucusunu başlatmak için yardımcı program yöntemi* @param sunucusu* @param bağlantı noktası* @param durumu* /public static void restartRestitoServerForPOSTRequests (StubServer sunucusu, int bağlantı noktası, HttpStatus durumu){// Restito sunucusunu öldürüneğer (server! = null) {server.stop ();}// Saplama sunucusunun daha yeni bir örneğini başlatın ve yapılandırınserver = new StubServer (port) .run ();whenHttp (server) .match (post ("/ postevents")). then (status (status));}/ *** Belirli bir restito saplama sunucusu için, verilen saniye kadar döngü yapın ve* sunucudan çağrı listesini kırın ve geri dönün.** @param sunucusu* @param waitTimeInSeconds* @dönüş* @throws InterruptedException* /public static List  waitAndGetCallList (StubServer sunucusu, int waitTimeInSeconds)InterruptedException oluşturur{int timeoutCount = 0;List  callList = server.getCalls ();while (callList.isEmpty ()) {Thread.sleep (1000);timeoutCount ++;eğer (timeoutCount> = waitTimeInSeconds) {kırmak;}callList = server.getCalls ();}// Herhangi bir aksaklıktan kurtulmak için tüm çağrıları callList'e almak için 2 saniye bekleyin.Thread.sleep (2000);return server.getCalls ();}}

========== JAVA KODU Bitiyor ===========

Adım 3) Yukarıdaki istemciyi test etmek için bir test sınıfı oluşturun. 'Getevents' API'sine bir GET isteği başlatmak için HTTP istemcisi sendGETRequest yöntemini çağırın.

========== JAVA KODU Başlıyor ===========

import junit.framework.TestCase;import com.chamlabs.restfulservices.client.RestClient;import com.chamlabs.restfultesting.util.TestUtil;import com.xebialabs.restito.semantics.Call;import com.xebialabs.restito.server.StubServer;statik org.glassfish.grizzly.http.util.HttpStatus.ACCEPTED_202;import org.json.JSONObject;import java.util.List;içe aktar java.util.Map;/ *** Bu sınıf, aşağıdaki gibi RestClient işlemlerini doğrulamak için birkaç junit testi içerir:* istek gönder(… )* sendRequestWithCustomHeaders (…)* sendPOSTRequestWithJSONBody (…)** /public class RestClientTester, TestCase'i genişletir {özel statik son Tamsayı PORT = 9098;özel statik son Tamsayı PORT2 = 9099;özel statik son Tamsayı PORT3 = 9097;public RestClientTester () {System.out.println ("RestClientTester testini başlatma");}/ *** RestClient'ten gelen GET talebini doğrulamak için Junit testi* Adımlar:* 1) Restito çerçevesini kullanarak bir saplama sunucusu oluşturun ve verilen bağlantı noktasını dinleyecek şekilde yapılandırın* 2) RestClient'in sendGETRequest (…) yöntemini çağırın* 3) Restito, varsa eşleşen GET isteklerini yakalar.* 4) Restito'nun belirli bir uç noktada herhangi bir GET isteği yakalayıp yakalamadığını doğrulayın* Beklenen davranış:*> Restito, GET isteğini yakalamalı ve yalnızca bir GET isteğini yakalamış olmalıdır.* En sonunda:*> Restito kullanmaya başlayan saplama sunucusunu durdurun.* /public void testGETRequestFromClient () {StubServer sunucusu = boş;Deneyin {// Bu, saplama sunucusunu 'PORT' üzerinde başlatacak ve HTTP 202 'ACCEPTED_202' ile yanıt verecektirTestUtil.restartRestitoServerForGETRequests (sunucu, PORT, ACCEPTED_202);RestClient.sendGETRequest (PORT);List  callList = TestUtil.waitAndGetCallList (sunucu, 30);assertTrue ("GET isteği RestClient'ten alınmadı. Test başarısız oldu.",(callList! = null) && (callList.size () == 1));}catch (İstisna e) {e.printStackTrace ();başarısız ("İstisna nedeniyle Test Başarısız Oldu: + e);}en sonunda {eğer (server! = null) {server.stop ();}}}

========== JAVA KODU Bitiyor ===========

Adım 4) Başlıklar ve POST isteği ile GET isteğinin Restito çerçevesini kullanarak gövde ile nasıl doğrulanır.

========== JAVA KODU Başlıyor ===========

/ *** RestClient'ten başlıklarla GET isteğini doğrulamak için Junit testi* Adımlar:* 1) Restito çerçevesini kullanarak bir saplama sunucusu oluşturun ve verilen bağlantı noktasını dinleyecek şekilde yapılandırın* 2) RestClient'in sendGETRequestWithCustomHeaders (…) yöntemini çağırın* 3) Restito, varsa eşleşen GET isteklerini yakalar.* 4) Restito'nun belirli bir uç noktada herhangi bir GET isteği yakalayıp yakalamadığını doğrulayın* Beklenen davranış:*> Restito'nun GET isteğini yakalamış olması ve yalnızca bir GET isteğini yakalamış olması gerekirdi.*> Yakalanan GET isteğinin başlıklarını alın* ve başlıkların yapılandırılanlarla eşleştiğinden emin olun.* En sonunda:*> Restito kullanmaya başlayan saplama sunucusunu durdurun.* /public void testGETRequestWithHeadersFromClient () {StubServer sunucusu = boş;Deneyin {// Bu, saplama sunucusunu 'PORT' üzerinde başlatacak ve HTTP 202 'ACCEPTED_202' ile yanıt verecektirTestUtil.restartRestitoServerForGETRequests (sunucu, PORT2, ACCEPTED_202);RestClient.sendGETRequestWithCustomHeaders (PORT2);List  callList = TestUtil.waitAndGetCallList (sunucu, 30);assertTrue ("GET isteği RestClient'ten alınmadı. Test başarısız oldu.",(callList! = null) && (callList.size () == 1));// REST İstemcisinden gelen GET isteğinin başlıklarını doğrulayınMap > headersFromRequest = callList.get (0) .getHeaders ();assertTrue ("GET isteği, Accept başlığını ve değerini içerir",headersFromRequest.get ("Kabul Et"). içerir ("metin / html"));assertTrue ("GET isteği, başlık Yetkilendirmesini ve değerini içerir",headersFromRequest.get ("Yetkilendirme"). içerir ("Taşıyıcı 1234567890qwertyuiop"));assertTrue ("GET isteği, Cache-Control başlığını ve değerini içerir",headersFromRequest.get ("Önbellek Kontrolü"). içerir ("önbelleksiz"));assertTrue ("GET isteği üstbilgi Bağlantısını ve değerini içerir",headersFromRequest.get ("Bağlantı"). içerir ("canlı tutma"));assertTrue ("GET isteği, Content-Type üstbilgisini ve değerini içerir",headersFromRequest.get ("İçerik Türü"). içerir ("uygulama / json"));}catch (İstisna e) {e.printStackTrace ();başarısız ("İstisna nedeniyle Test Başarısız Oldu: + e);}en sonunda {eğer (server! = null) {server.stop ();}}}
/ *** POST isteğini RestClient'ten gövde ve başlıklar ile doğrulamak için Junit testi* Adımlar:* 1) Restito çerçevesini kullanarak bir saplama sunucusu oluşturun ve verilen bağlantı noktasını dinleyecek şekilde yapılandırın* 2) RestClient'in sendPOSTRequestWithJSONBody (…) yöntemini çağırın* 3) Restito, varsa eşleşen POST isteklerini yakalar.* 4) Restito'nun belirli bir uç noktada herhangi bir POST isteği yakalayıp yakalamadığını doğrulayın* Beklenen davranış:*> Restito, POST isteğini yakalamalı ve yalnızca bir POST isteğini yakalamış olmalıdır.*> Yakalanan POST isteğinin gövdesini alın ve JSON değerlerini doğrulayın* En sonunda:*> Restito kullanmaya başlayan saplama sunucusunu durdurun.* /public void testPOSTRequestWithJSONBody () {StubServer sunucusu = boş;Deneyin {// Bu, saplama sunucusunu 'PORT' üzerinde başlatacak ve HTTP 202 'ACCEPTED_202' ile yanıt verecektirTestUtil.restartRestitoServerForPOSTRequests (sunucu, PORT3, ACCEPTED_202);RestClient.sendPOSTRequestWithJSONBody (PORT3);List  callList = TestUtil.waitAndGetCallList (sunucu, 30);assertTrue ("POST isteği RestClient'ten alınmadı. Test başarısız oldu.",(callList! = null) && (callList.size () == 1));// REST İstemcisinden gelen GET isteğinin başlıklarını doğrulayınString requestBody = callList.get (0) .getPostBody ();JSONObject postRequestJSON = new JSONObject (requestBody);assertTrue ("json'daki timeUpdated yanlış",postRequestJSON.get ("timeUpdated"). toString (). equalsIgnoreCase ("1535703838478"));assertTrue ("json'daki access_token yanlış",postRequestJSON.get ("access_token"). toString ().equalsIgnoreCase ("abf8714d-73a3-42ab-9df8-d13fcb92a1d8"));assertTrue ("json'daki refresh_token yanlış",postRequestJSON.get ("renew_token"). toString ().equalsIgnoreCase ("d5a5ab08-c200-421d-ad46-2e89c2f566f5"));assertTrue ("json'daki token_type yanlış",postRequestJSON.get ("token_type"). toString (). equalsIgnoreCase ("taşıyıcı"));assertTrue ("json'daki expires_in yanlış",postRequestJSON.get ("expires_in"). toString (). equalsIgnoreCase ("1024"));assertTrue ("json'daki kapsam yanlış",postRequestJSON.get ("kapsam"). toString (). equalsIgnoreCase (""));}catch (İstisna e) {e.printStackTrace ();başarısız ("İstisna nedeniyle Test Başarısız Oldu: + e);}en sonunda {eğer (server! = null) {server.stop ();}}}}

========== JAVA KODU Bitiyor ===========

REST istemci testi için Restito Framework kullanmanın avantajları

Burada, ReST istemci testi için Restito Çerçevesinin avantajları / faydaları yer almaktadır.

  • REST İstemcisini test etmek için gerçek REST sunucusunun geliştirilmesine ihtiyacımız yok.
  • Restito, bir Sunucunun farklı davranışlarıyla dalga geçmek için güçlü ve çeşitli araçlar ve yöntemler sağlar. Örneğin: Sunucu HTTP 404 hatası veya HTTP 503 hatasıyla yanıt verdiğinde REST istemcisinin nasıl davrandığını test etmek için.
  • Restito sunucuları birkaç milisaniye içinde kurulabilir ve testler tamamlandıktan sonra sonlandırılabilir.
  • Restito, sıkıştırılmış, sıkıştırılmamış, birleştirilmiş, uygulama / metin, uygulama / JSON vb. Gibi her tür HTTP yöntemi içeriğini destekler

REST istemci testi için Restito Framework kullanmanın dezavantajları

Burada, ReST istemci testi için Restito Çerçevesinin eksileri / dezavantajları

  • REST istemci kaynağı, 'localhost'u bir sunucu makinesi olarak kabul edecek şekilde ayarlanmalıdır.
  • Sunucuyu herhangi bir bağlantı noktasında açmak, '8080' veya '9443' gibi yaygın olarak kullanılan bazı bağlantı noktalarını kullanırsak çakışabilir.
  • Diğer araçlar tarafından yaygın olarak kullanılmayan 9092 veya 9099 gibi bağlantı noktalarının kullanılması önerilir.

Özet:

  • REST, belirli bir zamanda herhangi iki sistem arasında yeni bir standart iletişim yolu olan "Temsili Durum Transferi" anlamına gelir.
  • REST İstemcisi, herhangi bir sistem veya hizmet sağlayıcısı tarafından iletişime maruz bırakılan bir REST hizmet API'sini çağırmak için bir yöntem veya araçtır.
  • RestServer yönteminde veya herhangi bir sistem veya servis sağlayıcı tarafından iletişim için açığa çıkan bir API'de.
  • Restito, her türlü HTTP İsteğini gerçekleştirmenize yardımcı olacak hafif bir uygulamadır
  • Herhangi bir sunucu uç noktasına HTTP GET isteği göndermek için bir HTTP istemcisi ve yöntemi oluşturun
  • 'Getevents' uç noktasına gönderilen istekleri dinlemek ve yakalamak için bir Restito sunucusu başlatın.
  • Localhost'ta 'getevents' uç noktasına gönderilen istekleri dinlemek ve yakalamak için bir Restito sunucusu başlatın
  • Burada, yalnızca REST İstemcisinin otomasyon testi için örnekler uyguladık.
  • REST İstemcisini test etmek için gerçek REST sunucusunun geliştirilmesine ihtiyacımız yok.
  • REST istemci kaynağı, 'localhost'u bir sunucu makinesi olarak kabul edecek şekilde ayarlanmalıdır.

Bu makale Chandrasekhar Muttineni tarafından hazırlanmıştır.