web services testing using apache http client
Bu Eğitim, Web Hizmetlerinde çeşitli CRUD İşlemleri Gerçekleştirme ve Apache HTTP İstemcisi kullanarak Web Hizmetlerini Test Etme hakkındadır:
Bunda Eksiksiz API Testi Eğitim Serisi , Web Hizmetlerinin bir ağ üzerinden etkileşime giren istemci ve sunucu makineleri arasında bir iletişim aracı olarak davrandığını öğrendik. Hakkında her şeyi açıkladık POSTMAN Kullanarak API Testi önceki eğitimimizde.
Bu makalede, Apache HTTP İstemcisi kullanılarak Web Hizmetlerinin nasıl test edileceğini ve Web Hizmetleri üzerinde farklı CRUD işlemlerinin nasıl gerçekleştirileceğini vurgulayacağız. Arka uç testi için kullanılabilen farklı REST istemcisi türleri de tartışılacaktır.
Windows'ta ikili dosya nasıl açılır
Ne öğreneceksin:
Web Hizmeti Nedir?
Web Hizmetleri, HTTP protokollerinin yardımıyla bir ağ üzerinden etkileşime giren istemci ve sunucu makineleri arasında bir iletişim aracıdır. Web hizmetleri genellikle yerel olarak kurulmayan veya depolanmayan ancak bulutlarda veya bazı uzak sunucularda bulunan API'lerdir.
Web hizmetlerinin nasıl çalıştığını anlamak için aşağıdaki örneğe bakın.
MakeMyTrip ve Goibibo.com ünlü uçuş ve otel rezervasyon web sitelerinden bazılarıdır ve Indigo, Air India ve Etihad gibi farklı uçuş satıcıları mevcuttur.
Bir müşteri New York'tan Londra'ya bir uçuş rezervasyonu yapmak isterse, ya doğrudan uçuş satıcısı portalına göz atabilir ya da üçüncü taraf satıcılar aracılığıyla rezervasyon yapabilir. MakeMyTrip ve diğer rezervasyon siteleri gibi üçüncü taraf satıcılar aracılığıyla rezervasyon yapıyorlarsa, birkaç saniye içinde karşılaştıracaklar ve en düşük fiyat, uçuş süresi ve daha pek çok bilgi gibi uçuş ayrıntılarını sağlayan sonuçları gösterecekler.
Burada ortaya çıkan soru, saniyeler içinde bize bilgiyi tam olarak nasıl sağlıyorlar? Tam olarak ne yapıyorlar?
Kullanıcı arayüzünden, gerekli tüm bilgileri alırlar ve bir JSON veya XML dosyasında saklarlar ve API'lerini ifşa ederken bir kimlik doğrulama jetonuyla satıcı API'lerini çağırırlar ve buna karşılık, uçuş satıcısının sitesi, MakeMyTrip'e JSON / XML yanıtı gönderir ve alınan yanıtı dönüştürür ve ayrıntıları UI'de görüntüler.
Web Hizmetleri Türleri
İki tür web hizmeti vardır:
- SABUN API
- REST API
Aşağıdaki görüntüde listelendiği gibi bu iki web hizmeti arasındaki farkları görelim.
Web Hizmetinde JSON / XML Dosyaları
Bırakın S1 sistemi J2EE dilinde geri dönsün ve S2 sistemi .NET veya Python'da geri dönsün ve her iki teknolojinin de güvenlik endişesi nedeniyle birbirinden tamamen farklı olduğunu biliyoruz. O halde S2 sistemi kodu başka bir sistemle nasıl paylaşacak?
Dolayısıyla, S2 sistemi API'lerini iş mantığını açığa çıkarmadan S1 sistemine sunar ve S2 sistemi, sistemine erişmek için API adını, API URL'sini, API biçimini ve Kimlik Doğrulama anahtarını / Belirteç Anahtarını paylaşır. İki sistem arasında JSON veya XML dosyaları kullanılarak iletişim gerçekleşir.
Neden yalnızca JSON / XML dosyası?
JSON / XML dosyaları, veri toplayıcı oldukları için kullanılır. Herhangi bir özel bilgi, bunlar hafif olduğundan ve iki farklı arayüz / platform veya sistem arasında iletişim kurmak için standart dil olduklarından, JSON veya XML formatlarında saklanır.
Bu nedenle API, iki bağımsız sistem birbiriyle yerel olarak, sistem içinde veya ağ üzerinden etkileşimde bulunduğunda her zaman kullanılır.
REST İstemcisi Nedir?
REST Client, API'leri çağıran bir araçtır. API'leri çağırmak için UI olmadığında arka uç testinde kullanılır. Bazı popüler REST istemcileri Apache HTTP istemcisi, POSTMAN, SOAP UI, Swagger ve çok daha fazlasıdır.
Burada, bu makalede sadece Apache HTTP istemcisini tartışacağız ve sonraki makalelerimizde diğer farklı HTTP istemcilerini ele alacağız.
Eclipse'de Http İstemci Kurulumu
# 1) Eclipse'i açın ve yeni bir Maven Projesi oluşturun.

