Учебники

Тестирование клиента REST

В этом уроке REST вы узнаете:

Прежде чем узнать о тестировании клиента Restito Framework для REST, давайте сначала изучим некоторые основы.

Что такое REST Client?

Клиент REST — это метод или инструмент для вызова API службы REST, который предоставляется для связи любой системой или поставщиком услуг. Например: если API подвергается получению в Google информации о трафике в режиме реального времени от Google, программное обеспечение / инструмент, который вызывает API трафика Google, называется клиентом REST.

Что такое REST Server?

Это метод или API, которые доступны для связи любой системой или поставщиком услуг. Например, Google предоставляет API для получения информации о трафике в реальном времени по заданному маршруту.

Здесь сервер Google должен быть запущен и работать для прослушивания любых запросов к выставленному API от разных клиентов.

Пример:

Настало время создать полный сквозной сценарий из приведенных выше определений.

Давайте рассмотрим приложения для бронирования такси, такие как Uber, поскольку компании требуется информация в реальном времени о ситуации на дорогах вокруг маршрутов, на которых находится данное транспортное средство.

Отдых Клиента:

Здесь клиент — мобильное приложение Uber, в которое вошел драйвер. Это приложение отправляет запрос в API REST, предоставляемый картами Google, для получения данных в реальном времени. Например, запрос HTTP GET.

Сервер отдыха:

В этом примере Google является поставщиком услуг, а API карт Google отвечает необходимыми подробностями на запрос приложения Uber.

И клиент, и сервер одинаково важны для связи REST.

Здесь мы реализовали примеры для автоматизации тестирования только клиента REST. Для тестирования сервера REST обратитесь к https://www.guru99.com/top-6-api-testing-tool.html .

Что такое Рестито?

Restito — это фреймворк, разработанный Mkotsur. Это легкое приложение, которое поможет вам выполнить любой запрос HTTP. Вы можете использовать Restito для тестирования ваших REST API и поиска проблем в вашем приложении или вашей сети.

Как протестировать REST-клиент с помощью Restito?

Давайте разделим упражнение на следующие 4 шага:

  1. Создайте HTTP-клиента и метод для отправки HTTP-запроса GET на любую конечную точку сервера. Пока что конечной точкой считается http: // localhost: 9092 / getevents.
  1. Запустите сервер Restito для прослушивания и захвата запросов, отправленных конечной точке ‘getevents’ по адресу localhost http: // localhost: 9092 / getevents .
  1. Создайте тестовый класс для тестирования вышеуказанного клиента. Вызвать метод HTTP-клиента «sendGETRequest», чтобы инициировать GET-запрос к API «getevents».
  1. Проверьте HTTP-вызов GET с помощью среды Restito.

Давайте углубимся в каждый из вышеперечисленных шагов.

Шаг 1) Создайте HTTP-клиента и метод для отправки HTTP-запроса GET на любую конечную точку сервера.

========== JAVA CODE начинается ===========

package com.chamlabs.restfulservices.client;

import java.util.HashMap;
import 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;

/**
 * This class creates a HTTP Client and has a method to send HTTP GET request: 
 * 		sendGETRequest(..)
 */
public class RestClient {
	/**
	 * Constructor for the  class RestClient	
	 */
	public RestClient() {
		System.out.println("Creating RestClient constructor");
	}

	/**
	 * Method to Send GET request to http://localhost:<<port>>/getevents
	 * @param port
	 * @return true if GET request is successfully sent. False, otherwise.
	 */
	public static boolean sendGETRequest(int port) {
		try {
			HttpClient client = HttpClientBuilder.create().build();
			HttpGet getRequest = new HttpGet("http://localhost:" + port + "/getevents");
			//HttpResponse response = client.execute(request);
			client.execute(getRequest);
			System.out.println("HTTP request is sent successfully."
					+ "Returning True");
			return true;
		} 
		
		catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("Some exception has occurred during the HTTP Client creation."
				+ "Returning false");
		return false;
	}
}

========== Заканчивается JAVA CODE ===========

