일회성 업무를 위한 API 자동화 툴 분석(feat. Postman, Jmeter, RestAssured)
3줄 요약
- 10,000건의 기업의 사업자번호를 API 조회해야 하는 상황(csv 파일로 존재)
- Postman, Jmeter, RestAssured를 통해 해결 가능
- Postman(Javascript)나 RestAssured(Java) 추천, Jmeter는 비추(부하 테스트를 위한 툴이기 때문)
배경 설명
사업자번호로 외부 기업평가 API를 호출해서 자사 DB에 담는 작업을 수행해야 했습니다. 사업자번호 10,000개를 조회해야 하는 상황이어서 하나하나 기입하기에는 무리라고 판단했습니다. 이를 해결하기 위해 API 자동화 테스트 툴이 있는지 알아보았습니다.
여러 테스트 툴을 알아보던 중 Postman에 csv, json 파일을 읽어서 파라미터로 API 요청해주는 기능이 있다는 것을 알게 되었습니다. 일부 데이터를 복사해 테스트를 수행해 문제없는 것을 확인했고, 이후 10,000개의 데이터를 며칠이 나눠 처리해 예상일정보다 일찍 해결할 수 있었습니다.
그래서 이번에 유사한 기능을 제공해주는 툴을 알아보고 이를 정리해 보면 좋겠다 생각해 글을 작성하게 되었습니다.
1) 간단한 테스트 API 개발 및 CSV 파일 준비
로직은 간단합니다. Get 의 파리미터(이름, 나이)를 받아 DB 저장 후 반환합니다.
package com.example.apitest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RequiredArgsConstructor
@RestController
public class ApiTestController {
private final UserRepository userRepository;
@GetMapping("/test")
public ResponseEntity<?> getParamterDatas(
@RequestParam("name") String name, @RequestParam("age") int age
) {
User user = new User(name, age); // User 인스턴스 생성
User savedUser = userRepository.save(user); // 생성된 인스턴스 저장
log.info("savedUser: {}", savedUser); // 저장된 유저 로그 남기기
return ResponseEntity.ok().body(savedUser); // 저장된 유저정보 응답
}
}
2) CSV 파일 준비
스프레드 시트를 통해 데이터를 입력 후 상단 탭의 파일-다운로드를 선택하면 csv로 다운받을 수 있습니다.
터미널에서 csv파일을 확인해보면 아래와 같이 나오네요.
1. Postman으로 테스트 해보기
Postman의 장점은 자체 기능 만으로 csv 파일 업로드와 변수명을 지정해 쉽게 API 요청을 자동화할 수 있다는 점입니다.
또한, Post-response 탭을 통해 서버 호출 후 응답받은 결과를 script를 통해 파싱해 새로운 Request 시 파라미터로 사용하도록 사후 처리가 가능하다는 점이 가장 큰 장점이라고 생각합니다. 개인적으로 일회성 업무를 위한 코드를 작성하지 않아도 된다는 점이 메리트가 있다고 느꼈습니다.
Postman 테스트 절차
1. csv에 작성한 파라미터 명을 Query Paramas에 {{name}}, {{age}} 형태로 작성해 줍니다.
2. 실행할 폴더... 선택 후 Run folder 클릭
3. 활성화된 창에서 Select File을 선택해 앞서 저장한 csv 파일을 선택합니다.
(선택하면 Iterations에 csv에 작성된 데이터 개수만큼 변경됩니다.)
4. Persist response for a session을 선택해 주고, Delay 값는 1000 = 1초 정도 주고 Run API 자동화 테스트를 클릭해 주면 됩니다.
요청은 성공적으로 수행됐고, 데이터 또한 DB에 잘 저장되었네요.
2. Jmeter로 테스트해보기
Jmeter는 부하테스트에 사용하는 통합 테스트 툴인데 csv 파일을 통한 API 자동화 테스트를 진행할 수 있습니다.(이번에 처음 알았네요.)
Jmeter로 테스트를 진행하면서 느낀 건 부하테스트가 아닌 단순 일회성 업무를 위해 Jmeter를 사용하는 건 조금 과하다고 생각합니다.
본래의 목적이 부하 테스트에 맞춰져 있는 툴이기에 여러 기능이 있는 건 분명한 이점이긴 하나, 본래의 목적이 아닌 다른 목적으로 사용하기엔 과분한 것 같다고 생각했어요. 인터페이스 자체도 세부적인 옵션들이 너무 많고, 유저 친화적이지 않은 느낌을 조금 받았습니다.
Jmeter 테스트 절차
1. Thread Group 생성 후 요청 건수만큼 스레드 개수를 추가해 주세요
- 테스트 개수가 5개라면 스레드 5개를 입력해주면 돼요. (쓰레드 개수가 10개면 5개 테스트를 2번 반복해요!)
2. 쓰레드 그룹 우클릭해 CSV 데이터 셋 설정을 추가해주세요
1) 파일 이름 탭의 Browse... 을 선택해 CSV 파일을 선택해 주세요
2) 변수 이름을 입력해 주고(변수가 여러 개일 경우 콤마(,)로 구분해 주면 돼요)
3) 구분자에 콤마(,)를 입력해 주세요
3. 상단에 실행 버튼을 클릭하면 테스트가 수행돼요
4. DB에도 잘 저장 되었네요
3. RestAssured로 테스트해보기
RestAssured와 opencsv 라이브러리를 이용해 직접 테스트 코드를 작성해 업무를 해결할 수 도 있었습니다.
테스트를 위해서 우선 기존 서비스를 Run 하여 수행시키고, 테스트 코드를 수행하면 됩니다.
코드 로직은 단순합니다. csv파일을 읽어드리고, 테스트 데이터를 List <String []> data로 선언 후, for문을 돌며 RestAssured의 API 요청을 수행하기만 하면 됩니다. 테스트 간 1초 시간을 두고 수행되도록 한 후 테스트를 수행하면 됩니다.
RestAssured 테스트 절차
1. csv와 RestAssured 의존성 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
testImplementation 'io.rest-assured:rest-assured:5.5.0' // 의존성 추가
testImplementation 'com.opencsv:opencsv:5.5.2' // 의존성 추가
runtimeOnly 'com.h2database:h2'
}
2. 테스트 코드 작성
@SpringBootTest
public class ControllerTest {
@Test
public void testApiWithCsvData() throws Exception {
String csvFile = "/Users/gimjunseong/Desktop/Study2/apiTest/src/main/resources/static/apiTestFile.csv";
List<String[]> data = readCsv(csvFile);
for (String[] row : data) {
if(row[0].equals("name") && row[1].equals("age")) continue; // 첫번쨰 행은 패스
String name = row[0];
int age = Integer.parseInt(row[1]);
Response response = given()
.queryParam("name", name)
.queryParam("age", age)
.when()
.get("http://localhost:8080/test")
.then()
.statusCode(200)
.extract()
.response();
System.out.println(response.getBody().asString());
}
}
private List<String[]> readCsv(String filePath) throws Exception {
try (CSVReader csvReader = new CSVReader(new FileReader(filePath))) {
return csvReader.readAll();
}
}
}
4. 비교 테이블
Postman | Jmeter | RestAssured | |
CSV, JSON 지원 | O | O | O |
사후 처리 | O | X | O |
코드작성 | X | X | O |
5. 느낀 점
평소 사용하던 툴에도 여러 유용한 기능이 내장되어 있는 경우가 많으니 시간 내어 한 번씩 훑어봐야겠다는 교훈을 얻었습니다.
물리적으로 불가능한 업무도 자동화 툴 등을 이용해 해결할 수 있으며, 동일한 기능을 제공하더라도 여러 가지 비교 분석을 해야 내가 왜 이런 선택을 했는지 근거가 됨을 알게 되었습니다. 앞으로도 개발이든 비개발 업무든 논리적 근거를 가지고 업무를 해야 함을 알게 된 좋은 경험이었습니다.
이상 전달 끝!