🤖

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

⚠️

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

이미지 로딩 중...

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

CodeDeck AI

2025. 11. 8. · 20 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)

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

함께 보면 좋은 카드 뉴스

AWS Certificate Manager로 HTTPS 인증서 발급 완벽 가이드

AWS Certificate Manager를 사용하여 무료로 SSL/TLS 인증서를 발급받고, 로드 밸런서에 적용하여 안전한 HTTPS 웹 서비스를 구축하는 방법을 초급자도 쉽게 따라 할 수 있도록 단계별로 안내합니다.

Route 53으로 도메인 연결 완벽 가이드

AWS Route 53을 사용하여 도메인을 등록하고 실제 서비스에 연결하는 전 과정을 실무 스토리와 함께 쉽게 배워봅니다. DNS의 기본 개념부터 레코드 설정, ELB 연결까지 초급 개발자도 쉽게 따라할 수 있도록 구성했습니다.

AWS RDS 관리형 데이터베이스 완벽 가이드

직접 데이터베이스를 설치하고 관리하는 것이 부담스러운 초급 개발자를 위한 RDS 가이드입니다. 데이터베이스 엔진 선택부터 인스턴스 생성, 보안 설정, 백업까지 실무에 필요한 모든 내용을 다룹니다.

AWS Auto Scaling 완벽 가이드

트래픽 급증에 대비하는 자동 확장 시스템을 단계별로 구축합니다. AMI 생성부터 Auto Scaling Group 설정, 테스트까지 초급 개발자를 위해 실무 중심으로 설명합니다.

AWS 로드 밸런서와 보안 그룹으로 트래픽 분산 구성 완벽 가이드

초급 개발자를 위한 AWS 로드 밸런서와 보안 그룹 실습 가이드입니다. Application Load Balancer와 Network Load Balancer의 차이부터 보안 그룹 설정, 대상 그룹 생성, 실제 EC2 연결까지 실무에 필요한 모든 내용을 이북처럼 술술 읽히는 스타일로 담았습니다.