← 홈

🃏

⌘K
🤖
Claude Code AI 도구
🤗
Hugging Face AI 도구
🦜
LangChain AI 도구
🧠
Keras AI 도구
🦙
Ollama AI 도구
🐍
Python 프로그래밍 언어
🟨
JavaScript 프로그래밍 언어
🔷
TypeScript 프로그래밍 언어
⚛️
React 프로그래밍 언어
🐹
Go 프로그래밍 언어
🦀
Rust 프로그래밍 언어
📊
MATLAB 프로그래밍 언어
🗄️
SQL 프로그래밍 언어
⚙️
C/C++ 프로그래밍 언어
Java 프로그래밍 언어
🟣
C# 프로그래밍 언어
🍎
Swift 프로그래밍 언어
🟠
Kotlin 프로그래밍 언어
Next.js 프로그래밍 언어
💚
Vue.js 프로그래밍 언어
🔥
Svelte 프로그래밍 언어
🎨
Tailwind CSS 프로그래밍 언어
💚
Node.js 프로그래밍 언어
🌐
HTML 프로그래밍 언어
🎨
CSS/SCSS 프로그래밍 언어
🐘
PHP 프로그래밍 언어
💎
Ruby 프로그래밍 언어
🔴
Scala 프로그래밍 언어
📊
R 프로그래밍 언어
🎯
Dart 프로그래밍 언어
💧
Elixir 프로그래밍 언어
🌙
Lua 프로그래밍 언어
🐪
Perl 프로그래밍 언어
🅰️
Angular 프로그래밍 언어
🚂
Express.js 프로그래밍 언어
🐱
NestJS 프로그래밍 언어
🛤️
Ruby on Rails 프로그래밍 언어
◼️
GraphQL 프로그래밍 언어
🟪
Haskell 프로그래밍 언어
💚
Nuxt.js 프로그래밍 언어
🔷
SolidJS 프로그래밍 언어
htmx 프로그래밍 언어
💻
VS Code 개발 도구
🧠
PyCharm 개발 도구
📓
Jupyter 개발 도구
🧠
IntelliJ IDEA 개발 도구
💚
Neovim 개발 도구
🔮
Emacs 개발 도구
🔀
Git DevOps & CLI
🐳
Docker DevOps & CLI
☸️
Kubernetes DevOps & CLI
☁️
AWS CLI DevOps & CLI
🔄
GitHub Actions DevOps & CLI
🐧
Linux 명령어 DevOps & CLI
💻
Bash 스크립팅 DevOps & CLI
🌐
Nginx DevOps & CLI
📝
Vim DevOps & CLI
🔨
Makefile DevOps & CLI
🧪
Pytest DevOps & CLI
🪟
Windows DevOps & CLI
📦
패키지 매니저 DevOps & CLI
🍎
macOS DevOps & CLI
🏗️
Terraform DevOps & CLI
🔧
Ansible DevOps & CLI
Helm DevOps & CLI
🔨
Jenkins DevOps & CLI
🔥
Prometheus DevOps & CLI
📊
Grafana DevOps & CLI
💻
Zsh DevOps & CLI
🐟
Fish Shell DevOps & CLI
💙
PowerShell DevOps & CLI
🔄
Argo CD DevOps & CLI
🔀
Traefik DevOps & CLI
☁️
Azure CLI DevOps & CLI
☁️
Google Cloud CLI DevOps & CLI
📟
tmux DevOps & CLI
🔧
jq DevOps & CLI
✂️
sed DevOps & CLI
📊
awk DevOps & CLI
🌊
Apache Airflow DevOps & CLI
🔢
NumPy 데이터베이스 & 데이터
🐼
Pandas 데이터베이스 & 데이터
🔥
PyTorch 데이터베이스 & 데이터
🧠
TensorFlow 데이터베이스 & 데이터
📈
Matplotlib 데이터베이스 & 데이터
🐘
PostgreSQL 데이터베이스 & 데이터
🐬
MySQL 데이터베이스 & 데이터
🍃
MongoDB 데이터베이스 & 데이터
🔴
Redis 데이터베이스 & 데이터
🔍
Elasticsearch 데이터베이스 & 데이터
🤖
Scikit-learn 데이터베이스 & 데이터
👁️
OpenCV 데이터베이스 & 데이터
Apache Spark 데이터베이스 & 데이터
🪶
SQLite 데이터베이스 & 데이터
Supabase 데이터베이스 & 데이터
🔵
Neo4j 데이터베이스 & 데이터
📨
Apache Kafka 데이터베이스 & 데이터
🐰
RabbitMQ 데이터베이스 & 데이터
🔤
Regex 유틸리티
📝
Markdown 유틸리티
📄
LaTeX 유틸리티
🔐
SSH & GPG 유틸리티
🌐
curl & HTTP 유틸리티
📜
reStructuredText 유틸리티
🚀
Postman 유틸리티
🎬
FFmpeg 유틸리티
🖼️
ImageMagick 유틸리티
🔍
ripgrep 유틸리티
🔍
fzf 유틸리티
📗
Microsoft Excel 오피스 애플리케이션
📘
Microsoft Word 오피스 애플리케이션
📙
Microsoft PowerPoint 오피스 애플리케이션
📝
한컴 한글 한컴오피스
📽️
한컴 한쇼 한컴오피스
📊
한컴 한셀 한컴오피스
📄
Google 문서 Google Workspace
📊
Google 스프레드시트 Google Workspace
📽️
Google 프레젠테이션 Google Workspace
🔌
Cadence Virtuoso EDA & 하드웨어
⚙️
Synopsys EDA EDA & 하드웨어
💎
Verilog & VHDL EDA & 하드웨어
LTSpice EDA & 하드웨어
🔧
KiCad EDA & 하드웨어
📝
Notion 생산성 도구
💎
Obsidian 생산성 도구
💬
Slack 생산성 도구
🎮
Discord 생산성 도구
🎨
Figma 디자인 도구
📘
Confluence Atlassian
📋
Jira Atlassian
🃏
Jest 테스팅
Vitest 테스팅
🎭
Playwright 테스팅
🌲
Cypress 테스팅
🌐
Selenium 테스팅
💙
Flutter 모바일 개발
📱
React Native 모바일 개발
🍎
SwiftUI 모바일 개발
📱
Expo 모바일 개발
🐍
Django 웹 프레임워크
FastAPI 웹 프레임워크
🌶️
Flask 웹 프레임워크
🍃
Spring Boot 웹 프레임워크
🍸
Gin 웹 프레임워크
Vite 빌드 도구
📦
Webpack 빌드 도구
esbuild 빌드 도구
🐘
Gradle 빌드 도구
🪶
Maven 빌드 도구
🔧
CMake 빌드 도구
🎮
Unity 게임 개발
🤖
Godot 게임 개발
🔌
Arduino 임베디드 & IoT
🔍
Nmap 보안
🐕
Datadog 모니터링
📖
Swagger/OpenAPI 문서화
검색 결과가 없습니다
EN KO