#iki) MAVEN tarafından sağlanan sahte paketleri silin, örn. 'Src / main / java' ve 'Src / test / java'

# 3) Pom.xml dosyasına gidin ve ihtiyacımız olmadığından JUnit bağımlılığını kaldırın.
# 4) Ardından, HTTP İstemci kitaplığı, HTTP Çekirdek kitaplığı, JSON Ayrıştırıcı kitaplığı, TestNG kitaplığı, Jackson-veri bağlama Kitaplığı gerekir.
# 5) Yukarıdaki bağımlılıkları (kitaplık) pom.xml dosyasına ekleyin.
HTTP İstemci kitaplığı:

HTTP Çekirdek kitaplığı:

JSON Parser kitaplığı:

TestNG kütüphanesi:

# 6) En son ve kararlı sürümleri indirin. Tam arka uç testi yaptığımız için projemize Selenium jar eklemeyeceğiz. Nihai pom.xml dosyası aşağıdaki resimde gösterildiği gibi görünür:

# 7) Ardından, API testiniz için bir çerçeve oluşturun
için) 'Com.qa.config' paketi oluşturun -> Bir 'config.properties' dosyası oluşturun ve tüm URL'leri saklayın.

b) Başka bir paket 'qa.com.base' oluşturun -> Tüm sınıflar için bir ana sınıf olacak bir 'testBase.java' sınıfı oluşturun. Tüm yöntemler tarafından kullanılacak ortak işlevleri içerir.
c) Başka bir paket 'com.qa.client' ve 'restClient.java' sınıfı oluşturun. Bu, GET, POST, DELETE, PUT çağrılarını getirmek için kod içerir.
d) Farklı kullanıcı özelliklerini tanımlayan başka bir paket 'com.qa.data' ve 'user.java' sınıfı oluşturun.

dır-dir) Son olarak, 'src / test / java' altında bir 'com.qa.Test' paketi oluşturun ve tüm GET, PUT, POST ve Delete yöntemlerini test etmek için bir ana yöntem ve işlevler belirtin.
f) Nihai çerçeve yapısı aşağıda gösterildiği gibi görünecektir:

