반응형

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;
    });
  });
});

 

  1. POST /users 엔드포인트에 사용자 데이터를 보내 사용자를 생성
  2. 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

+ Recent posts