기초

CLI 명령어

npm install --save-dev jest Jest 설치
npx jest 모든 테스트 실행
npx jest --watch 감시 모드
npx jest --coverage 커버리지 포함
npx jest path/to/test.js 특정 파일 실행
npx jest -t "test name" 매칭되는 테스트 실행
npx jest --verbose 상세 출력
npx jest --updateSnapshot 스냅샷 업데이트

테스트 구조

기본 테스트
test('adds 1 + 2 to equal 3', () => {
  expect(1 + 2).toBe(3);
});
it() 사용
it('should add numbers', () => {
  expect(add(1, 2)).toBe(3);
});
Describe 블록
describe('Calculator', () => {
  describe('add', () => {
    it('adds two numbers', () => {
      expect(add(1, 2)).toBe(3);
    });
  });
});
테스트 건너뛰기
test.skip('skipped test', () => {});
xtest('also skipped', () => {});
해당만 실행
test.only('only this runs', () => {});
fit('also only this', () => {});

매처

기본 매처

정확한 동등성
expect(value).toBe(expected);
깊은 동등성
expect(obj).toEqual({ a: 1, b: 2 });
Not
expect(value).not.toBe(expected);
참/거짓
expect(value).toBeTruthy();
expect(value).toBeFalsy();
expect(value).toBeNull();
expect(value).toBeUndefined();
expect(value).toBeDefined();
숫자
expect(value).toBeGreaterThan(3);
expect(value).toBeGreaterThanOrEqual(3);
expect(value).toBeLessThan(5);
expect(value).toBeLessThanOrEqual(5);
expect(0.1 + 0.2).toBeCloseTo(0.3);

문자열 및 배열 매처

문자열 매칭
expect('hello world').toMatch(/world/);
expect(str).toContain('substring');
배열 포함
expect([1, 2, 3]).toContain(2);
expect([{a: 1}, {b: 2}]).toContainEqual({a: 1});
배열 길이
expect([1, 2, 3]).toHaveLength(3);
객체 속성
expect(obj).toHaveProperty('name');
expect(obj).toHaveProperty('user.name', 'John');