Шаг 2) Запустите сервер Restito для прослушивания и захвата запросов, отправленных конечной точке «getevents» в localhost http: // localhost: 9092 / getevents .

========== JAVA CODE начинается ===========

package com.chamlabs.restfultesting.util;

import static com.xebialabs.restito.builder.stub.StubHttp.whenHttp;
import static com.xebialabs.restito.semantics.Action.status;
import static com.xebialabs.restito.semantics.Condition.get;
import static com.xebialabs.restito.semantics.Condition.post;
import java.util.List;
import org.glassfish.grizzly.http.util.HttpStatus;
import com.xebialabs.restito.semantics.Call;
import com.xebialabs.restito.server.StubServer;

/**
 * This utility class contains several utility methods like : 
 * 		restartRestitoServerForGETRequests(..)
 * 		restartRestitoServerForPOSTRequests(..) 
 * 		waitAndGetCallList(..)
 * 
 * @author cham6
 * @email: paperplanes.chandra@gmail.com
 * @fork: https://github.com/cham6/restfultesting.git
 *
 */
public class TestUtil {
	
	/**
	 * Utility method to start restito stub server to accept GET requests
	 * @param server
	 * @param port
	 * @param status
	 */
	public static void restartRestitoServerForGETRequests (StubServer server, int port, HttpStatus status)
    {
        // Kill the restito server
        if (server != null) {
            server.stop();
        }
        // Initialize and configure a newer instance of the stub server
        server = new StubServer(port).run();
        whenHttp(server).match(get("/getevents")).then(status(status));
    }
	
	/**
	 * Utility method to start restito stub server to accept POST requests
	 * @param server
	 * @param port
	 * @param status
	 */
	public static void restartRestitoServerForPOSTRequests (StubServer server, int port, HttpStatus status)
    {
        // Kill the restito server
        if (server != null) {
            server.stop();
        }
        // Initialize and configure a newer instance of the stub server
        server = new StubServer(port).run();
        whenHttp(server).match(post("/postevents")).then(status(status));
    }
	
	/**
     * For a given restito stub server, loop for the given amount of seconds and
     * break and return the call list from server.
     * 
     * @param server
     * @param waitTimeInSeconds
     * @return
     * @throws InterruptedException
     */
	public static List<Call> waitAndGetCallList (StubServer server, int waitTimeInSeconds)
        throws InterruptedException
    {
        int timeoutCount = 0;
        List<Call> callList = server.getCalls();
        while (callList.isEmpty()) {
            Thread.sleep(1000);
            timeoutCount++;
            if (timeoutCount >= waitTimeInSeconds) {
                break;
            }
            callList = server.getCalls();
        }
        // Wait for 2 seconds to get all the calls into callList to Eliminate any falkyness.
        Thread.sleep(2000);
        return server.getCalls();
    }


}

========== Заканчивается JAVA CODE ===========

Шаг 3) Создайте тестовый класс для тестирования вышеуказанного клиента. Вызвать метод HTTP-клиента sendGETRequest, чтобы инициировать GET-запрос к API «getevents».

========== JAVA CODE начинается ===========

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;
import static org.glassfish.grizzly.http.util.HttpStatus.ACCEPTED_202;
import org.json.JSONObject;
import java.util.List;
import java.util.Map;

/**
 * This class contains several junit tests to validate the RestClient operations like: 
 * 		sendRequest(..)
 * 		sendRequestWithCustomHeaders(..) 
 * 		sendPOSTRequestWithJSONBody(..)
 *
 */

public class RestClientTester extends TestCase {
	
    private static final Integer PORT = 9098;
    private static final Integer PORT2 = 9099;
    private static final Integer PORT3 = 9097;
	
