🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

Testing 기초부터 심화까지 완벽 가이드 - 슬라이드 1/13
C

CodeDeck AI

2025. 11. 8. · 42 Views

Testing 기초부터 심화까지 완벽 가이드

소프트웨어 테스팅의 기본 개념부터 고급 기법까지 단계별로 학습합니다. Unit Test, Integration Test, Mock, TDD 등 실무에 필요한 모든 테스팅 기법을 다룹니다.


카테고리:JavaScript
언어:JavaScript
메인 태그:#Testing
서브 태그:
#Jest#UnitTest#Mock#TDD

들어가며

이 글에서는 Testing 기초부터 심화까지 완벽 가이드에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. 첫_번째_유닛_테스트
  2. Matcher_활용하기
  3. 비동기_코드_테스트
  4. Mock_함수_사용
  5. Setup과_Teardown
  6. 모듈_Mocking
  7. 스냅샷_테스팅
  8. 예외_처리_테스트
  9. TDD_실습_예제
  10. 통합_테스트_기본
  11. 테스트_커버리지_확인
  12. Describe로_그룹화

1. 첫 번째 유닛 테스트

개요

가장 기본적인 유닛 테스트 작성법입니다. Jest를 사용하여 함수의 결과값을 검증합니다.

코드 예제

function add(a, b) {
  return a + b;
}

test('adds 1 + 2 to equal 3', () => {
  expect(add(1, 2)).toBe(3);
});

설명

test 함수로 테스트 케이스를 정의하고, expect로 예상 결과를 검증합니다. toBe는 값이 정확히 일치하는지 확인합니다.


2. Matcher 활용하기

개요

Jest의 다양한 Matcher를 사용하여 여러 조건을 테스트합니다.

코드 예제

test('다양한 matcher 사용', () => {
  expect(2 + 2).toBe(4);
  expect('Hello').toMatch(/ello/);
  expect([1, 2, 3]).toContain(2);
  expect({ name: 'John' }).toHaveProperty('name');
  expect(null).toBeNull();
});

설명

toBe는 정확한 일치, toMatch는 정규식 매칭, toContain은 배열 포함 여부, toHaveProperty는 객체 속성 검증에 사용됩니다.


3. 비동기 코드 테스트

개요

async/await를 사용하여 비동기 함수를 테스트합니다.

코드 예제

async function fetchData() {
  return Promise.resolve('data');
}

test('비동기 데이터 가져오기', async () => {
  const data = await fetchData();
  expect(data).toBe('data');
});

설명

비동기 함수 테스트 시 test 함수를 async로 선언하고, await로 결과를 기다린 후 검증합니다.


4. Mock 함수 사용

개요

Mock 함수를 생성하여 함수 호출 여부와 인자를 검증합니다.

코드 예제

const mockFn = jest.fn(x => x * 2);

test('mock 함수 테스트', () => {
  mockFn(2);
  expect(mockFn).toHaveBeenCalledWith(2);
  expect(mockFn).toHaveBeenCalledTimes(1);
  expect(mockFn(3)).toBe(6);
});

설명

jest.fn()으로 Mock 함수를 생성하고, 호출 횟수와 전달된 인자를 검증할 수 있습니다.


5. Setup과 Teardown

개요

각 테스트 전후로 실행되는 설정 및 정리 코드를 작성합니다.

코드 예제

let database;

beforeEach(() => {
  database = { users: [] };
});

afterEach(() => {
  database = null;
});

test('사용자 추가', () => {
  database.users.push('John');
  expect(database.users).toHaveLength(1);
});

설명

beforeEach는 각 테스트 전에, afterEach는 각 테스트 후에 실행되어 테스트 환경을 초기화합니다.


6. 모듈 Mocking

개요

외부 모듈을 Mock으로 대체하여 독립적인 테스트를 수행합니다.

코드 예제

jest.mock('./api');
const api = require('./api');