예외 매처

에러 발생
expect(() => {
  throw new Error('error');
}).toThrow();

expect(() => fn()).toThrow('specific message');
expect(() => fn()).toThrow(Error);
비동기 에러
await expect(asyncFn()).rejects.toThrow();

비동기 테스팅

비동기 테스트

Async/await
test('async test', async () => {
  const data = await fetchData();
  expect(data).toBe('data');
});
Promise
test('promise test', () => {
  return fetchData().then(data => {
    expect(data).toBe('data');
  });
});
Resolves/Rejects
test('resolves', async () => {
  await expect(fetchData()).resolves.toBe('data');
});

test('rejects', async () => {
  await expect(fetchBadData()).rejects.toThrow();
});
Done 콜백
test('callback test', done => {
  fetchData(data => {
    expect(data).toBe('data');
    done();
  });
});

모킹

모의 함수

모의 함수 생성
const mockFn = jest.fn();
mockFn('arg1', 'arg2');

expect(mockFn).toHaveBeenCalled();
expect(mockFn).toHaveBeenCalledWith('arg1', 'arg2');
expect(mockFn).toHaveBeenCalledTimes(1);
반환값
const mockFn = jest.fn()
  .mockReturnValue('default')
  .mockReturnValueOnce('first')
  .mockReturnValueOnce('second');
모의 구현
const mockFn = jest.fn()
  .mockImplementation(x => x * 2);
비동기 모의
const mockFn = jest.fn()
  .mockResolvedValue('data')
  .mockResolvedValueOnce('first');

// Or
.mockRejectedValue(new Error('error'));

모듈 모킹

모듈 모킹
jest.mock('./module');

import { fetchData } from './module';
fetchData.mockResolvedValue('mocked data');
부분 모킹
jest.mock('./module', () => ({
  ...jest.requireActual('./module'),
  fetchData: jest.fn()
}));
axios 모킹
jest.mock('axios');
import axios from 'axios';

axios.get.mockResolvedValue({ data: 'mocked' });
모의 초기화
beforeEach(() => {
  jest.clearAllMocks();  // Clear calls
  jest.resetAllMocks();  // Reset implementations
  jest.restoreAllMocks(); // Restore original
});

스파이

메서드 스파이
const spy = jest.spyOn(object, 'method');
object.method();

expect(spy).toHaveBeenCalled();
spy.mockRestore();
구현 포함 스파이
const spy = jest.spyOn(console, 'log')
  .mockImplementation(() => {});

설정 및 정리

생명주기 훅

Before/After all
beforeAll(() => {
  // Runs once before all tests
});

afterAll(() => {
  // Runs once after all tests
});
Before/After each
beforeEach(() => {
  // Runs before each test
});

afterEach(() => {
  // Runs after each test
});
스코프된 훅
describe('group', () => {
  beforeEach(() => {
    // Only for tests in this describe
  });

  test('test 1', () => {});
  test('test 2', () => {});
});

스냅샷 테스팅

스냅샷

기본 스냅샷
test('matches snapshot', () => {
  const component = render(<Button />);
  expect(component).toMatchSnapshot();
});
인라인 스냅샷
test('inline snapshot', () => {
  expect(getData()).toMatchInlineSnapshot(`
    Object {
      "name": "John",
    }
  `);
});
속성 매처
expect(user).toMatchSnapshot({
  createdAt: expect.any(Date),
  id: expect.any(Number)
});

타이머 모킹

가짜 타이머

가짜 타이머 사용
jest.useFakeTimers();

test('timer test', () => {
  const callback = jest.fn();
  setTimeout(callback, 1000);

  jest.advanceTimersByTime(1000);
  expect(callback).toHaveBeenCalled();
});
모든 타이머 실행
jest.runAllTimers();
jest.runOnlyPendingTimers();
타이머 복원
afterEach(() => {
  jest.useRealTimers();
});

설정

jest.config.js

기본 설정
module.exports = {
  testEnvironment: 'node',
  roots: ['<rootDir>/src'],
  testMatch: ['**/*.test.js'],
  collectCoverage: true,
  coverageDirectory: 'coverage',
  coverageThreshold: {
    global: {
      branches: 80,
      functions: 80,
      lines: 80
    }
  }
};
셋업 파일
module.exports = {
  setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
  globalSetup: '<rootDir>/globalSetup.js',
  globalTeardown: '<rootDir>/globalTeardown.js'
};
모듈 매핑
module.exports = {
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1',
    '\\.(css|scss)$': 'identity-obj-proxy'
  }
};