g) Bu site tarafından sağlanan sahte API'yi kullanın REQ RES .
HTTP Yöntemleri veya CRUD İşlemleri
Otomatikleştirdiğimiz farklı HTTP yöntemlerini veya CRUD işlemlerini görelim.
Aşağıda listelenen işlemlere CRUD işlemleri denir:
- C : Oluştur (POST araması anlamına gelir)
- R : Al (GET çağrısı anlamına gelir)
- U : Güncelleme (PUT çağrısı anlamına gelir)
- D : Sil (Aramayı Sil anlamına gelir)
REST Web Hizmetlerinde Parametreler
REST Web Hizmetlerinde aşağıdaki parametreleri doğrulayın veya vurgulayın:
(i) URI: URI, URL + Yol parametresi ve sorgu parametresinin birleşimidir.
Misal: http://api.com/service/account/1
Buraya, api.com S2 sunucusunun URL'si, hizmet sahibi. Bu hizmette, hamil, hesap sınıf ve bu hesap sınıfından hesap = 1 yöntemini çağırır. Her aramada URI'yi geçiyoruz.
(ii) Yük: Sisteme beslediğimiz JSON / XML verileri.
(iii) Durum Kodu: Her yanıt için durum kodlarını alıyoruz.
Burada birkaç kod aşağıda listelenmiştir:
- 200: Tamam, her şey yolunda gidiyor.
- 201: POST çağrısı yaptığınızda veya yeni bir varlık oluşturduğunuzda başarıyla oluşturulmuştur.
- 400: Yük yanlış, son URL yanlış, hatalı istek gösteriyor.
- 404: Bir varlığı güncelleyin veya silin ve bu varlık kullanılamaz, ardından istek bulunamadı olarak sonuç alırız.
- 500: S2 sunucusunun çalışmadığını varsayalım, dahili bir sunucu hatası alıyoruz.
- 401: Doğrulama hatası
Tıklayın İşte tüm durum kodlarını almak için.
(iv) Başlıklar: Kimlik doğrulama belirteci, Kullanıcı kimliği / parolası, İçerik Türü vb. Gibi.
sql temel mülakat soruları ve cevapları pdf

Apache HTTP İstemcisi Kullanan CRUD İşlemleri
# 1) Çağrı Alın
GET Call işlemi nasıl davranır?
Çağrı Al, isteği gönderir ve yanıtı geri alır. Burada herhangi bir JSON veya yükü iletmiyoruz, URL'nin (uç nokta yol parametresi, sorgu parametresi) varsa başlık ile birlikte bulunduğu bir URI iletiyoruz.
java'da bir genel tür dizisi nasıl oluşturulur
GET Çağrı kodunu yazmadan önce aşağıdaki noktaları aklınızda bulundurun:
- GET yöntemine ihtiyacınız var
- O zaman bir URL'ye ihtiyacınız var
- Gönder düğmesine bastığınızda yanıtı alacaksınız. Ardından yanıtı saklayın.
- Durum kodu, başlıklara ihtiyacınız var.
GET çağrı yanıtını gösteren POSTMAN istemcisinin aşağıdaki ekran görüntüsüne bakın:

