요즘 맡고있는 업무중에 기존 레거시 API 에 대한 리팩토링을 진행하거나 V1 프로젝트의 소스를 V2 로 옮기는 작업을 간간히 진행하게 되었습니다. 아무래도 해당 업무를 오래하지 않았고 오래되고 히스토리를 모르는 API 의 리팩토링을 진행하다보니 매번 Postman 을 통해서 결과값을 비교하는 것은 작업 효율이 그리 좋지는 못했습니다.
실제로 여러 파라미터들의 결과값을 테스트하고 소스코드 수정의 부담감을 줄이면서 테스트 통과라는 심리적 안정을 통해서 안정감 그리고 업무 효율성까지 끌어 올릴 수 있었던 제 방법을 소개합니다.
우선 제가 진행했던 API 리팩토링에서 가장 중요한 포인트는 기존 API 의 호환성을 유지하고 로직의 코드를 정리하거나 타입을 정의 혹은 불필요한 로직을 단순화하는 작업이었습니다. 결국 로직이 변경되더라도 내가 원하는 결과값을 가져오거나 혹은 리팩토링을 진행하는 API 가 기존의 API 와 동일한 결과값을 내려주고 이 검증을 손쉽게 한다면 리팩토링에 집중할 수 있을거라고 생각했습니다.
테스트를 위한 세팅
@Get('/v1/users/1')
getUser() {
// OOOOOOO Logic......
return {
name: 'angular',
age: 18,
gender: 'male',
};
}
@Get('/v2/users/1')
getUserV2() {
// OOOOOOO Logic......
return {
name: 'angular',
age: 1,
gender: 'male',
};
}
우선 레거시에 해당되는 V1 API 와 리팩토링을 진행하는 V2 API 가 있다고 가정합니다. 각 API 는 특정 비즈니스 로직을 실행한 뒤 결과값을 반환하는 일반적인 Get 방식의 API 입니다.
Jest 를 이용한 결과값 비교
결과값을 비교할 API 를 호출한 뒤 결과값을 검증합니다. 원하는 결과값에 따라 toEqual, contain 등 기본적으로 Jest 에서 제공하는 테스트를 위한 함수를 통해서 검증을 진행합니다.
describe('test.spec.ts', () => {
it('test', async () => {
const legacy = 'http://localhost:3000/users/v1/users/1'
const tobe = 'http://localhost:3000/users/v2/users/1'
const [legacyResult, tobeResult] = await Promise.all([axios.get(legacy), axios.get(tobe)])
expect(legacyResult.data).toEqual(tobeResult.data)
})
})
실제 상단 코드의 API 를 실행하면 두 API 의 결과값이 다른것을 확인할 수 있는데 Jest Log 를 통해서 손쉽게 어떤 부분의 데이터가 다른지 확인할 수 있습니다.
Error: expect(received).toEqual(expected) // deep equality
- Expected - 1
+ Received + 1
Object {
- "age": 1,
+ "age": 18,
"gender": "male",
"name": "angular",
}
물론 예제에서 사용한 결과값의 경우 데이터의 길이가 짧고 한눈에 보이는 수준의 데이터지만 한눈에 확인하기 어려운 수준의 데이터 길이라면 더욱 더 확실하게 장점을 확인할 수 있습니다.
테스트를 위한 세팅
@Get('/v1/users/1')
getUser() {
// OOOOOOO Logic......
const results = [];
for (let i = 0; i <= 1000; i++) {
results.push({
name: 'angular',
point: Math.random() * 100,
gender: 'male',
});
}
return results;
}
@Get('/v2/users/1')
getUserV2() {
// OOOOOOO Logic......
const results = [];
for (let i = 0; i <= 1000; i++) {
results.push({
name: 'angular',
point: Math.random() * 100,
gender: 'male',
});
}
return results;
}
다음의 코드와 같이 1000개의 리스트를 리턴하는 API 로 변경합니다.
Jest 를 이용한 결과값 비교
결과값이 길더라도 log 를 통해서 몇 건의 데이터의 불일치가 일어났는지, 그리고 실제 데이터 중 어떤 부분의 결과값이 다른지 손쉽게 확인할 수 있습니다.
블로그에서 다루는 예제의 경우 비즈니스 로직이 없고 단순한 리턴형태라서 Postman 을 호출하거나 diff 툴을 이용하는 것이랑 크게 다르지 않게 느낄 수 있습니다.
작업을 진행하다보면 API 의 개수는 점점 많아지고 환경에 따라서 혹은 데이터 유형에 따라서 같은 API 의 데이터를 각 케이스에 맞춰 여러번 호출해야하는 상황도 발생합니다.
Jest 기능 활용하기
위의 예제는 단순한 수준의 예제로만 작성되었습니다. 테스트를 위해서 DB 를 조회하고 Query 결과값을 통해서 테스트 타겟을 정하거나 혹은 여러 케이스에 대한 파라미터를 it.each 를 통해서 반복할 수 있는 기능들이 많습니다.
실제 테스트 환경에 따라서 테스트 전 Token 을 가져오거나 혹은 Selenium 을 통해서 로그인을 할 수 있습니다. 혹은 현재 데이터를 반영한 테스트 타겟 자체를 추출할 수도 있습니다.
이처럼 이미 기본적으로 많이 사용하는 환경이지만 주어진 환경으로 조금만 더 응용한다면 실제 업무의 효율을 높이고 스마트하게 일 할 수 있는 환경을 구축할 수 있습니다.
'스마트하게 일하기 > 테스트 자동화 이야기' 카테고리의 다른 글
내가 테스트 자동화 프로젝트를 만드는 이유 #01 (0) | 2022.03.28 |
---|