    public RestClientTester() {
    	System.out.println("Starting the test RestClientTester");
    }
    /**
     * Junit test to validate the GET request from RestClient
     * Steps:
     * 		1) Create a stub server using Restito framework and configure it to listen on given port
     * 		2) Invoke the sendGETRequest(..) method of RestClient
     * 		3) Restito captures the matching GET requests sent, if any.
     * 		4) Validate if Restito has captured any GET requests on given endpoint
     * Expected Behavior:
     * 		> Restito should have captured GET request and it should have captured only one GET request.
     * Finally:
     * 		> Stop the stub server started using restito.
     */
	public void testGETRequestFromClient() {
		
		StubServer server = null;
		try {
		//This will start the stub server on 'PORT' and responds with HTTP 202 'ACCEPTED_202'
		TestUtil.restartRestitoServerForGETRequests(server, PORT, ACCEPTED_202);
		
		RestClient.sendGETRequest(PORT);
		
		List<Call> callList = TestUtil.waitAndGetCallList(server, 30);
		assertTrue("GET request is not received from the RestClient. Test failed.", 
				(callList != null) && (callList.size() == 1));
		}
		catch(Exception e) {
			e.printStackTrace();
			fail("Test Failed due to exception : " + e);
		}
		finally {
			if(server != null) {
				server.stop();
            }
		}	
	}

========== Заканчивается JAVA CODE ===========

Шаг 4) Как проверить GET-запрос с заголовками и POST-запрос с телом, используя среду Restito.

========== JAVA CODE начинается ===========

	/**
     * Junit test to validate the GET request with headers from RestClient
     * Steps:
     * 		1) Create a stub server using Restito framework and configure it to listen on given port
     * 		2) Invoke the sendGETRequestWithCustomHeaders(..) method of RestClient
     * 		3) Restito captures the matching GET requests sent, if any. 
     * 		4) Validate if Restito has captured any GET requests on a given endpoint
     * Expected Behavior:
     * 		> Restito should have captured GET request, and it should have captured only one GET request.
     * 		> Get the headers of the captured GET request 
     * 		  and make sure the headers match to the ones configured.
     * Finally:
     * 		> Stop the stub server started using restito.
     */

public void testGETRequestWithHeadersFromClient() {
		StubServer server = null;
		
		try {
		//This will start the stub server on 'PORT' and responds with HTTP 202 'ACCEPTED_202'
			TestUtil.restartRestitoServerForGETRequests(server, PORT2, ACCEPTED_202);
		
		RestClient.sendGETRequestWithCustomHeaders(PORT2);
		
		List<Call> callList = TestUtil.waitAndGetCallList(server, 30);
		assertTrue("GET request is not received from the RestClient. Test failed.", 
				(callList != null) && (callList.size() == 1));
		
		//Validate the headers of the GET request from REST Client
		Map<String, List<String>> headersFromRequest = callList.get(0).getHeaders();
		assertTrue("GET request contains header Accept and its value ",
				headersFromRequest.get("Accept").contains("text/html"));
		assertTrue("GET request contains header Authorization and its value ",
				headersFromRequest.get("Authorization").contains("Bearer 1234567890qwertyuiop"));
		assertTrue("GET request contains header Cache-Control and its value ",
				headersFromRequest.get("Cache-Control").contains("no-cache"));
		assertTrue("GET request contains header Connection and its value ",
				headersFromRequest.get("Connection").contains("keep-alive"));
		assertTrue("GET request contains header Content-Type and its value ",
				headersFromRequest.get("Content-Type").contains("application/json"));
		}
		catch(Exception e) {
			e.printStackTrace();
			fail("Test Failed due to exception : " + e);
		}
		finally {
			if(server != null) {
				server.stop();
            }
		}
	}
/**
     * Junit test to validate the POST request with body and headers from RestClient
     * Steps:
     * 		1) Create a stub server using Restito framework and configure it to listen on given port
     * 		2) Invoke the sendPOSTRequestWithJSONBody(..) method of RestClient
     * 		3) Restito captures the matching POST requests sent, if any.
     * 		4) Validate if Restito has captured any POST requests on given endpoint
     * Expected Behavior:
     * 		> Restito should have captured POST request and it should have captured only one POST request.
     * 		> Get the body of the captured POST request and validate the JSON values
     * Finally:
     * 		> Stop the stub server started using restito.
	 */

