안녕하세요! 테스트자동화개발팀에서 자동화 프로그램을 개발하고 있는 6년 차 QA 엔지니어 김정낙입니다.
나날이 다양해지는 사용자 요구와 최근 웹 서비스와 애플리케이션의 릴리즈 주기가 점점 더 짧아지고 있는 것을 느끼시나요? 이는 사용자 요구가 날로 다양해지고, 기술이 급속도로 발전함에 따라 더욱 빠르게 변화하는 트렌드와 맞물려, 기업들이 경쟁에서 앞서기 위해 신속한 릴리즈와 새로운 기능의 추가 및 개선을 계속해서 추진하고 있기 때문입니다. AI와 같은 첨단 기술의 도입이 가속화되면서 이러한 현상은 더욱 두드러지게 나타나고 있으며, 이에 따라 개발자와 QA 팀에게는 더욱 빠르고 정확한 테스트가 요구되고 있습니다. 자연스럽게 테스트 자동화의 중요성이 그 어느 때보다 두드러지고 있으며, 지속적 통합(CI) 및 지속적 배포(CD) 같은 DevOps 관행이 확산하면서 테스트 자동화는 이제 필수적인 요소가 되었습니다.
이러한 흐름에 맞춰, 우리 회사에서는 기존에 품질보증실에서 각 구성원이 다소 소극적으로 수행하던 자동화 테스트를 더 체계적이고 조직적으로 관리하기 위해 ‘테스트자동화개발팀’을 신설했습니다. 저희 팀은 테스트 자동화의 효과적인 구축 및 운영을 통해 서비스 품질을 높이고, 여러 측면에서 회사에 기여하기 위해 다양한 목표를 세우고 열심히 노력하고 있습니다.
테스트 자동화의 개념과 장점에 대해서는 이전에 저희 팀 서연 님이 작성해 주신 “테스트 자동화 개발팀을 소개합니다” 글에서 이미 충분히 설명해 드렸으므로,
이 글에서는 효율적인 테스트 자동화 구축을 위해, 처음으로 어떤 자동화 테스트를 구현해 보고 이를 어떻게 활용하고 운영했는지에 대한 경험을 공유하고자 합니다. 이 글이 테스트 자동화에 관심 있는 분들께 도움이 되기를 바랍니다!
API 테스트 도입 배경
저희 팀이 처음 설립된 이후, 자동화 테스트 기반이 되는 솔루션 구축을 중점적으로 진행하면서, 동시에 서비스에 직접적으로 기여할 수 있는 테스트 개발을 병행해야 했습니다. 이러한 상황에서, 낮은 비용으로 높은 효과를 거둘 수 있는 자동화 테스트의 첫 단추를 어떻게 끼워야 할지 고민이 많았습니다.
이때 저희는 세 가지 이유로 API 테스트를 선택했습니다.
유지 보수 용이성
많은 수의 효과적인 자동화 테스트가 유지 보수가 어려워 폐기되는 경우가 많습니다.
UI 테스트의 경우 디자인 변경, 사용자 흐름의 변화에 따라 테스트 스크립트 수정이 자주 필요했지만, API는 기능적 요구사항이 확정된 이후 상대적으로 유지 보수 비용이 적고 안정적으로 운영 가능합니다.
구현 난이도와 안정성
API는 상대적으로 정형화되고 일관된 요청과 응답 구조를 가지고 있습니다.
이러한 특징 덕분에, 다양한 사용자 인터페이스 요소와 호환성을 고려해야 하거나, 하나의 동작에 대해 여러 항목을 확인해야 하는 다른 테스트들에 비해 구현이 비교적 수월하며, 안정적으로 운영하기에도 적합합니다.
검증 커버리지 증가
기존 품질팀에서는 주로 UI에서 발생할 수 있는 문제에 초점을 맞춰 검증을 수행해 왔습니다.
상대적으로 덜 다루어졌던 API 검증을 지원함으로써, 서비스의 테스트 커버리지를 확장하여, 서비스 품질 향상에 기여할 수 있습니다.
자동화 테스트 구현
저는 개발자가 아니기 때문에 코드 베이스에서 직접 테스트 스크립트를 작성하는 대신 강력한 도구(툴)를 사용하여 API 테스트를 구현하였습니다.
설계
Swagger를 활용한 API 테스트 설계
- 각 서비스 개발팀에서 잘 작성해 주신 Swagger 문서를 통해 API 명세 확인
- API 명세를 바탕으로 사용자 시나리오를 고려하여 설계하고, Postman에서 테스트케이스 작성
구현
API의 요청과 응답을 손쉽게 테스트할 수 있는 도구인 ‘Postman’을 이용해 API 테스트 구현
API마다 엔드 포인트(URL) 와 필요한 값을 작성하여 요청합니다. 이때, 각각의 요청과 요청들의 모음인 폴더, 폴더들의 집합인 컬렉션으로 구성된 계층에서 각각 ‘Pre-request’, ‘Post-response’를 이용해 스크립트 작성이 가능합니다.
정해져 있는 실행 순서를 최대한 활용하여 기대한 Response가 반환되었는지 확인하도록 테스트 스크립트를 작성하였습니다.
- Pre-request : 요청이 전송되기 전에 실행되는 코드
- Post-response : 요청에 대한 응답을 받은 후에 실행되는 코드
- Post-response 테스트 스크립트를 작성하여, Response에서 기대한 값들이 정확히 반환되었는지 확인하기
마주한 문제 해결과 단점 보완
API 테스트는 End-to-End 시나리오 검증 및 사용자 경험(UX) 검증의 부족하다는 단점이 있습니다.
이러한 한계를 극복하기 위해 실제 서비스에서 발생할 수 있는 다양한 상황을 시뮬레이션하여 실제 사용 시나리오를 반영한 시나리오 기반 설계를 하였습니다.
테스트 자동화의 가장 걸림돌(?)인 유지 보수 비용을 최소화하기 위해 재사용성을 고려하고 변수를 최대한 활용하여 스크립트를 작성하였습니다.
1. 실제 사용자 흐름에 맞춰 설계하여 시나리오 검증 부족 보완
사용자 시나리오를 재현하고 분석하여 테스트 범위를 확장했으며, 개별 API 동작뿐만 아니라 API 간 상호작용이 실제 환경에서 잘 이루어지는지 확인했습니다. 또한, API 간 의존성을 고려해 최소한의 호출로 최대한의 API를 테스트할 수 있도록 설계했습니다.
2. API 응답시간 모니터링을 통해 UX 검증 부족 보완
비록 UI/UX 자체를 검증할 수는 없지만, API 레벨에서의 성능 보장으로 부분적 보완하였습니다.
초기에는 API 스팩에 의해 고정된 응답시간이 초과하면 실패 처리하는 것으로 수행하였으나, 서버 상태나 여러 가지 환경에 의해 해당 방법이 적절하지 않을 수 있다는 문제점이 많이 발견되었고, 동일한 환경에서 반복되는 테스트의 평균과 비교하여 유의미한 차이가 있으면 문제가 있다고 하는 방식으로 변경하였습니다.
* 현재는 응답시간 평균을 그래프로 시각화하여 제공하고 실시간 알림 기능은 개발 중…
3. 요청에 필요한 정보들을 이전 Response에서 얻어 더 유연하게 활용하기
테스트 스크립트는 주로 Response의 특정 값이 기대 결과와 일치하는지 비교하는 형태로 구현되었습니다. 그러나 기대 결과를 일부 하드 코딩하면서 다양한 문제가 발생했습니다. 서비스 업데이트 등으로 기대 결과가 변경될 때마다 하드 코딩된 테스트 코드를 일일이 수정해야 했고, 시간이 지난 코드의 기대 결과가 왜 그렇게 작성되었는지 파악하는 데도 시간이 오래 걸려 유지 보수 비용이 증가했습니다. 이에 따라, API 테스트의 원래 장점을 충분히 살리지 못했습니다.
이를 개선하기 위해, 반환된 Response에서 필요한 정보를 변수에 저장하여 다음 API 요청의 필요한 값으로 사용하고, 테스트 코드의 기대 결과에도 적용함으로써 테스트의 유연성을 높였습니다.
4. 테스트 코드 결과 비교를 필요에 따라 다양하게 적기
처음 자동화 테스트를 구현할 때, 테스트 코드는 결과 비교를 무조건 정확한 값과 일치하는 형태로 작성했습니다. 서비스가 정상적으로 동작함에도 불구하고 실시간으로 갱신되는 정보나 서비스의 정말 간단한 변경 등으로 인해 테스트 결과와 다른 Response가 반환되어 테스트가 실패하는 문제가 발생했습니다.
이를 해결하기 위해, API 기대 결과의 중요도에 따라 일부 테스트에서는 정확한 일치를 확인하는 대신, 특정 텍스트를 포함하는지, 의도한 자료형인지 등등 다양한 방식으로 체크하도록 변경했습니다. 이를 통해 유지 보수의 용이성을 높였습니다.
5. 하나의 엔드 포인트를 활용해 여러 기대 결과(TC)를 반복적으로 테스트하기
API 문서를 기반으로 작성된 하나의 요청에서 전달하는 값에 따라 다양한 Response를 테스트할 수 있도록, Pre-request와 Post-response를 활용하여 효율적으로 테스트 되도록 활용 가능합니다.
테스트 자동화 구축 및 효과
테스트 자동화 구축
- 일정 주기 또는 대상 서비스 배포 시 테스트 실행, 알림, 결과 적재 과정을 자동으로 수행하도록 구축
- Postman 컬렉션을 CLI(Command Line Interface)에서 실행할 수 있는 도구인 Newman(https://www.npmjs.com/package/newman ) 및 Jenkins(https://www.jenkins.io/ )를 활용하여 자동화 테스트가 원하는 시점에 자동으로 수행되도록 구현
Jenkins의 옵션을 통해 Newman 명령어를 추가하면 Postman으로 작성한 collection을 수행 및 결과를 저장할 수 있습니다. 아래는 Newman 명령어 예시입니다.
newman run ./HD_API_Automation_Test.postman_collection.json
-e ./PRD.postman_environment.json
--reporters json --reporter-json-export "./newman/output.json"
Newman 사용법 및 Jenkins 연동에 관한 추가 정보를 원하시면, 아래 참고 사이트를 확인해 주시기를 바랍니다.
배포 자동화 테스트
대상 서비스 배포 완료되면, 자동으로 테스트 수행되도록 설정
- Newman을 통해 테스트 수행되도록 Jenkins 파이프라인 구성
- 대상 서비스에서 배포 시 자동화 테스트 Jenkins를 원격 유발하도록 설정
상시 자동화 테스트
대상 서비스를 일정 주기(10분)마다, 자동으로 테스트 수행되도록 설정
- Newman을 통해 테스트 수행되도록 Jenkins Job 구성
- 스케줄러를 설정하여 일정 주기(10분)마다 수행되도록 설정
알림 및 결과 리포트
실시간 알림 및 결과 리포트를 제공함으로써, 구현된 자동화 테스트의 효과를 더욱 실용적으로 활용합니다.
Dooray 알림
메신저에서 제공되는 인커밍 훅을 사용하여, 테스트 상태에 따른 알림을 실시간으로 전달
HancomTestHub(HTH) 결과 리포트
팀에서 개발 및 운영 중인 테스트 자동화 솔루션 “HancomTestHub”를 통해 자동화 테스트 수행 정보를 다양한 형태로 제공
* Newman을 통해 자동화 테스트 수행 결과 json 파일을 DB화하여 시각화
효과
API 자동화 테스트를 구현하고 실행, 알림, 결과 적재 등 전반 프로세스를 자동화함으로써, 개발 단계부터 실제 운영 환경에 이르기까지 다양한 측면에서 활용해 볼 수 있었습니다.
이를 통해 서비스의 안정성을 확보하고 개발에 소요되는 시간을 줄이는데 기여했습니다.
상시 테스트 효과
API 테스트를 10분 간격으로 주기적으로 수행함으로써, 실시간으로 서비스의 API 서버 상태를 모니터링할 수 있습니다. 이를 통해 문제 발생 시 신속하게 감지하고, 보다 빠른 조치를 통해 서비스의 안정성을 높이며 사용자 경험을 보호하는 데 중요한 역할을 할 수 있습니다.
배포 테스트 효과
API 자동화 테스트를 개발 프로세스에 통합하여, 서비스가 빌드 및 배포될 때마다 자동으로 검증을 수행하여, 여러 가지 효과를 얻을 수 있습니다.
- 신규 버전에서 기존 기능의 정상 동작을 빠르게 확인함으로써, 수정된 내용의 신뢰성을 확보하고 문제가 있을 때 즉시 발견하여 신속하게 해결할 수 있습니다.
- 반복적으로 수행해야 하는 테스트의 부담을 줄여 신규 기능과 사용자 흐름 검증에 집중할 수 있어, QA 팀의 효율성을 높이고 중요한 테스트에 더 많은 리소스를 투입할 수 있습니다.
이러한 효과들로 릴리즈 사이클을 가속화하여, 품질을 유지하면서도 더 빠르게 사용자에게 가치를 전달할 기회를 제공합니다.
마치며
API 자동화 테스트를 포함하는 테스트 자동화 구축 과정에서 예상하지 못한 다양한 시행착오가 있었지만, 그에 따른 크고 작은 다양한 시도를 해보았습니다.
이 과정에서 저희 테스트자동화개발팀의 팀원분들을 비롯해 도움을 주신 인프라운영팀, 각 서비스 개발 및 검증 담당자분들, 그리고 유관 부서의 모든 분께 깊은 감사의 말씀을 전하고 싶습니다!
이번 경험을 바탕으로 앞으로 더 나은 테스트 자동화 솔루션을 구축해 회사의 구성원들과 서비스 품질에 기여할 수 있도록 최선을 다하겠습니다.
자동화 테스트와 관련된 문의 사항, 의견, 아이디어는 언제든 환영입니다. 편하게 연락해 주세요
바쁘신 와중에도 끝까지 부족한 글을 읽어주셔서 진심으로 감사드립니다!
참고자료
- https://learning.postman.com/docs/tests-and-scripts/write-scripts/intro-to-scripts/
- https://www.npmjs.com/package/newman
- https://www.toolsqa.com/postman/generate-newman-reports-on-jenkins/
- https://blog.rightbrain.co.kr/?p=2465