반응형
E2E 테스트?
여러 구성 요소가 함께 예상대로 작동하는지 확인하는 테스트
- 환경 유사성: E2E 서버는 실제 운영 환경을 최대한 유사하게 설정하여, 실제 서비스에서 발생할 수 있는 문제를 미리 발견할 수 있도록 합니다.
- 자동화 테스트: Selenium, Cypress, Playwright 같은 도구를 사용하여 사용자의 인터랙션을 자동으로 시뮬레이션하고, 여러 계층 간의 흐름을 확인합니다.
- 데이터 일관성: 일부 E2E 서버는 테스트 데이터베이스나 샌드박스 환경을 사용하여 실제 운영 데이터와 분리된 상태에서 테스트를 수행합니다.
- CI/CD 통합: E2E 테스트는 CI/CD 파이프라인에 통합되어 배포 과정에서 발생할 수 있는 문제를 조기에 발견할 수 있도록 자동으로 실행됩니다.
E2E 서버 = E2E 테스트를 위한 서버
1. 테스트 환경 구성
E2E 서버는 운영 환경과 유사한 환경을 제공하는 것이 중요합니다. 이를 위해 다음과 같은 환경을 구성합니다.
- 테스트용 데이터베이스: 실제 데이터베이스와 분리된 테스트용 데이터베이스를 설정하여 데이터 충돌을 방지하고 테스트 데이터를 자유롭게 사용할 수 있게 합니다.
- 테스트 API 엔드포인트: E2E 서버는 운영 API와 구분된 테스트용 API 엔드포인트를 설정해 두는 것이 좋습니다.
- url을 또 따는건 아닌 것 같음, 같은 소스에 profile 만 stage 이런식으로 주는게 좋을 것 같음. 매번 주소 바꾸고 관리하는거 불편
- 샌드박스 모드: 외부 API를 사용하는 경우, 실제 외부 API와 통신하지 않고 샌드박스 모드(테스트 모드)로 설정하여 과금 등의 위험을 줄입니다.
- 테스트 용 api를 제공해주는게 제일 좋은 것 같음.. 그렇지 않다면.. mock server를 띄워서 상황별로 일정한 값을 내리도록 세팅해야 할 듯
- 인프라 설정: 실제 환경을 모방하여 Docker 등을 활용해 마이크로서비스 아키텍처를 구성하거나 CI/CD 파이프라인에서 테스트 환경을 동적으로 띄우는 방법을 사용할 수 있습니다.
2. 자동화 도구 설정
자동화 도구는 사용자의 행동을 시뮬레이션하고, 전체 흐름을 테스트하는 데 중요한 역할을 합니다. 몇 가지 인기 있는 도구는 다음과 같습니다.
- Selenium: 주로 웹 애플리케이션의 UI 테스트를 자동화하는 데 사용되며, 다양한 브라우저를 지원합니다.
- Cypress: 현대 웹 애플리케이션 테스트에 적합한 빠르고 간편한 도구로, 백엔드와의 상호작용을 테스트하는 데 강점을 가집니다.
- Playwright: 다양한 브라우저와 모바일 디바이스까지 지원하며, 최신 웹 애플리케이션에 적합한 자동화 도구입니다.
- soup ui: 사용해서 api 순차 호출하고 전 결과를 후 api 에 사용 가능. 시나리오별로 관리 가능
이 도구들을 CI/CD 파이프라인과 통합하여 특정 조건에서 E2E 테스트가 자동으로 실행되도록 설정할 수 있습니다.
3. 테스트 코드 작성
테스트 코드는 사용자가 실제로 애플리케이션을 사용하는 흐름을 최대한 비슷하게 재현해야 합니다.
- 시나리오 설계: 로그인, 상품 조회, 결제 등 사용자의 주요 작업 시나리오를 정리하고, 순서대로 테스트가 진행되도록 합니다.
- 상태 관리: 테스트 중 서버의 상태(예: 로그인 상태, 장바구니에 담긴 상품 등)를 일관되게 관리하기 위해 각 테스트 케이스를 독립적으로 작성하거나, 필요한 경우 테스트 실행 전후에 초기화 과정을 둡니다.
- 에러 및 예외 처리 테스트: 정상적인 흐름뿐 아니라, 잘못된 입력이나 서버 오류 등 다양한 예외 상황을 테스트하여 애플리케이션이 안정적으
- 로 작동하는지 확인합니다.
4. CI/CD 통합
테스트가 성공적으로 작성되었다면, 이를 CI/CD 파이프라인에 통합하여 배포 전 자동으로 실행되도록 설정합니다.
- GitHub Actions, Jenkins, GitLab CI 등과 같은 CI/CD 도구를 사용하여 코드가 변경될 때마다 자동으로 E2E 테스트를 실행할 수 있습니다.
- 테스트 결과가 실패하면 알림을 받도록 하여, 문제를 빠르게 확인하고 수정할 수 있도록 합니다.
cypress 예시
npm install cypress --save-dev
위 명령어로 설치하고 루트에 cypress.json 파일을 생성하고 아래처럼 api서버 url 설정
{
"baseUrl": "http://localhost:8080"
}
테스트 파일 생성: cypress/integration/user_spec.js 파일을 생성하고 아래와 같이 작성
describe('User API E2E Test', () => {
it('should create a new user and retrieve the user list', () => {
const user = { name: 'John Doe', email: 'john.doe@example.com' };
// Create a new user
cy.request('POST', '/users', user)
.its('status')
.should('eq', 200);
// Retrieve the user list and verify the new user exists
cy.request('/users').then((response) => {
expect(response.status).to.eq(200);
expect(response.body).to.have.length.greaterThan(0);
expect(response.body.some(u => u.email === user.email)).to.be.true;
});
});
});
- POST /users 엔드포인트에 사용자 데이터를 보내 사용자를 생성
- GET /users 엔드포인트로 모든 사용자를 조회하고, 방금 생성한 사용자가 포함되어 있는지 확인
아래 명령어로 cypress 실행, Cypress 창이 열리면 user_spec.js 테스트 파일을 선택
npx cypress open
github actions와 연동
테스트를 해야하는 서버의 코드에 .github/workflows/e2e-test.yml 파일생성하고 다음 설정을 추가
(gitHub는 .github/workflows/ 폴더에 있는 YAML 파일을 모두 인식하여 워크플로우로 처리)
name: E2E Tests
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
e2e-test:
runs-on: ubuntu-latest
services:
db:
image: mysql:5.7
env:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: e2e_test_db
ports:
- 3306:3306
options: >-
--health-cmd="mysqladmin ping --silent"
--health-interval=10s
--health-timeout=5s
--health-retries=3
steps:
- name: Check out the code
uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
- name: Install dependencies
run: ./gradlew build -x test
- name: Start Spring Boot application with E2E profile
run: ./gradlew bootRun -Dspring.profiles.active=e2e &
env:
SPRING_DATASOURCE_URL: jdbc:mysql://localhost:3306/e2e_test_db
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: password
timeout-minutes: 2
- name: Wait for Spring Boot to start
run: |
timeout 60s bash -c "until echo > /dev/tcp/localhost/8080; do sleep 5; done"
- name: Run Cypress tests
uses: cypress-io/github-action@v2
with:
start: npm start
env:
CYPRESS_BASE_URL: http://localhost:8080
main 브랜치에 머지하거나 pr 날리면 cypress 실행하도록 작성
728x90
반응형
'architecture > micro service' 카테고리의 다른 글
[캐시] 캐시 관련 문제들과 캐시웜업 (0) | 2024.11.17 |
---|---|
[Dead Letter] PDL, CDL (0) | 2024.11.14 |
대용량 데이터 처리 고민 (1) | 2024.11.10 |
transaction outbox pattern + polling publisher pattern (0) | 2024.11.07 |
2PC vs 2PL (1) | 2024.11.06 |