RestClient.java sınıfında,
(ben) URL'yi çağıracak ve yanıtı Başlık olmadan JSON nesnesi biçiminde alacak olan GET Yöntemini oluşturun.
package com.qa.Client; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import org.apache.http.Header; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.json.JSONException; import org.json.JSONObject; public class restClient { // create GET Method, which will call the URL and get the response in the form of JSON object without Header public CloseableHttpResponse getMethod(String Url) throws ClientProtocolException, IOException, JSONException{ /*Call HTTPClients class from HTTPClient library added in POM.xml. Call createDefault() method present in HTTPClients class, which will create a client connection. And this createDefault() method returns 'CloseableHttpClient' object which is an abstract class. And we are creating a reference to that abstract class */ CloseableHttpClient httpClient=HttpClients.createDefault(); /*create an object for HttpGet class, which is used for HTTP GET Request. And pass the URL which is to be loaded*/ HttpGet htttpGet = new HttpGet(Url); /*execute the HTTP GET Request, means it will hit the GET API call as we click SEND button from POSTMAN client. httpClient.execute() method returns the response 'CloseableHttpResponse' interface and store it in reference variable So the complete response is stored in CloseableHttpResponse And fetch all the details, in our test case/test method */ CloseableHttpResponse closeableHttpResponse = httpClient.execute(htttpGet); return closeableHttpResponse; } } (ii) 'Src / test / java' altında ana sınıf 'getAPITest.java' oluşturun
Çıktı
# 2) POST Çağrısı
POST Çağrısı bir hesap oluşturur veya yeni bir varlık oluşturur.
Misal - Ad, iş ve başlık gibi bu ayrıntıları JSON yüküne aktarın. S2 sunucusu, Oracle gibi bazı veritabanlarına bağlanacak ve Hesap tablosu adı verilen bir tablo adına sahip olacak. POST yöntemi, veri tabanında bir giriş oluşturur ve S2 sunucusu, bilgileri S1 istemcisine iletir. POST çağrısı işleminin her zaman yeni bir varlık oluşturmak için kullanıldığını unutmayın.

POST yönteminde, URL'yi ve yükü iletmemiz gerekir.
Java sınıfını JSON nesnesine değil Java nesnesine dönüştürmemiz gerektiğinden bu bağımlılığı indirin.

RestClient.java sınıfında,
(ben) URL'yi çağıracak ve yanıtı gönderecek olan POST Yöntemi oluşturun.
public class restClient { public CloseableHttpResponse POST(String url,String entityString,HashMap headermap) throwsClientProtocolException, IOException{ /*Call HTTPClients class from HTTPClient library added in POM.xml and createDefault() method present in HTTPClients class, which will create a client connection and this createDefault() method returns 'CloseableHttpClient' object which is an abstract class and we are creating reference to that abstract class */ CloseableHttpClient httpClient=HttpClients.createDefault(); /*create an object for HttpPost class, which is used for HTTP POST Request and pass the URL which is to be loaded */ HttpPost htttpPost = new HttpPost(url); /*define pay load, use setEnity method present in HTTPPOST class and pass the payload entity */ htttpPost.setEntity(new StringEntity(entityString)); //Create a for loop and iterate the hashmap, and store the header for(Map.Entry entry : headermap.entrySet()){ htttpPost.addHeader(entry.getKey(),entry.getValue()); } //Execute the POST request CloseableHttpResponse closeableHttpResponse = httpClient.execute(htttpPost); return closeableHttpResponse; } } (ii) 'Src / test / java' altında ana 'postAPI_Test.java' sınıfını oluşturun.
//Inherit testBase class public class postAPI_Test extends testBase { //Create global methods testBase testbase; String serviceURL; String apiURL; String URL; restClient restClient; HttpResponse closeableHttpResponse; // In before method call the properties file @BeforeMethod public void setUp() throws ClientProtocolException, IOException, JSONException{ //call the constructor of base class and execute the properties file testbase = new testBase(); serviceURL = prop.getProperty('URL'); apiURL = prop.getProperty('serviceURL'); URL = serviceURL+apiURL; } //Main method which calls the GET method @Test public void POSTAPITest() throws ClientProtocolException, IOException, JSONException{ restClient = new restClient(); //Pass the Request Header HashMap headrMap = new HashMap(); headrMap.put('Content-Type', 'application/json'); /*Use Jackson API for doing marshaling, means converting java to java object to JSON Object and vice versa Use ObjectMapper class */ ObjectMapper mapper = new ObjectMapper(); //Create object of Users class, expected users users user = new users('John','Manager'); //Convert java object 'user' to JSON Object using writeValue(), pass the path where to store the JSON file and the object to be converted */ mapper.writeValue(new File('.\data\users.json'), user ); //convert java object to json in string String userJsonString = mapper.writeValueAsString(user); System.out.println(userJsonString); //Call the POST Method closeableHttpResponse = restClient.POST(URL, userJsonString, headrMap); //Fetches status, header, and JSON response from CloseableHttpResponse //1.Fetch Status Code int statusCode = closeableHttpResponse.getStatusLine().getStatusCode();//Get the Status code System.out.println('Status Code --->' +statusCode); //Validate the status code using Assert class Assert.assertEquals(statusCode, response_Status_Code_201,'Status is not 200'); /*2.Fetch the JSON String use EntityUtils class and call to String method, where we have to pass entity and format entity is available in closeableHttpResponse and pass UTF-8 format because we want pure string so complete JSON will be stored in a String, so we need to convert an entire string into a JSON object */ String responseString = EntityUtils.toString(closeableHttpResponse.getEntity(), 'UTF-8'); /*as we added one JSON library, from that library call JSON class and pass the response string. So this JSON object converts the string into JSON */ JSONObject responseJson = new JSONObject(responseString); System.out.println('Response JSONfrom API --->'+responseJson); /*Convert JSON to java actual User Object we are getting */ users userResObj = mapper.readValue(responseString, users.class); Assert.assertTrue(user.getName().equals(userResObj.getName())); Assert.assertTrue(user.getJob().equals(userResObj.getJob()));} } Çıktı:
# 3) PUT Çağrı
PUT çağrısı işlemini kullanarak yeni bir varlık oluşturabilir ve mevcut bir varlığı güncelleyebilirsiniz.
RestClient.java sınıfında,
(ben) URL'yi çağıracak ve yanıtı güncelleyecek PUT Yöntemi oluşturun.
public class restClient { public CloseableHttpResponse PUT(String url,String entityString,HashMap headermap) throwsClientProtocolException, IOException{ /*Call HTTPClients class from HTTPClient library added in POM.xml. Call createDefault() method present in HTTPClients class, which will create a client connection and this createDefault() method returns 'CloseableHttpClient' object which is an abstract class and we are creating reference to that abstract class*/ CloseableHttpClient httpClient=HttpClients.createDefault(); /*create an object for HttpPut class, which is used for HTTP PUT Request and pass the URL which is to be loaded */ HttpPut htttpPut = new HttpPut(url); /*define pay load, use setEnity method present in HTTPPUT class and pass the payload entity */ htttpPut.setEntity(new StringEntity(entityString)); /*create a for loop, iterate and store the header */ for(Map.Entry entry : headermap.entrySet()){ htttpPut.addHeader(entry.getKey(),entry.getValue()); } //Execute the PUT request CloseableHttpResponse closeableHttpResponse = httpClient.execute(htttpPut); return closeableHttpResponse; } } (ii) 'Src / test / java' altında 'putAPI_Test.java' ana sınıfını oluşturun
//Inherit testBase class public class putAPI_Test extends testBase { //Create global methods testBase testbase; String serviceURL; String apiURL; String URL; restClient restClient; HttpResponse closeableHttpResponse; // in before method call the properties file @BeforeMethod public void setUp() throws ClientProtocolException, IOException, JSONException{ //Call the constructor of the base class and execute the properties file testbase = new testBase(); serviceURL = prop.getProperty('URL'); apiURL = prop.getProperty('serviceURL'); URL = serviceURL+apiURL; } //Main method which calls PUT method @Test public void PUTAPITest() throws ClientProtocolException, IOException, JSONException{ restClient = new restClient(); //Pass the Request Header HashMap headrMap = new HashMap(); headrMap.put('Content-Type', 'application/json'); /*use Jackson API, for doing marshaling means converting java to java object to JSON Object and vice versa, use ObjectMapper class */ ObjectMapper mapper = new ObjectMapper(); //Create object of Users class, new users users user = new users('JohnMarry Dicosta','HRManager'); /*Convert java object 'user' to JASON Object using writeValue() and pass the path where to store the JSON file and the object to be converted */ mapper.writeValue(new File('.\data\users.json'), user ); //convert java object - > JSON - >String String userJsonString = mapper.writeValueAsString(user); System.out.println(userJsonString); //Call the PUT Method closeableHttpResponse = restClient.PUT(URL, userJsonString, headrMap); /*fetch status, header, JSON response from CloseableHttpResponse Fetch Status Code */ int statusCode = closeableHttpResponse.getStatusLine().getStatusCode(); System.out.println('Status Code --->' +statusCode); //Validate the status code using Assert class Assert.assertEquals(statusCode, response_Status_Code_200,'Status is 200'); /*2.Fetch the JSON String, use EntityUtils class and call to String method where we have to pass entity and format entity is available in closeableHttpResponse and pass UTF-8 format because we want a pure string. So complete JSON will be stored in a String, so we need to convert an entire string into a JSON object */ String responseString = EntityUtils.toString(closeableHttpResponse.getEntity(), 'UTF-8'); /* From JSON library, call JSON class and pass the response string. This JSON object converts the string to JSON */ JSONObject responseJson = new JSONObject(responseString); System.out.println('Response JSONfrom API --->'+responseJson);} Çıktı

# 4) Çağrıyı Sil
Çağrı silme işlemi basittir, yani hesap kimliği-100'ü silin ve bilgileri bir JSON dosyasında iletin.
RestClient.java sınıfında,
(ben) URL'yi çağıracak ve kaydı silecek olan Silme Yöntemi oluşturun.
public CloseableHttpResponse Delete(String url) throws ClientProtocolException, IOException{ /*Call HTTPClients class from HTTPClient library added in POM.xml and createDefault() method present in HTTPClients class, which will create a client connection and this createDefault() method returns 'CloseableHttpClient' object which is an abstract class and we are creating reference to that abstract class */ CloseableHttpClient httpClient=HttpClients.createDefault(); /*create an object for HttpDelete class, which is used for HTTP Delete Request, and pass the URL to be loaded*/ HttpDelete htttpDelete = new HttpDelete(url); //execute Delete request CloseableHttpResponse closeableHttpResponse =httpClient.execute(htttpDelete); return closeableHttpResponse; } (ii) 'src / test / java' altında 'deleteAPI_Test.java' ana sınıfını oluşturun.
public class deleteAPI_Test extends testBase { //Create global methods testBase testbase; String serviceURL; String deleteuserUrl; String URL; restClient restClient; HttpResponse closeableHttpResponse; // In before method call the properties file @BeforeMethod public void setUp() throws ClientProtocolException, IOException, JSONException{ //call the constructor of the base class and execute the properties file testbase = new testBase(); serviceURL = prop.getProperty('URL'); deleteuserUrl = prop.getProperty('deleteuser'); URL = serviceURL+deleteuserUrl; } //The Main method which calls the Delete method @Test public void deleteAPI() throws ClientProtocolException, IOException, JSONException{ restClient = new restClient(); //Method returns closeableHttpResponse type closeableHttpResponse = restClient.Delete(URL); /*fetch status code, header, JSON response from CloseableHttpResponse -Fetch Status Code */ int statusCode = closeableHttpResponse.getStatusLine().getStatusCode(); System.out.println('Status Code --->' +statusCode); //Validate the status code using Assert class Assert.assertEquals(statusCode, response_Status_Code_204,'Status is 204 No Content'); } Çıktı

Herhangi bir yanıtı doğrulamadan önce geliştiriciden doğru URL'yi alın, ardından sunucudan beklenen yanıtı alıp almadığınızı kontrol edin, her bir senaryo için test senaryoları hazırlayın ve işlevselliğe göre test senaryoları düzenleyin.
Sonuç
Bu makalede, POST, PUT, GET ve Delete çağrılarını otomatikleştirmek için Apache HTTP İstemcisinin nasıl kullanılacağını kod örnekleriyle ayrıntılı olarak ele aldık. Ayrıca web hizmetleri türlerini ve JSON / XML dosyalarının önemini ve neden kullanıldıklarını da tartıştık.
Önerilen Kaynaklar
- Web Hizmetleri Eğitimi: Bileşenler, Mimari, Türler ve Örnekler
- 15+ SoapUI Öğreticisi: En İyi Web Hizmetleri API Test Aracı
- Amazon Web Services (AWS) Röportaj Soruları ve Cevapları
- En İyi 20 RESTful Web Hizmetleri Röportajı Soru ve Cevapları
- En İyi 25 Java Web Hizmetleri Mülakat Soruları ve Cevapları
- En İyi 45 Web Hizmetleri Mülakat Soruları ve Cevapları (RESTful, SOAP, Güvenlik soruları)
- LoadRunner VuGen Komut Dosyası Kullanarak Web Hizmetleri Performans Testi
- API Test Eğitimi: Yeni Başlayanlar İçin Tam Bir Kılavuz
