Skip to content

✅ test: Email Worker E2E 테스트 작성#510

Merged
CodeVac513 merged 27 commits intomainfrom
test/email-e2e-test
Jan 20, 2026
Merged

✅ test: Email Worker E2E 테스트 작성#510
CodeVac513 merged 27 commits intomainfrom
test/email-e2e-test

Conversation

@CodeVac513
Copy link
Collaborator

@CodeVac513 CodeVac513 commented Dec 31, 2025

📋 작업 내용

작업 요약

  • 이메일 전송 E2E test 코드 작성
    • 정상 시나리오에서 이메일이 정상적으로 전송되는 것에 대한 테스트
    • 에러 발생 시나리오에서 DLQ 혹은 대기큐로 메시지가 발행되는 것에 대한 테스트
    • 에러 핸들링 관련 테스트를 위한 헬퍼 메서드 추가

Claude code 관련 내용

[사용 이유]
이메일 정상 시나리오에 대해서는 제가 직접 작성했고, 에러 발생 시나리오와 헬퍼에 대해서는 클로드 코드를 활용했습니다.
에러 발생 시나리오 상 Mailpit이라는 테스트용 SMTP 서버와 RabbitMQ를 활용해야 합니다.

예를 들어 DLQ로 어떤 요청의 메시지가 발행된다면 :

  1. Mailpit을 조회하면 이메일이 없어야 함.
  2. DLQ를 조회했을 때 해당 메시지를 발견할 수 있어야 함.
  3. 해당 메시지의 x라는 헤더에는 y라는 값이 저장되어야 함. (retry-count, error-stack 등의 내용을 전부 추상화해서 x와 y로 표현)

그래서 테스트에 필요한 조회 등의 헬퍼 함수와 이메일 형식이나 메시지 형식에 맞는 검증이 필요했고, 개발자가 직접 확인하기에는 손이 많이 가는 작업이라 볼 수 있습니다.
클로드 코드를 활용해서 이런 작업에 대해 생산성을 높일 수 있도록 시도했습니다.

[클로드 코드 검수]
처음에는 에러 핸들링 관련 E2E 테스트 코드를 작성해달라 하니, 내부를 모킹한 유닛 테스트 같은 버전으로 만들어줬습니다.

시스템 검증에 초점을 맞추는 E2E 테스트의 특징을 살리기 위해 프롬프트를 다음과 같이 수정했습니다.

[상황 설명]
현재 email-error-handling_e2e-spec.ts 파일을 보면 sendMessageToQueue가 몇 번 
호출되는지 검증하고 있습니다. 이는 내부 구현 검증이라 E2E 테스트 목적에 맞지 않습니다.

[원하는 것]
E2E 테스트를 다음과 같이 재작성해주세요:

1. Mock 제거: sendMessageToQueue를 mock하지 말고 실제로 큐에 메시지를 발행
2. 실제 큐 상태 확인: RabbitMQ API를 사용해서 특정 큐에 메시지가 있는지 확인
3. 검증 대상:
   - 네트워크 에러, SMTP 4xx 에러 → email.wait.5s 큐에 메시지 존재
   - SMTP 5xx 에러 → email.dlq 큐에 메시지 존재
   - 3회 재시도 실패 → email.dlq 큐에 메시지 존재

[제약사항]
- Waiting Queue는 TTL이 있어서 자동으로 재처리됩니다
- 테스트에서 5~20초 기다릴 수 없으니, 큐에 메시지가 존재하는지만 확인할 수 있게 해주세요.

[참고 코드]
email.consumer.ts 파일을 보면 handleEmailByError 메서드에서 에러 타입별로
다른 큐로 메시지를 보내는 로직이 있습니다.

[추가 요청]
- 테스트 헬퍼 함수를 만들어서 큐 메시지 조회를 쉽게 해주세요
- 각 테스트는 독립적으로 실행되도록 beforeEach에서 큐를 정리해주세요
- 큐에 메시지 존재 여부만 확인하는 방법을 써주세요.
- 예시 코드를 작성했습니다.
it('네트워크 에러 시 재시도 큐로 메시지가 이동한다', async () => {
  // Given: 네트워크 에러를 발생시키는 상황
  emailService.send = jest.fn()
    .mockRejectedValue(new Error('ECONNREFUSED'));

  // When: 메시지 발행
  await publishEmailMessage(payload);
  await waitForConsumerProcessing();

  // Then: WAIT_5S 큐에 메시지가 존재하는지 확인
  const waitingQueueMessages = await getMessagesFromQueue('email.wait.5s');
  expect(waitingQueueMessages).toHaveLength(1);
  expect(waitingQueueMessages[0].properties.headers['x-retry-count']).toBe(1);
});

📷 스크린 샷(선택 사항)

image image

@CodeVac513 CodeVac513 self-assigned this Dec 31, 2025
@CodeVac513 CodeVac513 requested review from Jo-Minseok and asn6878 and removed request for Jo-Minseok January 15, 2026 06:15
@CodeVac513 CodeVac513 added the ✅ Test 테스트 관련 (storybook, vitest, jest 등) label Jan 15, 2026
@CodeVac513 CodeVac513 marked this pull request as ready for review January 15, 2026 06:34
Copy link
Member

@Jo-Minseok Jo-Minseok left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다! 개인적으로 test/e2e/helpers/rabbitmq-test.helper.tstest/e2e/setup/testContext.setup.tstest/config/e2e 아래에 common 디렉토리로 옮기는게 좋을듯 합니다.
test/e2e, test/unit 에는 테스트 파일만 두는게 안 헷갈리고 좋을것 같습니다.

@CodeVac513 CodeVac513 merged commit 537da18 into main Jan 20, 2026
1 check passed
@CodeVac513 CodeVac513 deleted the test/email-e2e-test branch January 20, 2026 12:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✅ Test 테스트 관련 (storybook, vitest, jest 등)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants