컨텍스트: Capgo 마케팅 웹사이트. 역할: 짧은 UI 레이블 또는 네비게이션 아이템. seen in: component BlogAuthorByline.astro. 메시지 키 `content_marketer` (Content Marketer).
자바스크립트 단위 테스트: 포괄적인 2026 년 가이드 Capacitor and __CAPGO_KEEP_0__ 컨텍스트: Live updates 제품 페이지. 역할: 섹션 또는 페이지 제목. seen in: page live-update.astro. Capgo 제품/브랜드 및 개발자 용어를 정확하게 유지하십시오. 메시지 키 `live_update_platform_capacitor_title` (Live Update Platform Capacitor Title).
그리고
목차
- 자바스크립트 테스트 프레임워크를 선택하는 방법
- 프로젝트 설정과 첫 번째 테스트
- Code과 비동기 __CAPGO_KEEP_1__을 마스터하십시오
- 강도 높은 테스트 전략
- CI, Capacitor, 및 Electron 앱을 위한 테스트
- 자바스크립트 단위 테스트에 대한 자주 묻는 질문
자바스크립트 테스트 프레임워크를 선택하는 방법
전문적인 자바스크립트 프로젝트에는 실제 테스트 러너가 필요합니다. 일회성 스크립트와 수동 콘솔 확인은 여러 엔지니어가 동일한 코드베이스에 접근하는 경우에 확장되지 않습니다. 테스트 발견, 진술, 비동기 처리, 모킹, 그리고 로컬 개발 및 CI에서 모든 것을 일관되게 실행할 수 있는 방법이 필요합니다.
현재 지침은 대중적인 옵션의 작은 집합으로 수렴하고 있습니다. Jest, Mocha, Jasmine 는 반복적으로 주류 프레임워크로 강조되고 있으며 Jest 는 내장 테스트 구조, 진술, 모킹, 비동기 지원을 하나의 패키지에 제공하는 것으로 자주 단독으로 언급됩니다. 이 Pluralsight 자바스크립트 테스트 랩.

자바스크립트 테스트 프레임워크의 인기 있는 비교 차트, Jest, Mocha, Cypress, Playwright 포함.
프레임워크는 필수적입니다.
프레임워크는 공유된 언어를 제공합니다:
- 테스트 구조 및
describe또는test의사 진술it - 가독성 있는 매처 호크
- 설정 및 해제 비동기 지원
- 프로미스 및 타이머 모킹 도구
- 테스트 구조 외부 의존성에 대해
팀이 단위 테스트 자동화 이외의 더 광범위한 테스트 자동화 관점이 필요하다면 Capgo는 앱 배포 워크플로우에서 자동화된 테스트에 대한 유용한 개요를 제공합니다. 자동화된 테스트에 대한 앱 배포 워크플로우.
Jest vs Mocha 한눈에 보기
Jest와 Mocha는 서로 다른 철학을 대표합니다.
Jest 모든 것을 갖춘 옵션입니다. 대부분의 팀이 첫날부터 필요한 것을 제공합니다.
Mocha 모듈러 옵션입니다. 실행자만 제공하고 나머지 스택을 조립해야 합니다.
| 기능 | Jest | Mocha |
|---|---|---|
| 설정 복잡도 | 대부분의 팀에서 낮음 | 추가로 어설션 및 모킹 라이브러리를 추가하는 경우 더 높음 |
| 어설션 | 내장 | 다른 라이브러리와 함께 pair되는 경우 일반적 |
| 모킹 | 내장 | 다른 라이브러리와 함께 pair되는 경우 일반적 |
| async 테스트 | 내장 및 직관적 | 지원되지만, 주변 설정에 따라 더 많이 의존 |
| 테스트 커버리지 워크플로우 | 통합된 도구 chain 에서 일반적으로 통합됩니다. | 자주 더 많은 조각으로 구성되어 있습니다. |
| 최적화 | 새로운 프로젝트, 일관성을 원하는 팀 | New projects, teams that want consistency |
Legacy stacks, teams that want modular control Practical rule:
If your team has to ask which assertion library and mocking library to pair with the runner, you probably want Jest.
What I recommend for most teams Jest Jest unless the codebase already has strong reasons to stay on Mocha. That recommendation gets stronger when the application includes Capacitor 또는 ElectronElectron
그것은 이미 충분히 움직이는 부분이 많기 때문에.
모카는 노드.제이에스 서비스의 오래된 버전이나 오래된 코드베이스에서 여전히 의미가 있습니다. 그러나 중급 엔지니어가 처음부터 강력한 테스트 스위트를 설정하는 경우, 제스트는 더 많은 마찰을 일으키지 않습니다.
프로젝트 설정 및 첫 번째 테스트
프로젝트 설정과 첫 번째 테스트

안경을 쓴 남자가 목재 책상 위에 노트북을 작업하는 모습입니다.
간단한 제스트 설정 package.jsonJavaScript 프로젝트가 이미 가지고 있는 것을 시작하세요. 그런 다음 제스트를 개발 의존성으로 추가하고 테스트 스크립트를 연결하세요.
{
"scripts": {
"test": "jest"
}
}
많은 프로젝트에 대해 충분합니다. 모듈 시스템, 전처리, 또는 모노레포 구조가 필요로 할 경우 나중에 추가할 수 있습니다.
로컬 Capacitor 앱을 빌드하고 공유 로직 주변 테스트를 추가하기 전에 개발 환경을 정리하고 싶다면 Capgo의 Capacitor 로컬 환경 설정 가이드는 실용적인 동반자입니다. Capacitor 로컬 환경 설정 __CAPGO_KEEP_0__를 작성하기 전에 테스트를 작성하세요.
테스트를 작성하기 전에 code
테스트를 먼저 작성하세요. , 테스트를 __CAPGO_KEEP_0__로 구성하고, 그리고 __CAPGO_KEEP_1__로 테스트를 구성하세요. describe and it의 진술에 대해 __CAPGO_KEEP_1__를 프레임하세요. expect(...) 자바스크립트 단위 테스트 지침에서 __CAPGO_KEEP_0__.
code을 설계하는 방식이 바뀌기 때문에 중요하다. 테스트-첫 번째로 변경은 함수가 더 작아지며, 의존성이 더 명확해지고, 논리가 순수해야 하는 부분에 영향을 주지 않는다.
이것을 보여주기 위해 최소한의 예를 들어보자.
// math.js
function addTax(amount, rate) {
return amount + amount * rate;
}
module.exports = { addTax };
// math.test.js
const { addTax } = require('./math');
describe('addTax', () => {
it('returns the amount with the tax applied', () => {
expect(addTax(100, 0.2)).toBe(120);
});
});
Arrange Act Assert를 항상 사용하라.
The Arrange 입력과 필요한 설정을 준비한다.
- Act 함수를 호출한다.
- Assert 결과에 대해 확인한다.
- Assert Use Arrange Act Assert every time
적용된 유효성 검사 도우미:
function isSupportedPlatform(platform) {
return ['ios', 'android', 'web', 'desktop'].includes(platform);
}
describe('isSupportedPlatform', () => {
it('returns true for ios', () => {
// Arrange
const platform = 'ios';
// Act
const result = isSupportedPlatform(platform);
// Assert
expect(result).toBe(true);
});
});
작은 테스트는 시간이 지남에 따라 잘 유지된다. 테스트는 일반적으로 하나의 질문에 답해야 하며, 전체 워크플로를 설명하는 것이 아니다.
Capacitor와 Electron 프로젝트에 적용되는 경우, 이러한 discipline는 더 중요하다. 순수 논리 부분이 네이티브 또는 데스크톱 통합과 함께 있기 때문이다. code을 제외하고, 비즈니스 규칙을 테스트할 수 있도록 플랫폼 런타임을 제거하고, 첫 번째 테스트가 마지막으로 유용한 테스트가 될 수 있도록 한다.
Mocking과 비동기 Code를 마스터하라
애플리케이션 code의 대부분의 버그는 두 숫자를 더하는 것에서 오지 않는다. 그들은 code이 외부로 벗어나서 발생한다: 네트워크 요청, 파일, 플러그인 API, 타이머, IPC 채널, 저장層.
그것은 mocking이 도와준다. 경계를 제어할 수 있기 때문에 테스트는 code의 결정-making에 집중할 수 있다.

경계를 mocking하는 것만큼 중요하다.
유지보수 가능한 테스트 지침은 단일 동작 커버리지 그리고 강한 하나의 테스트 선언JavaScript 단위 테스트에서 mocks를 과도하게 사용하면 테스트가 구현 세부 사항에 강하게 결합되고 brittleness가 발생한다는 경고를 받습니다. 이 경고는 JavaScript에서 매우 중요합니다. 유지 보수 가능한 단위 테스트에 대한 TestRail 기사.
JavaScript에서 이 경고가 중요합니다. 팀은 종종 모든 임포트 모듈을 mocks로 시작하고 함수가 다른 함수를 호출하는 올바른 순서를 테스트하는 대신 실제 동작을 테스트하는 대신 테스트를 끝내려고 합니다.
mock-heavy 테스트의 나쁜 목표:
- helper A가 helper B를 호출했는지
- 서비스 C가 serializer D를 호출했는지
- 내부 private 함수가 두 번 실행되었는지
mock-heavy 테스트의 좋은 목표:
- 함수가 반환한 값을
- 실패한 의존성을 올바르게 처리했는지
- 데이터를 기대하는 형태로 변형했는지
Electron과 함께 Capacitor와 code의 더 좋은 패턴
모바일 및 데스크톱 앱에서, 나는 네이티브 또는 플랫폼 API에 대한 wrapper layer를 선호한다. 그런 다음 단위 테스트는 wrapper를 모킹하고, 플랫폼 자체를 모킹하지 않는다.
예제 구조:
// cameraGateway.js
async function getPhoto(cameraPlugin) {
return cameraPlugin.getPhoto();
}
module.exports = { getPhoto };
// profilePhotoService.js
async function loadProfilePhoto(cameraGateway) {
const photo = await cameraGateway.getPhoto();
return { path: photo.path, ready: true };
}
module.exports = { loadProfilePhoto };
// profilePhotoService.test.js
const { loadProfilePhoto } = require('./profilePhotoService');
test('returns mapped photo data', async () => {
const fakeCameraGateway = {
getPhoto: jest.fn().mockResolvedValue({ path: '/tmp/pic.jpg' })
};
const result = await loadProfilePhoto(fakeCameraGateway);
expect(result).toEqual({ path: '/tmp/pic.jpg', ready: true });
});
이 패턴은 Electron에도 적용된다. Wrap ipcRenderer, 파일 접근 또는 셸 통합을 얇은 어댑터 뒤에 감싸라. 단위 테스트는 서비스层를 직접적으로 타격하지 않는다.
팀이 Capacitor 앱의 릴리스 로직 및 업데이트 경로를 테스트하고자 할 때, Capgo은 Capacitor OTA 업데이트를 mock 시나리오와 함께 테스트하는 관련된 가이드를 가지고 있다. 테스트 Capacitor OTA 업데이트와 가상 시나리오를 사용한 테스트.
비동기 흐름을 테스트하는 방법
테스트할 때 __CAPGO_KEEP_0__이 promise를 반환할 때,
Use async/await 테스트할 때 code이 promise를 반환할 때,
async function fetchProfile(api) {
const response = await api.getUser();
return response.name;
}
test('returns the user name from the API response', async () => {
const api = {
getUser: jest.fn().mockResolvedValue({ name: 'Ava' })
};
const result = await fetchProfile(api);
expect(result).toBe('Ava');
});
테스트할 때 __CAPGO_KEEP_0__이 promise를 반환할 때,
test('throws when the API request fails', async () => {
const api = {
getUser: jest.fn().mockRejectedValue(new Error('network failed'))
};
await expect(fetchProfile(api)).rejects.toThrow('network failed');
});
테스트할 때 __CAPGO_KEEP_0__이 promise를 반환할 때,
고급 테스트 전략
code 변경 후에도 유용한 테스트 스위트가 되도록 하세요. 그게 테스트가 통과하는 테스트의 쌓임보다 어려울 때가 많습니다.

