본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 11. 3. · 52 Views
Testing 트러블슈팅 가이드 완벽 정리
테스트 작성 시 자주 발생하는 문제와 해결 방법을 담은 실전 가이드입니다. 비동기 처리, Mock 설정, 환경 설정 등 실무에서 바로 적용할 수 있는 트러블슈팅 팁을 제공합니다.
들어가며
이 글에서는 Testing 트러블슈팅 가이드 완벽 정리에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.
목차
- 비동기_테스트_타임아웃_에러
- Mock_함수_초기화_안됨
- DOM_요소를_찾을_수_없음
- 환경변수_로딩_실패
- 모듈_Mock이_작동하지_않음
- Timer_함수_테스트_실패
- State_업데이트가_반영_안됨
- API_호출_테스트_중_실제_요청_발생
- 스냅샷_테스트_계속_실패
- 테스트_간_데이터베이스_상태_충돌
- 콘솔_에러_경고_메시지_정리
- Coverage_리포트가_부정확함
1. 비동기 테스트 타임아웃 에러
개요
비동기 작업이 완료되기 전에 테스트가 종료되어 발생하는 타임아웃 에러를 해결하는 방법입니다.
코드 예제
// ❌ 잘못된 방법
test('fetch data', () => {
fetchUser().then(user => {
expect(user.name).toBe('John');
});
});
// ✅ 올바른 방법
test('fetch data', async () => {
const user = await fetchUser();
expect(user.name).toBe('John');
});
설명
async/await를 사용하거나 Promise를 return하여 테스트가 비동기 작업을 기다리도록 해야 합니다.
2. Mock 함수 초기화 안됨
개요
이전 테스트의 Mock 상태가 남아있어 다음 테스트에 영향을 주는 문제를 해결합니다.
코드 예제
const mockFn = jest.fn();
beforeEach(() => {
mockFn.mockClear(); // 호출 기록 초기화
});
test('calls mock once', () => {
mockFn('test');
expect(mockFn).toHaveBeenCalledTimes(1);
});
설명
beforeEach에서 mockClear()를 사용해 각 테스트마다 Mock 상태를 초기화합니다.
3. DOM 요소를 찾을 수 없음
개요
React Testing Library에서 요소가 즉시 렌더링되지 않아 발생하는 에러를 해결합니다.
코드 예제
import { render, screen, waitFor } from '@testing-library/react';
test('finds async element', async () => {
render(<AsyncComponent />);
const element = await screen.findByText('Loaded');
expect(element).toBeInTheDocument();
});
설명
findBy 쿼리를 사용하면 요소가 나타날 때까지 자동으로 기다립니다.
4. 환경변수 로딩 실패
개요
테스트 환경에서 환경변수가 제대로 로드되지 않는 문제를 해결합니다.
코드 예제
// jest.config.js
module.exports = {
setupFiles: ['<rootDir>/jest.setup.js']
};
// jest.setup.js
process.env.API_URL = 'http://test-api.com';
process.env.NODE_ENV = 'test';
설명
jest.setup.js 파일에서 환경변수를 설정하여 모든 테스트에서 사용할 수 있습니다.
5. 모듈 Mock이 작동하지 않음
개요
ES6 모듈을 Mock할 때 자주 발생하는 문제와 올바른 Mock 방법입니다.
코드 예제
// api.js를 Mock
jest.mock('./api', () => ({
fetchUser: jest.fn(() =>
Promise.resolve({ name: 'Test User' })
)
}));
import { fetchUser } from './api';
test('mocked api call', async () => {
const user = await fetchUser();
expect(user.name).toBe('Test User');
});
설명
jest.mock을 import 전에 호이스팅하여 모듈 전체를 Mock합니다.
6. Timer 함수 테스트 실패
개요
setTimeout, setInterval 등 타이머 함수를 사용하는 코드를 빠르게 테스트합니다.
코드 예제
jest.useFakeTimers();
test('executes after timeout', () => {
const callback = jest.fn();
setTimeout(callback, 1000);
jest.advanceTimersByTime(1000);
expect(callback).toHaveBeenCalled();
});
설명
useFakeTimers()로 타이머를 Mock하고 advanceTimersByTime()으로 시간을 건너뜁니다.
7. State 업데이트가 반영 안됨
개요
React 컴포넌트의 상태 변경 후 바로 테스트하면 실패하는 문제를 해결합니다.
코드 예제
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
test('updates state', async () => {
render(<Counter />);
const button = screen.getByText('Increment');
fireEvent.click(button);
await waitFor(() => {
expect(screen.getByText('Count: 1')).toBeInTheDocument();
});
});
설명
waitFor를 사용해 상태 업데이트와 리렌더링이 완료될 때까지 기다립니다.
8. API 호출 테스트 중 실제 요청 발생
개요
실제 API가 호출되지 않도록 axios나 fetch를 Mock하는 방법입니다.
코드 예제
import axios from 'axios';
jest.mock('axios');
test('fetches data without real API call', async () => {
const mockData = { id: 1, name: 'Test' };
axios.get.mockResolvedValue({ data: mockData });
const result = await fetchData();
expect(result).toEqual(mockData);
});
설명
axios 전체를 Mock하고 mockResolvedValue로 반환값을 지정합니다.
9. 스냅샷 테스트 계속 실패
개요
날짜, 랜덤값 등 동적인 값 때문에 스냅샷이 계속 바뀌는 문제를 해결합니다.
코드 예제
test('snapshot with dynamic values', () => {
const component = render(<UserCard />);
expect(component.asFragment()).toMatchSnapshot({
createdAt: expect.any(Date),
id: expect.any(String)
});
});
설명
동적인 값은 expect.any()를 사용해 타입만 검증하도록 합니다.
10. 테스트 간 데이터베이스 상태 충돌
개요
각 테스트마다 깨끗한 데이터베이스 상태를 보장하는 방법입니다.
코드 예제
beforeEach(async () => {
await database.clear();
await database.seed({
users: [{ id: 1, name: 'Test User' }]
});
});
afterAll(async () => {
await database.disconnect();
});
설명
beforeEach에서 DB를 초기화하고 필요한 데이터를 세팅합니다.
11. 콘솔 에러 경고 메시지 정리
개요
테스트 실행 중 불필요한 콘솔 메시지를 제거하여 가독성을 높입니다.
코드 예제
beforeAll(() => {
jest.spyOn(console, 'error').mockImplementation(() => {});
jest.spyOn(console, 'warn').mockImplementation(() => {});
});
afterAll(() => {
console.error.mockRestore();
console.warn.mockRestore();
});
설명
console 메서드를 spy하고 mock하여 테스트 출력을 깔끔하게 유지합니다.
12. Coverage 리포트가 부정확함
개요
테스트 커버리지가 실제와 다르게 표시되는 문제를 해결합니다.
코드 예제
// jest.config.js
module.exports = {
collectCoverageFrom: [
'src/**/*.{js,jsx,ts,tsx}',
'!src/**/*.test.{js,jsx,ts,tsx}',
'!src/index.js',
'!src/reportWebVitals.js'
],
coverageThreshold: {
global: { branches: 70, functions: 70, lines: 70 }
}
};
설명
collectCoverageFrom으로 측정할 파일을 정확히 지정하고 테스트 파일은 제외합니다.
마치며
이번 글에서는 Testing 트러블슈팅 가이드 완벽 정리에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.
관련 태그
#Testing #Jest #Mock #AsyncTest #Debugging
이 카드뉴스가 포함된 코스
댓글 (0)
함께 보면 좋은 카드 뉴스
Logging, Observability & Debugging 완벽 가이드
AI 에이전트 시대에 필수적인 로깅, 관측성, 디버깅 기법을 다룹니다. 구조화된 로깅부터 분산 추적, 성능 프로파일링까지 실무에서 바로 적용할 수 있는 핵심 기술을 익혀봅니다.
Ansible 성능 최적화와 디버깅 완벽 가이드
Ansible 플레이북의 실행 속도를 극적으로 향상시키고, 문제 발생 시 효과적으로 디버깅하는 방법을 다룹니다. 병렬 실행, 캐싱, SSH 최적화부터 디버그 모드와 프로파일링까지 실무에서 바로 적용할 수 있는 기법들을 소개합니다.
AI 에이전트 신뢰성 완벽 가이드 - 가드레일과 평가 시스템
AI 에이전트가 예상치 못한 행동을 하지 않도록 안전장치를 설계하고, 품질을 체계적으로 평가하는 방법을 배웁니다. 실무에서 바로 적용할 수 있는 가드레일 패턴과 평가 프레임워크를 다룹니다.
Flutter Flame 게임 테스팅과 디버깅 완벽 가이드
Flutter와 Flame 엔진으로 개발한 게임의 품질을 보장하는 테스팅 기법과 디버깅 도구를 다룹니다. 단위 테스트부터 골든 테스트, 크래시 리포팅까지 실무에서 바로 적용할 수 있는 내용을 담았습니다.
Cron과 Webhooks 완벽 가이드
Node.js 환경에서 자동화의 핵심인 Cron 작업과 Webhooks를 활용하는 방법을 다룹니다. 정기적인 작업 스케줄링부터 외부 서비스 연동까지, 실무에서 바로 적용할 수 있는 자동화 기법을 배워봅니다.