public void testPOSTRequestWithJSONBody() {
		StubServer server = null;
		
		try {
		//This will start the stub server on 'PORT' and responds with HTTP 202 'ACCEPTED_202'
			TestUtil.restartRestitoServerForPOSTRequests(server, PORT3, ACCEPTED_202);
		
		RestClient.sendPOSTRequestWithJSONBody(PORT3);
		
		List<Call> callList = TestUtil.waitAndGetCallList(server, 30);
		assertTrue("POST request is not received from the RestClient. Test failed.", 
				(callList != null) && (callList.size() == 1));
		
		//Validate the headers of the GET request from REST Client
		
		String requestBody = callList.get(0).getPostBody();
		JSONObject postRequestJSON = new JSONObject(requestBody);
		assertTrue("The timeUpdated in json is incorrect",
				postRequestJSON.get("timeUpdated").toString().equalsIgnoreCase("1535703838478"));
		assertTrue("The access_token in json is incorrect",
				postRequestJSON.get("access_token").toString().
				equalsIgnoreCase("abf8714d-73a3-42ab-9df8-d13fcb92a1d8"));
		assertTrue("The refresh_token in json is incorrect",
				postRequestJSON.get("refresh_token").toString().
				equalsIgnoreCase("d5a5ab08-c200-421d-ad46-2e89c2f566f5"));
		assertTrue("The token_type in json is incorrect",
				postRequestJSON.get("token_type").toString().equalsIgnoreCase("bearer"));
		assertTrue("The expires_in in json is incorrect",
				postRequestJSON.get("expires_in").toString().equalsIgnoreCase("1024"));
		assertTrue("The scope in json is incorrect",
				postRequestJSON.get("scope").toString().equalsIgnoreCase(""));
		}
		catch(Exception e) {
			e.printStackTrace();
			fail("Test Failed due to exception : " + e);
		}
		finally {
			if(server != null) {
				server.stop();
            }
		}
	}
}

========== Заканчивается JAVA CODE ===========

Преимущества использования Restito Framework для тестирования клиента REST

Вот преимущества и преимущества Restito Framework для тестирования клиентов ReST

  • Нам не нужно разрабатывать реальный сервер REST для тестирования клиента REST.
  • Restito предоставляет мощные и разнообразные утилиты и методы для имитации различного поведения Сервера. Например: проверить, как ведет себя клиент REST, когда сервер отвечает ошибкой HTTP 404 или ошибкой HTTP 503.
  • Серверы Restito могут быть установлены за несколько миллисекунд и могут быть остановлены после завершения тестов.
  • Restito поддерживает все типы содержимого метода HTTP, такие как сжатый, несжатый, унифицированный, приложение / текст, приложение / JSON и т. Д.

Недостатки использования Restito Framework для тестирования клиента REST

Вот минусы и недостатки Restito Framework для тестирования клиентов ReST

  • Исходный клиент REST должен быть настроен так, чтобы рассматривать localhost как сервер.
  • Открытие сервера в любом порту может привести к конфликту, если мы используем какой-либо обычно используемый порт, например, «8080» или «9443» и т. Д.
  • Рекомендуется использовать порты, такие как 9092 или 9099, которые обычно не используются другими инструментами.

Резюме:

  • REST означает «REpresentational State Transfer», который является новым стандартным способом связи между любыми двумя системами в данный момент времени.
  • Клиент REST — это метод или инструмент для вызова API службы REST, который доступен для связи любой системой или поставщиком услуг.
  • В методе RestServer или API, который предоставляется для связи любой системой или поставщиком услуг.
  • Restito — это легкое приложение, которое поможет вам выполнить любой запрос HTTP
  • Создайте HTTP-клиента и метод для отправки HTTP-запроса GET на любую конечную точку сервера.
  • Запустите сервер Restito, чтобы прослушивать и перехватывать запросы, отправленные конечной точке «getevents».
  • Запустите сервер Restito для прослушивания и захвата запросов, отправленных конечной точке ‘getevents’ в localhost
  • Здесь мы реализовали примеры для автоматизации тестирования только клиента REST.
  • Нам не нужно разрабатывать реальный сервер REST для тестирования клиента REST.
  • Исходный клиент REST должен быть настроен так, чтобы рассматривать localhost как сервер.

Эта статья предоставлена ​​Чандрасекаром Муттинени