테스트 비용을 사용하세요
실용적인 지침은 단일 테스트, 통합 테스트, 종합 테스트를 나누어 테스트를 진행하는 것을 추천합니다. 70/20/10 단위 테스트는 가장 빠른 피드백과 가장 안정적인 실패를 제공합니다. 단일 테스트 스위트는 10초 이내에 완료되어야 하며, 미리 커밋 체크는 5초 이내에 완료되어야 합니다.이 이이 이이 OpenReplay 테스트 가이드.
나는 그것을 예산 관리 도구로 대신 종교로 생각하지 않는다. 대부분의 노력은 종단 간 테스트에 들어가면, 팀은 너무 오래 기다려야 한다. 만약 모든 것이 단위 테스트만이라면, 실제 시스템 경계를 놓치게 될 것이다.
Capacitor 또는 Electron 앱의 경우, 건강한 균형은 보통 다음과 같다:
- 단위 테스트 가격 로직, 권한 규칙, 직렬화, 업데이트 적합성, 기능 플래그 및 상태 변환에 대한 테스트
- 통합 테스트 저장소 어댑터, 플러그인 래퍼 및 IPC 계약에 대한 테스트
- 종단 간 테스트 로그인, 구매 흐름, 동기화 또는 업데이트 프롬프트와 같은 몇 가지 крит적인 여행에 대한 테스트
보장은 등대만큼 중요하지 않다
보장 보고서는 중요한 논리에서 테스트되지 않은 branch를 찾을 수 있는 도움이 될 때 유용하다. 그러나 팀이 보장 퍼센트를 위해만 노력할 때는 해롭다.
주의 깊은 edge-case 테스트를 가진 로그인 검증기는 가치가 더 많다. 특히 입력-heavy code인 양식, 파서, 날짜 논리 및 권한 검사와 같은 UI에 대한 품질을 강화하는 팀에게 특히 그렇다. 만약 팀이 유효성 검사-heavy UI를 강화하고 있다면, 이 가이드에 대해 프론트엔드 폼 유효성 검증을 마스터하는 방법 단위 테스트 수준의 전략에 좋은 보완입니다.
행동 기반 테스트는 리팩토링을 견딘다
신뢰할 수 있는 테스트 세트는 내부를 리팩토링할 때 반드시 다시 테스트를 작성하지 않아도 됩니다. 그 방법은 구현 세부 사항 대신에 관찰 가능한 행동을 주장하는 것입니다. 관찰 가능한 행동을 주장하는 대신에 구현 세부 사항을 주장하는 것입니다. 유지할 수 있는 사용 사례:
경계 조건
- 빈 입력, null과 같은 값, 유효하지 않은 타입, oversized 문자열과 같은 것 도메인 결과
- 권한이 없는 경우 반환되지 않는다 상태 전환
- 상태 전환 예를 들어 “다운로드 메타데이터가 유효화된 후 pending 상태로 표시한다”
자주 변하는 사용 사례:
- 내부 헬퍼 호출을 검사하는 경우
- 사용자 정의 메서드 호출 순서를 확인하는 경우
- 호출 chain의 모든 layer를 모킹하는 경우
disciplined release 프로세스를 구축하는 앱 팀에게 Capgo의 애플리케이션 품질 보증 관련된 릴리스 PIPELINE과 테스트 작업을 연결하는 것이 유용합니다.
CI, Capacitor, 및 Electron 앱을 위한 테스트
개발자 한 명의 머신에서만 실행되는 테스트는 안전망이 아닙니다. 그것은 지역 습관입니다.
CI는 단위 테스트 자바 스크립트 작업을 팀 인프라로 변환합니다. 매 push, pull request, 또는 릴리스 branch에서 동일한 명령어와 동일한 기대치를 실행할 수 있습니다. 이러한 일관성은 Capacitor 및 Electron 프로젝트에서 환경 드리프트가 미묘한 실패를 유발할 때 더 중요합니다.
CI를 기본 실행 경로로 설정하십시오
CI는 최소한으로 의존성 설치 및 변경 집합에 대한 단위 테스트 스위트를 실행해야 합니다. 가능할 때마다 로컬 개발과 동일한 명령어를 유지하세요.
GitHub Actions 워크플로우의 기본적인 것은 다음과 같습니다:
name: test
on: [push, pull_request]
jobs:
unit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
- run: npm test
이 정도면 깨진 임포트, 실패한 어설션, 그리고 메인에 도착하기 전에 의도치 않은 플랫폼 가정까지 잡을 수 있습니다.
Capgo 앱을 위한 CI/CD 설정에 대한 Capgo의 실용적인 가이드가 있습니다. Capacitor 플러그인 상호 작용 테스트.
Capacitor 플러그인 테스트
The wrong way to unit test Capacitor code is to pull native plugins directly into every service. That couples your test suite to the platform bridge.
더 좋은 패턴은 얇은 추상화입니다.
// deviceStorage.js
async function saveFile(filesystem, path, data) {
return filesystem.writeFile({ path, data });
}
module.exports = { saveFile };
// draftService.js
async function persistDraft(storage, draft) {
await storage.save('draft.json', JSON.stringify(draft));
return { saved: true };
}
module.exports = { persistDraft };
// draftService.test.js
const { persistDraft } = require('./draftService');
test('persists a serialized draft', async () => {
const storage = {
save: jest.fn().mockResolvedValue(undefined)
};
const result = await persistDraft(storage, { title: 'Hello' });
expect(result).toEqual({ saved: true });
});
__CAPGO_KEEP_0__ Electron 메인 렌더러 및 IPC 테스트
Testing Electron main renderer and IPC code
__CAPGO_KEEP_0__ 메인 프로세스 code 및 code. 테스트에서 그들을 흐리게 하지 마십시오.
신뢰할 수 있는 설정은 일반적으로 다음과 같이 분리합니다:
- 렌더러 단위 테스트 뷰 모델, 상태, 형식, 및 UI 측면의 비즈니스 로직
- 메인 프로세스 단위 테스트 메뉴, 파일 작업, 및 앱 라이프 사이클 결정
- IPC 계약 테스트 메시지 형태 및 예상 응답
예제 IPC wrapper:
// ipcGateway.js
function sendSettings(ipcRenderer, payload) {
ipcRenderer.send('settings:update', payload);
}
module.exports = { sendSettings };
// ipcGateway.test.js
const { sendSettings } = require('./ipcGateway');
test('sends settings update over ipc', () => {
const ipcRenderer = { send: jest.fn() };
sendSettings(ipcRenderer, { theme: 'dark' });
expect(ipcRenderer.send).toHaveBeenCalledWith('settings:update', { theme: 'dark' });
});
If you later change the internal implementation from one helper to another, this test still holds because it verifies the behavior that matters. That’s the standard you want across desktop and mobile code.
자바스크립트 단위 테스트에 대한 자주 묻는 질문
단위 통합 및 E2E 테스트 간의 차이점
A 단위 테스트 단위 테스트는 하나의 작은 논리 조각을 분리된 상태에서 검사합니다. 통합 테스트 통합 테스트는 몇 가지 구성 요소 또는 서비스가 올바르게 작동하는지 확인합니다. 끝-to-끝 테스트 사용자 여행을 통해 실행 중인 애플리케이션을 시뮬레이션합니다.
사업 규칙에 대한 빠른 자신감을 위해 단위 테스트를 사용하십시오. 통합 테스트를 사용하여 저장소, 플러그인 wrapper 및 IPC와 같은 접합부를 테스트하십시오. E2E 테스트는 사용자 워크플로우가 중단되면 심각한 영향을 미칠 경우에만 적극적으로 사용하십시오.
완전한 커버리지에 대한 목표를 설정해야 하나요
아니요. 완전한 커버리지가 팀을 저가 테스트로 밀어넣을 수 있습니다.
coverage는 유용할 때가 있는데, nobody가 실행하지 않은 code를 노출시킬 때입니다. 그러나 엔지니어가 dashboard를 만족시키기 위해 얕은 주장을 추가하는 것은 유용하지 않습니다. 만약 테스트 스위트가 약한 경우, 더 많은 coverage로 그것을 구원할 수 없습니다.
How do we add tests to an existing codebase?
변경이 이미 발생하는 곳에서 시작하세요. 팀을 멈추고 테스트 전략의 대규모 재작성을 발표하지 마세요.
실용적인 순서는 다음과 같습니다:
- 활성 code를 보호하세요 기능 개발이나 버그 수정 중에 수정한 모듈에 테스트를 추가하세요
- 순수 논리를 추출하세요 비즈니스 규칙을 프레임워크나 런타임 노이즈 없이 테스트할 수 있도록 하드-to-test 파일에서 논리를 분리하세요
- 네이티브 플러그인, 네트워크 클라이언트, 파일 시스템 호출, Electron IPC에 대한 접근 지점 wrapper를 추가하세요 약한 패턴을 거부하세요
- mock을 도입할 때는 지침을 따르세요. Guidance from 자바스크립트 테스트 최적화 방법 이것은 특히 자주 놓치게 되는 오버-모킹과 그에 따른 불안정한 테스트를 강조하는 데 유용합니다.
목표는 즉시 완벽함이 아닌, 회귀가 팀에게 가장 큰 비용을 지불하는 곳에서 꾸준히 개선하는 것입니다.
팀이 제품을 출시할 때 Capacitor or Electron CapacitorJS Capgo CapacitorJS와 Electron 앱에 대해 Live Update를 제공하며, 롤아웃 제어와 관찰성을 제공하여 팀이 단위 테스트와 함께 웹 번들 변경을 안전하게 출시할 수 있는 방법을 제공합니다.