test('API 호출 mock', async () => {
  api.fetchUser.mockResolvedValue({ name: 'John' });
  const user = await api.fetchUser(1);
  expect(user.name).toBe('John');
});

설명

jest.mock()으로 모듈을 Mock으로 대체하고, mockResolvedValue로 반환값을 설정합니다.


7. 스냅샷 테스팅

개요

컴포넌트나 객체의 출력을 스냅샷으로 저장하여 변경사항을 추적합니다.

코드 예제

function formatUser(user) {
  return `${user.name} (${user.email})`;
}

test('사용자 포맷 스냅샷', () => {
  const user = { name: 'John', email: 'john@test.com' };
  expect(formatUser(user)).toMatchSnapshot();
});

설명

toMatchSnapshot()은 첫 실행 시 결과를 저장하고, 이후 실행에서 변경사항을 감지합니다.


8. 예외 처리 테스트

개요

함수가 올바르게 에러를 발생시키는지 검증합니다.

코드 예제

function divide(a, b) {
  if (b === 0) throw new Error('0으로 나눌 수 없습니다');
  return a / b;
}

test('0으로 나누기 에러', () => {
  expect(() => divide(10, 0)).toThrow('0으로 나눌 수 없습니다');
});

설명

에러를 발생시키는 함수는 화살표 함수로 감싸서 전달하고, toThrow로 에러 메시지를 검증합니다.


9. TDD 실습 예제

개요

테스트를 먼저 작성하고 구현하는 TDD(Test Driven Development) 방식입니다.

코드 예제

// 1. 테스트 먼저 작성
test('배열에서 중복 제거', () => {
  expect(removeDuplicates([1, 2, 2, 3])).toEqual([1, 2, 3]);
});

// 2. 구현
function removeDuplicates(arr) {
  return [...new Set(arr)];
}

설명

실패하는 테스트를 먼저 작성한 후, 테스트를 통과하는 최소한의 코드를 구현하는 방식입니다.


10. 통합 테스트 기본

개요

여러 모듈이 함께 동작하는지 확인하는 통합 테스트입니다.

코드 예제

class UserService {
  constructor(db) { this.db = db; }
  async createUser(name) {
    return this.db.insert({ name, createdAt: new Date() });
  }
}

test('사용자 생성 통합 테스트', async () => {
  const mockDb = { insert: jest.fn().mockResolvedValue({ id: 1 }) };
  const service = new UserService(mockDb);
  const user = await service.createUser('John');
  expect(mockDb.insert).toHaveBeenCalled();
  expect(user).toHaveProperty('id');
});

설명

여러 컴포넌트의 상호작용을 테스트하며, 의존성은 Mock으로 대체하여 제어 가능하게 만듭니다.


11. 테스트 커버리지 확인

개요

코드의 어느 부분이 테스트되었는지 확인하는 커버리지 측정입니다.

코드 예제

// package.json
{
  "scripts": {
    "test": "jest",
    "test:coverage": "jest --coverage"
  }
}

// 터미널에서 실행
// npm run test:coverage

설명

--coverage 옵션으로 테스트 커버리지를 측정하여 어떤 코드가 테스트되지 않았는지 확인할 수 있습니다.


12. Describe로 그룹화

개요

관련된 테스트들을 describe 블록으로 그룹화하여 구조화합니다.

코드 예제

describe('Calculator', () => {
  describe('덧셈', () => {
    test('양수 더하기', () => {
      expect(1 + 1).toBe(2);
    });
  });

  describe('뺄셈', () => {
    test('양수 빼기', () => {
      expect(5 - 3).toBe(2);
    });
  });
});

설명

describe 블록으로 테스트를 논리적으로 그룹화하여 가독성을 높이고 테스트 결과를 구조적으로 확인할 수 있습니다.


마치며

이번 글에서는 Testing 기초부터 심화까지 완벽 가이드에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.

관련 태그

#Testing #Jest #UnitTest #Mock #TDD

#Testing#Jest#UnitTest#Mock#TDD#JavaScript

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.