rest api testing with spring resttemplate
이 심층 자습서에서는 간단한 예제를 사용하여 Spring RestTemplate 및 TestNG로 REST API 테스트를 시작하는 방법을 설명합니다.
이 기사에서는 RestTemplate 및 TestNG 프레임 워크를 사용하여 REST API 테스트를 시작하는 방법을 살펴 봅니다.
RestTemplate 및 TestNG 프레임 워크를 사용하여 REST API 테스트를 탐색하기 전에 이와 관련된 몇 가지 기본 개념을 이해하겠습니다.
시작하자!!
학습 내용 :
- REST 란?
- JSON이란?
- REST API 테스트 란?
- TestNG 란?
- Spring REST 템플릿이란?
- REST API 테스트 단계
- Windows에서 TestNG 테스트 프레임 워크 설정
- 완전한 TestCRUD 파일 코드
- 결론
- 추천 도서
REST 란?
요즘 REST는 웹 서비스를 구축하는 데 매우 인기있는 선택이되었습니다. 예를 들어 , Google에는 캘린더와 같은 여러 REST 서비스가 있습니다. 지도 API 등
쉬다 즉 대표 국가 이전 소프트웨어 아키텍처 스타일입니다. 이 스타일에서는 제약 조건 집합이 정의되고 이러한 제약 조건을 충족하기 위해 빌드 된 웹 서비스가 필요합니다. REST 아키텍처 스타일을 따르는 이러한 웹 서비스를 RESTful 웹 서비스라고합니다.
“대표 국가 이전”이라는 용어는 로이 필딩 그의 Ph.D. REST의 기본 개념은 서버 측 개체를 생성하거나 삭제할 수있는 리소스로 취급하는 것입니다.
JSON이란?
JSON 즉 자바 스크립트 객체 표기법 REST 서비스에서 브라우저와 서버간에 데이터를 저장하고 교환하기 위해 매우 일반적으로 사용되는 구문입니다.
JSON의 가장 큰 장점은 가볍고 두 번째로 읽을 수있는 형식입니다. 데이터는 키 : 값 쌍 형식으로 저장됩니다. 예를 들어, {“name”:”Emp1 ″,”salary”:”3000 ″,”age”:”23 ″,”id”:”52686 ″}와 같은 JSON 형식으로 직원 데이터를 저장할 수 있습니다.
REST API 테스트 란?
REST API 테스트라고하면 기본적으로 각각 POST, GET, PUT, DELETE의 4 가지 주요 메소드를 사용하여 Resource에 대해 Create, Edit, Read, Delete 작업을 수행하여 API를 테스트하는 것입니다.
TestNG 란?
TestNG는 JUnit 및 NUnit에서 영감을받은 테스트 프레임 워크입니다. Java 프로그래밍 언어 용입니다. TestNG는 단위, 기능, 엔드-투-엔드, 통합 등과 같은 광범위한 테스트 범주를 다룹니다.
Apache 라이선스에 따라 제공되는 오픈 소스 프레임 워크입니다. 테스트 스크립트 개발을 가속화하는 풍부한 주석 세트를 제공합니다.
Spring REST 템플릿이란?
Spring RestTemplate 클래스는 Spring 3에서 소개 된 spring-web의 일부입니다.
RestTemplate 클래스는 GET, POST, PUT, DELETE 등과 같은 HTTP 메소드에 대해 오버로드 된 메소드를 제공하여 HTTP 기반의 편안한 웹 서비스를 테스트하는 매우 편리한 방법을 제공합니다. Spring 프레임 워크도 오픈 소스입니다.
REST API 테스트 단계
명확한 이해를 위해 몇 가지 예제와 함께 REST API 테스트에서 일반적으로 따르는 단계를 이해하겠습니다.
이 기사에서는 샘플 REST API 직원 서비스를 고려했습니다. 이 소스.
처음에는 POSTMAN 도구를 사용하여 수동으로 단계를 수행하겠습니다.
#1) 먼저 액세스하려는 API의 끝점을 알고 있어야합니다.
예를 들어, http://dummy.restapiexample.com/api/v1/create를 사용하여 새 직원 리소스 만들기
#두) HTTP 메서드에 필요한 경우 헤더 및 본문을 설정합니다.
이 예에서는 POST를 사용하여 새 리소스를 만들려고합니다. POST의 경우 요청 본문이 필요합니다.
따라서 본문을 다음과 같이 설정합니다.
“name”:”zozo100 ″,”salary”:”123 ″,”age”:”23 ″
동의하기 : 애플리케이션 / JSON 및 컨텐츠 타입 : 애플리케이션 / JSON.
ascii에서 int C ++로
#삼) 적절한 HTTP 메소드 (이 경우 POST)를 설정하십시오.
# 4) Rest 서비스 서버에 요청을 보냅니다.
# 5) 서버로부터 응답을받습니다.
POSTMAN 도구를 사용한 REST API 호출
# 6) 응답 코드의 도움으로 예상대로 응답을 확인하십시오. 예 : 성공으로 200 OK.
# 7) 필요한 경우 벤치 마크 파일과 비교하여 응답 본문을 예상대로 확인합니다.
이제 테스트 자동화 제품군에 대해 동일한 단계를 자동화해야합니다. 자동화에 필요한 설정부터 시작하겠습니다.
Windows에서 TestNG 테스트 프레임 워크 설정
# 1) 설치
- 테스트 스크립트 개발을 위해 Java를 사용할 것입니다. 그래서 먼저 다운로드 Windows 용 JDK 설치 프로그램 컴퓨터에 Java를 설치합니다.
- IDE (통합 개발 환경) : Automation Test Suite 개발을 위해 Eclipse를 IDE로 사용했습니다. 딸깍 하는 소리 여기 다운로드합니다.
- TestNG 용 Eclipse 플러그인 다운로드 : Eclipse 플러그인 용 TestNG를 실행하려면 Java 1.7 이상이 필요합니다. Eclipse 4.2 이상이 필요합니다. (참고: TestNG ). Eclipse에서 아래 단계를 따르십시오.
- 도움말 / 새 소프트웨어 설치를 선택합니다.
- 추가->를 클릭하십시오. http://beust.com/eclipse/ 입력
- URL 옆에있는 확인란을 선택하고 다음 버튼을 클릭합니다.
TestNG 설치
-
- 다음 화면이 나올 때까지 다음 버튼을 계속 클릭하십시오.
TestNG 설치 최종 화면
마지막으로 Apache 라이센스 계약에 동의하고 마침 버튼을 클릭하여 설치를 완료합니다.
플러그인 설치를 적용하려면 Eclipse를 다시 시작하십시오.
- 봄 항아리 : 이제 마지막으로 스프링 프레임 워크의 RestTemplate 클래스를 사용할 것입니다. 당신은 할 수 있습니다 봄 항아리 다운로드 로컬 폴더에 저장합니다. 예를 들어 ,C : / projectJar
- JSON-Simple Jars : JSON 구문 분석을 수행해야합니다. 이를 위해 가벼운 Json-simple API를 사용합니다. 따라서 Json-simple-1.1.jar을 C : / projectJar에 다운로드하십시오.
이제 필요한 설치를 완료했습니다. 이제 테스트 자동화 프로젝트를 만들어 보겠습니다.
# 2) 프로젝트 설정
- 파일 만들기-> 새로 만들기-> Java 프로젝트-> 이름을‘ EmployeeTestSuite '.
- 이제 새 Java 패키지를 만듭니다. com.demo :
- 빌드 경로 구성 :
- 이전 섹션에서 보았 듯이 TestNG를 설치하고 spring 및 JSON 간단한 jar를 다운로드했습니다. 이제 프로젝트에 빌드 경로를 추가하여이를 소비해야합니다. 이를 위해 lib 폴더 EmployeeTestSuite 폴더를 열고 이제 C : / projectJar의 모든 jar를 lib 폴더.
- ‘ EmployeeTestSuite’’ -> 빌드 경로-> 빌드 경로 구성.
- 클릭 lib 탭.
- 클릭 라이브러리 추가 버튼-> TestNG를 선택합니다. 그러면 빌드 경로에 TestNG가 추가됩니다.
- 클릭 병 추가 버튼-> lib에서 모든 jar를 선택하십시오. 그러면 프로젝트 빌드 경로에 모든 스프링 jar와 JSON 간단한 jar가 추가됩니다.
자바 빌드 경로
이제 Eclipse 패키지 탐색기에 프로젝트 구조가 다음과 같이 표시됩니다.
패키지 구조
# 3) 테스트 클래스
CRUD (Create-Read-Update-Delete) 작업을 처리 할 수있는 테스트 클래스를 만들어야합니다.
새 클래스 파일-> 새로 만들기-> TestNG 클래스를 만들고 이름을 TestCRUD.java로 지정합니다.
# 4) 테스트 방법
별도의 테스트 방법을 만들어 보겠습니다.
- addEmployee () : HTTP POST 메서드를 사용하여 Create API를 테스트하는 테스트 메서드입니다.
- getEmployee () : HTTP GET 메서드를 사용하여 Read API를 테스트하는 테스트 메서드입니다.
- updateEmployee () : HTTP PUT 메서드를 사용하여 업데이트 API를 테스트하는 테스트 메서드입니다.
- deleteEmployee () : HTTP DELETE 메서드를 사용하여 Delete API를 테스트하는 테스트 메서드입니다.
TestNG 프레임 워크에 의해 테스트 메소드로 식별되도록 TestNG의 @Test 어노테이션으로 만 테스트 메소드를 Java 메소드로 생성 할 수 있습니다.
예를 들어,다음은 addEmployee 테스트 메서드입니다.
자바 배열을 메소드에 전달
@Test public void addEmployee () {}
이 예에서는 샘플 REST 서비스.
이제 POST 호출을 자동화하겠습니다. 이를 위해 'REST API 테스트 단계'섹션에서 하나씩 수동으로 수행 한 단계로 코드를 매핑해야합니다.
#1) 먼저 액세스하려는 API의 끝점을 알고 있습니다.
String addURI = 'http://dummy.restapiexample.com/api/v1/create';
#두) HTTP 메서드에 대한 헤더를 설정합니다.
HttpHeaders headers = new HttpHeaders();
// 헤더 추가
headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json');
HTTP 메서드의 본문을 설정합니다.
String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}';
// 본문과 헤더를 설정하여 HttpEntity 개체를 만듭니다.
HttpEntity entity = new HttpEntity(jsonBody, headers);
하나의 명세서에서 다음 단계가 자동화됩니다.
#삼) 적절한 HTTP 메소드 (이 경우 POST)를 설정하십시오.
# 4) RESTful 서비스 서버에 요청을 보냅니다.
# 5) 서버로부터 응답을받습니다.
RestTemplate restTemplate = new RestTemplate(); ResponseEntity response =restTemplate.postForEntity(addURI, entity, String.class);
우리는 사용하고 있습니다 postForEntity POST 메서드를 서버로 보냅니다. 서버 ResponseEntity 객체로부터 응답을받습니다.
# 6) 응답 코드의 도움으로 예상대로 응답을 확인하십시오.
Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
여기서는 TestNG의 Assert 도구 클래스를 사용하여 실제 값 (예 : response.getStatusCode ())과 예상 값 HttpStatus.OK를 비교하는 상태 코드 assertEquals 메서드를 확인합니다.
그러나 여기서는 추가 된 직원이 응답 본문에 있는지 여부를 확인하는 등 한 번 더 확인합니다.
Assert.assertTrue(responseBody.contains(employeeId));
employeeId는 어떻게 얻었습니까?
이를 위해 JSON 파서 API, 즉 Json-simple의 도움을 받고 있습니다.
직원 REST 서비스에서 클라이언트와 서버간에 데이터를 저장하고 교환하는 데 JSON 형식이 사용되므로 JSON 파서를 사용하고 있습니다. 앞서 언급했듯이 JSON 데이터는 핵심 가치 체재. 여기에서 우리는 '신분증' 값.
다음과 같이 응답 본문을 구문 분석하여 얻을 수 있습니다.
JSONParser parser = new JSONParser(); // Instantiate JSONParser object JSONObject jsonResponseObject = new (JSONObject) parser.parse(jsonString); //Parse jsonString i.e. Response body string in json format to JSON object String employeeId = jsonResponseObject.get('id').toString(); // Get id attribute
그래서 이것은 Create 메서드 테스트에 관한 것입니다.
업데이트, 가져 오기 및 삭제 방법
- 별도의 테스트 방법을 만들고 해당하는 경우 헤더를 설정합니다.
- 상태 코드 확인도 비슷하게 수행됩니다.
- 주요 차이점은 서버에 요청을 보내는 방법입니다.
다음 방법을 사용할 수 있습니다.
# 1) 직원 업데이트 : HTTP PUT 요청입니다. 사용할 수있는 RestTemplate PUT 메서드는 다음과 같습니다.
public void put(String url,Object request, Object... urlVariables) throws RestClientException
# 2) 직원 구하기 : HTTP GET 요청입니다. 사용할 수있는 RestTemplate GET 메서드는 다음과 같습니다.
public ResponseEntity getForEntity(String url, Class responseType, Object... urlVariables) throws RestClientException
# 3) 직원 리소스 삭제 : HTTP DELETE 요청입니다. 사용할 수있는 RestTemplate DELETE 메서드는 다음과 같습니다.
public void delete(String url, Object... urlVariables) throws RestClientException
이러한 메서드 외에도 exchange () 및 execute () 유용한 메서드가 있습니다.
예를 들어, 눈치 채면 Delete 메서드는 무효입니다. 그러나 응답 본문을 확인하려면 메서드 실행에서 다시 응답해야합니다. 이를 위해 ResponseEntity를 반환하는 exchange () 메서드를 사용할 수 있습니다. 참조 스프링 프레임 워크 상세 사항은.
# 5) 테스트 실행
이제 테스트 스크립트 개발 작업을 완료 했으므로 테스트를 실행 해 보겠습니다. 그냥 오른쪽 클릭 TestCRUD.java 옵션을 선택하십시오 'TestNG 테스트로 실행' .
다음과 같이 테스트 실행 결과가 표시됩니다.
콘솔 출력
노트 : 테스트 스위트를 정의 할 수 있습니다. testng.xml 파일도 있습니다. 이 예에서는 테스트 스크립트가 하나뿐입니다. 하지만 실제 시나리오에서는 항상 여러 스크립트의 모음입니다.
따라서 testg.xml 파일은 다음과 같습니다.
# 6) 보고서
콘솔에서 결과를 확인했습니다. 그러나 TestNG는 이해 관계자와 공유 할 수있는보다보기 쉬운 html 형식으로 테스트 결과를 제공합니다. 열다 테스트 출력 -> emailable-report.html 브라우저에서.
다음과 같이 테스트 보고서가 표시됩니다. 보고서 페이지에서 테스트 이름을 TestCRUD로 볼 수 있으며, 여러 테스트를 통과했습니다. 예 : 4, 건너 뛴 횟수 및 실패 횟수 (이 경우 0). 또한 각 테스트 메서드 실행에 필요한 총 시간을 보여줍니다.
Html 형식의 테스트 결과
완전한 TestCRUD 파일 코드
package com.demo; import java.io.IOException; import java.text.ParseException; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import org.testng.Assert; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import org.testng.log4testng.Logger; /** * This test class has test methods for CRUD actions on REST API * REST Service http://dummy.restapiexample.com/api * * It has test methods for Create , Edit , Get and Delete Employee items * https://docs.spring.io/spring-framework/docs/current/javadoc- api/org/springframework/web/client/RestTemplate.html * https://docs.spring.io/autorepo/docs/spring/3.2.3.RELEASE/javadoc- api/org/springframework/web/client/RestTemplate.html * @author * */ public class TestCRUD { private String responseBody; public String responseBodyPOST; final static Logger logger = Logger.getLogger(TestCRUD.class); //RESTTemplate Object private RestTemplate restTemplate; //Employee ID private String employeeId; // Create Response Entity - Stores HTTPStatus Code, Response Body, etc private ResponseEntity response; @BeforeTest public void beforeTest() throws IOException, ParseException { logger.info('Setting up prerequisite for test execution'); logger.info('Creating RestTemplate object before tests'); this.restTemplate = new RestTemplate(); } /** * Test Method to add employee using HTTP POST request * * Verifies POST action Status Code * * @throws IOException * @throws ParseException */ @Test public void addEmployee() throws IOException, ParseException { String addURI = 'http://dummy.restapiexample.com/api/v1/create'; HttpHeaders headers = new HttpHeaders(); headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json'); logger.info('Add URL :'+addURI); String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}'; System.out.println('
' + jsonBody); HttpEntity entity = new HttpEntity(jsonBody, headers); //POST Method to Add New Employee response = this.restTemplate.postForEntity(addURI, entity, String.class); responseBodyPOST = response.getBody(); // Write response to file responseBody = response.getBody().toString(); System.out.println('responseBody --->' + responseBody); // Get ID from the Response object employeeId = getEmpIdFromResponse(responseBody); System.out.println('empId is :' + employeeId); // Check if the added Employee is present in the response body. Assert.assertTrue(responseBody.contains(employeeId)); // System.out.println(propertyFile.get('EmployeeAddResBody')); // Check if the status code is 201 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee is Added successfully employeeId:'+employeeId); } /** * Method to get Employee ID from REsponse body * I have used Json Simple API for Parsing the JSON object * * @param json * @return */ public static String getEmpIdFromResponse(String json) { JSONParser parser = new JSONParser(); JSONObject jsonResponseObject = new JSONObject(); Object obj = new Object(); try { obj = parser.parse(json); } catch (org.json.simple.parser.ParseException e) { e.printStackTrace(); } jsonResponseObject = (JSONObject) obj; String id = jsonResponseObject.get('id').toString(); return id; } /** * Test Method to Update employee using HTTP PUT request * * Verifies PUT action Status Code * Verifies Updated Name exists in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'addEmployee', enabled = true) public void updateEmployee() throws IOException, ParseException { String updateURI = 'http://dummy.restapiexample.com/api/v1/update/'+employeeId; logger.info('Update URL :'+updateURI); String jsonBody = responseBodyPOST; jsonBody = jsonBody.replace('zozo100', 'update_zozo100'); HttpHeaders headers = new HttpHeaders(); headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json'); HttpEntity entity = new HttpEntity(jsonBody, headers); //PUT Method to Update the existing Employee //NOTE that I have Not used restTemplate.put as it's void and we need response for verification response = restTemplate.exchange(updateURI, HttpMethod.PUT, entity, String.class); responseBody = response.getBody().toString(); System.out.println('Update Response Body :'+responseBody); // Check if the updated Employee is present in the response body. Assert.assertTrue(responseBody.contains('update_zozo100')); // Check if the status code is 200 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee Name is Updated successfully employeeId:'+employeeId); } /** * Test Method to Get employee using HTTP GET request * * Verifies GET action Status Code * Verifies Name exists in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'updateEmployee', enabled = true) void getEmployee() throws IOException, ParseException { String getURI = 'http://dummy.restapiexample.com/api/v1/employee/'+this.employeeId; logger.info('Get URL :'+getURI); HttpHeaders headers = new HttpHeaders(); HttpEntity entity = new HttpEntity(headers); //GET Method to Get existing Employee response = restTemplate.getForEntity(getURI,String.class); // Write response to file responseBody = response.getBody().toString(); //Suppressing for log diffs System.out.println('GET Response Body :'+responseBody); // Check if the added Employee ID is present in the response body. Assert.assertTrue(responseBody.contains('update_zozo100')); // Check if the status code is 200 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee is retrieved successfully employeeId:'+employeeId); } /** * Test Method to Delete employee using HTTP DELETE request * * Verifies DELETE action Status Code * Verifies Success Message Text in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'getEmployee', enabled = true) public void deleteEmployee() throws IOException, ParseException { String delURI = 'http://dummy.restapiexample.com/api/v1/delete/'+this.employeeId; HttpHeaders headers = new HttpHeaders(); HttpEntity entity = new HttpEntity(headers); //DELETE Method to Delete existing Employee response = restTemplate.exchange(delURI, HttpMethod.DELETE, entity, String.class); // Check if the status code is 204 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); responseBody = response.getBody(); Assert.assertEquals(getMessageFromResponse(responseBody), 'successfully! deleted Records'); logger.info('Employee is Deleted successfully employeeId:'+employeeId); } /** * Gets 'text' key value from Response body text for verification * I have used Json Simple API for Parsing the JSON object * * @param json * @return text string */ public static String getMessageFromResponse(String json) { String successMessageText = null; try { JSONParser parser = new JSONParser(); JSONObject jsonResponseObject = new JSONObject(); jsonResponseObject = (JSONObject) (parser.parse(json)); String successMessage = jsonResponseObject.get('success').toString(); jsonResponseObject = (JSONObject) (parser.parse(successMessage)); successMessageText = jsonResponseObject.get('text').toString(); } catch (org.json.simple.parser.ParseException e) { e.printStackTrace(); } return successMessageText; } @AfterTest public void afterTest() { logger.info('Clean up after test execution'); logger.info('Creating RestTemplate object as Null'); this.restTemplate = new RestTemplate(); } }
결론
아래에이 기사의 학습 결과를 요약했습니다. 처음부터 REST API 테스트 자동화 프레임 워크를 설정하는 모든 단계를 보았습니다.
여기에서 우리는 다음을 배웠습니다.
- 테스트 자동화를 위해 프로그래밍 언어로 Java를 선택했습니다.
- @Test와 같은 TestNG 주석을 사용하는 테스트 스크립트를 만들기위한 테스트 프레임 워크로 TestNG를 선택했습니다.
- 실제 HTTP 요청을 서버로 보내기 위해 Spring 프레임 워크 RestTemplate 클래스를 사용했습니다.
- 이러한 API를 사용하기 위해 TestNG를 설치하고 파서 API 용 Spring jar 및 Json-simple jar를 다운로드했습니다.
- 마지막으로 Test 클래스를 실행하고 콘솔에서 결과를 확인하고 더보기 쉽고 읽기 쉬운 HTML 형식으로 확인했습니다.
간단히 말해서이 기사에서는 Spring RestTemplate을 사용하여 REST API 테스트 자동화를 시작하는 방법을 배웠습니다. 모든 필수 소프트웨어 설치, 프로젝트 설정, 테스트 스크립트 개발부터 테스트 실행까지 테스트 자동화 프레임 워크 설정 및 생성 된 보고서보기에 대해 설명했습니다.
이는 자동화 QA가 테스트 자동화 프레임 워크를 시작하기에 충분합니다. 그러나 각각에서 필요한 부분 만 보았습니다. 예를 들어 TestNG 설치, @Test 주석을 사용한 테스트 방법, 보고서를 사용했습니다. 그러나 TestNG는 데이터 기반 테스트 등을 위해 DataProvider와 같은 더 많은 기능을 제공합니다.
Spring RestTemplate으로 REST API 테스트 자동화를 시작할 준비가 되셨습니까?