E2E 테스트 구축기 (used AWS Step Functions)

Dongkyu Ko
딜리버스
Published in
7 min readMay 6, 2022

E2E 테스트란?

E2E(End-to-End) 테스트란 사용자 중심으로 처음부터 끝까지 어플리케이션 흐름을 테스트하는 소프트웨어 테스트 방법 중 하나입니다. E2E 테스트의 목적은 실제 사용자 시나리오를 시뮬레이션하고 어플리케이션 구성 요소의 통합 및 데이터 무결성을 검증하는 것 입니다.

딜리버스에서 E2E 테스트를 하는 이유는 FE(Front-end),BE(Back-end)에서 유닛 테스트(Unit Test)를 진행하고 있지만 최종 배포 전 어플리케이션의 주요 기능들이 문제없이 작동하는지 검증하기 위함입니다. 만약에 E2E 테스트를 진행하지 않으면 어플리케이션 최종 테스트를 진행할 방법이 없으며, 어플리케이션 사용자가 어플리케이션에 대한 신뢰가 떨어지고 사용의 불편함을 느낄 수 있기 때문(품질 저하)입니다.

소프트웨어 테스트에 대한 이해를 돕기 위해 “Testing Pyramid”에 대해 간단하게 설명합니다.

Testing Pyramid

출처: https://betterprogramming.pub/the-test-pyramid-80d77535573

Google Test Automation Conference에서 제안된 테스트 피라미드
테스트 방법 (3가지)

● Unit
- 각 컴포넌트 및 기능 단위의 동작 검증 (가장 작은 단위 테스트)
- 함수의 Input, ouput을 검증
- 가장 쉽고 빠르며 효과가 가장 좋음

● Integration
- 두개 이상의 서로 다른 모듈 또는 클래스 간 상호작용 검증
- 모듈 간 인터페이스 및 데이터 흐름에 대한 검증

출처: https://stackoverflow.com/questions/10752/what-is-the-difference-between-integration-and-unit-tests/57283806#57283806

● E2E (End-to-End)
- 개발한 결과물(어플리케이션)이 처음부터 끝까지 완벽하게 작동 검증
- 사용자 입장에서 테스트

E2E 실행 및 테스트 방법

딜리버스의 E2E 테스트는 UI 중심이 아닌 기능 중심이며, 배포 과정 중에 E2E 테스트를 진행합니다.

E2E 실행 과정

E2E 테스트는 Stage 환경의 CD(Continuous Deployment) Pipeline 내에서 실행되며 배포는 AWS CodeDeploy를 사용합니다. E2E 테스트가 성공했을 경우 배포가 이루어지며, E2E 테스트가 실패 했을 때 업데이트 전(Rollback)으로 돌아갑니다.

* 추후에는 Stage 환경의 CD Pipeline 내에 부하 테스트(Load Test)도 추가 예정

E2E 테스트 구축 방법

많이 사용하는 E2E 테스트 구축 방법에는 프레임워크 및 라이브러리에 따라 지원하는 E2E 테스트 도구가 있지만 딜리버스에서는 UI 중심이 아닌 기능 중심으로 E2E 테스트를 진행하고 배포 과정 중에 테스트를 진행하기 때문에 기존에 서비스 중인 도구 선택에 어려움이 있었습니다.

E2E를 어떻게 구축할지 고민하다가 딜리버스가 추구하는 Serverless 구조와도 맞고 워크플로우를 만들 수 있는 AWS Step Functions을 사용하기로 했습니다.

AWS Step Functions이란?

AWS Step Functions을 사용한 이유

  • Serverless
  • 이벤트 중심
  • 워크플로우 설계 가능
  • AWS 리소스들과 통합 가능
출처: https://aws.amazon.com/ko/blogs/aws/new-building-a-continuous-integration-workflow-with-step-functions-and-aws-codebuild/

E2E 실행 방법

딜리버스는 CI/CD 도구로 Github actions을 사용하고 있습니다. AWS Step Functions을 실행하는 방법은 다양하게 있지만 Github actions에서 요청을 보내서 E2E 테스트를 실행을 해야하기 때문에 Amazon API Gateway에서 API를 만들어 외부에서 실행할 수 있게 설정했습니다.

API Gateway에서 AWS Step Functions와 통합 가능
Github Actions E2E 실행 코드

E2E 테스트 시나리오

테스트 시나리오를 한줄로 표현하면 아래와 같습니다.

“가상의 배송 물품(일반, 반품)을 생성부터 배송(반품)완료까지”

시나리오를 한줄로 정리하고 E2E 테스트를 구축하기 위해 API를 시나리오 순서대로 정리해봤는데 Testing Pyramid에서 “E2E 테스트는 3가지의 테스트 방법 중 가장 많은 리소스가 들어가고 가장 복잡하다” 것을 알 수 있었습니다.

E2E 테스트 시나리오

E2E 테스트 시나리오

딜리버스 전체 배송과정을 진행하는 시나리오

  • 배송/반품 신청
  • 배송/반품 아이템 생성
  • 송장 출력 (배송/반품)
  • 셀러(배송 신청자) → 메인 허브
  • 박스 분류 (배송/반품)
  • 메인 허브 → 지역 유닛
  • 배송 업무 신청
  • 배송 시작
  • 배송/반품 수거 완료
  • 업무 완료

E2E Workflow

E2E (AWS Step Functions Workflow)
  • AWS SAM(Serverless Application Model)으로 Lambda를 개발하고 배포
  • 배송 물품(일반, 반품)을 생성부터 배송(반품)완료까지”의 과정이기 때문에 분기가 존재하지 않음

E2E 테스트 성공 시

실제 사용중인 E2E 테스트 과정이 너무 길어 예시 E2E Workflow를 사용했습니다.

성공한 E2E 테스트
슬랙 메세지

E2E 테스트 실패 시

실제 사용중인 E2E 테스트 과정이 너무 길어 예시 E2E Workflow를 사용했습니다.

실패한 E2E 테스트
슬랙 메세지

글을 마무리 하며

매번 업데이트 시 Stage 환경에서 E2E 테스트를 자동으로 진행하니 주요한 기능들에 대한 품질을 보장할 수 있어 불안하지 않았고 수동으로 테스트하지 않아 시간과 리소스를 절약할 수 있었습니다. 하지만 모든 시스템이 완벽하지 않듯 E2E 테스트를 구축해보니 아래와 같이 개선할 사항이 많았습니다.

개선할 사항

  • Lambda(SAM) 통합 관리 및 배포
  • 반복적으로 사용되는 코드 줄이기
  • 각 Lambda에 Http Request 코드를 반복하지 않고 사용할 수 있는 방법

--

--