Skip to main content

JavaScript 팀을 위한 Jest 단위 테스트: 실용 가이드

Jest 단위 테스트를 설정부터 CI까지 배워보세요. mocks, TypeScript, coverage, 그리고 JavaScript 및 Capacitor 앱에 대한 최적의 관행을 다루는 실습 튜토리얼입니다.

JavaScript 팀을 위한 Jest 단위 테스트: 실용 가이드

A Capacitor release can pass its end-to-end checks and still ship a broken invoice calculation, stale feature flag, or platform-specific branch. The failure often starts earlier: a unit test still reflects the old behavior, a mock hides a changed dependency, or CI runs a different environment from the developer’s machine. By the time the bug reaches a phone or Electron desktop build, the test suite has provided confidence without providing protection.

그것이 왜 Jest 단위 테스트 실행할 수 있는 워크플로우 결정으로 가장 잘 다루어질 수 있습니다. 유용한 질문은 실제적인 것입니다: 개발자가 실패를 신뢰할 수 있는 속도, 어떤 경계가 격리되어야 하는지, CI에서 어떤 커버리지가 속해야 하는지, Jest가 프로젝트의 모듈 시스템과 피드백 기대에 맞는지 여부를 묻는 것입니다. 이 가이드는 Node 서비스, 웹 애플리케이션, Capacitor 프로젝트, Electron 앱에 걸쳐서 이러한 결정에 초점을 맞추고 있습니다. 더 광범위한 배포 흐름에서 자동화된 체크가 어디에 들어가야 하는지에 대한 더 자세한 내용은 최신 소프트웨어 워크플로우에서 자동화된 테스트.

워크플로우 결정,陈舊한 테스트 버그, 현대적인 테스트 전략을 설명하는 Why Jest Still Matters라는 그래픽을 참조하십시오.

목차

2026년 Jest 단위 테스트의 중요성

Jest는 단순히 진술 문법을 해결하는 것보다 더 많은 것을 해결한다. 팀에게는 반복 가능한 곳에서 비즈니스 논리 검증, 의존성 경계 제어, 커버리지 기대치를 강제하고 사용자에게 모바일 또는 데스크톱 패키지를 전달하기 전에 체크를 실행하는 곳이 있다. 이 워크플로우는 브라우저 셸, Capacitor WebView, Electron 렌더러, Node 프로세스와 함께 플랫폼 API 주변에서 실행되는 동일한 자바스크립트 동작에 중요하다.

Jest의 채택 또한 역사적인 무게를 가지고 있다. Facebook은 2011 에서 JavaScript 채팅 리작을 위해 만들었고 2014에서 오픈 소스화했으며 OpenJS 재단은 그것이 38,000 GitHub 개별 별점과 2022년 17만 명의 주간 다운로드, 그 수치가 더 높아지면서 43,000 개별 별점과 2024년 21만 명의 주간 다운로드 (OpenJS Foundation의 Jest 프로젝트 역사). 그 수치들은 모든 새로운 저장소에 Jest가 적합한지 증명하지는 않지만, 팀들이 종종 상속하는 mature한 생태계, familiar한 convention, 그리고 큰 수의 존재하는 예시를 설명한다.

단위 테스트를 생략하고 E2E 테스트만 사용하는 것은 초기에 비용이 저렴해 보이지만, 작은 실패가 전체 애플리케이션 실행, 장치 설정, 네트워크 경로, 플랫폼 특정 진단까지 모두 필요할 때 비용이 많이 들 수 있다. E2E 테스트는 중요한 출시 여정에 유용하지만, 계산 tax, 업데이트 매니페스트, 권한 결정, 저장소 어댑터, 오류 매핑과 같은 빠른 및 집중된 확인에 적합하지 않다.

실용적인 규칙: Jest의 생태계가 이주 위험을 줄이고, 개발자에게 신뢰할 수 있는 feedback를 제공하는 경우 Jest를 유지한다. 그러나 runner 자체가 일일 bottleneck가 된 경우 다른 runner를 고려한다.

이 안내서의 나머지 부분은 그 workflow를 따르며, 환경을跨하는 Jest를 구성하고, 행동에 초점을 맞춘 테스트를 작성하고, 유지 관리가 가능한 mock을 선택하고, CI 및 coverage에 연결하고, 대규모에서 flakiness를 줄이고, 의도적으로 keep-or-switch 결정을 한다.

환경을跨하는 Jest 설치 및 구성

작업을 시작하기 전에 가장 작은 구성 요소로 시작하세요. Node 서비스는 일반적으로 Jest의 기본 환경과 테스트 스크립트가 필요합니다. 브라우저에 접근하는 Capacitor 또는 Electron 모듈은 DOM-like 글로벌 변수가 필요하며, TypeScript는 디버깅, 모듈 호환성 및 시작 동작에 영향을 미치는 변형 결정이 필요합니다.

플레인 Node 프로젝트의 경우 패키지를 초기화하고 Jest를 개발 의존성으로 설치하세요:

npm init -y
npm install --save-dev jest
npx jest --init

생성된 구성은 시작점이 아닌 디자인 결론입니다. 테스트 환경, 변형, 모듈 별칭 및 설정 파일을 검토한 후에 커밋하세요.

TypeScript 변형을 의도적으로 선택하세요

ts-jest 이 옵션은 이미 TypeScript 컴파일러 동작에 의존하는 저장소가 있는 경우 개발자들이 친숙한 진단을 원할 때 편리합니다. @swc/jest 이 옵션은 변환 속도가 중요한 경우와 타입 체크가 별도의 명령으로 실행되는 경우에 유용합니다. 이 옵션은 타입 체커를 대체하지 않으며 ESM-heavy 패키지는 변형기 선택에 관계없이 추가 구성이 필요할 수 있습니다.

Option Node TypeScript Capacitor/Electron
Environment node node or project-specific jsdom DOM-facing code
변환 일반적으로 없음 ts-jest 또는 @swc/jest TypeScript 변환 및 DOM 설정
ESM 처리 패키지 형식 일치 변환기 지원 확인 플러그인 의존성 및 모듈 별칭 확인
일반적인 설정 최소 jest.config.ts setupFilesAfterEnv, 모의, 브라우저 API

A TypeScript configuration using ts-jest A TypeScript configuration이 사용됩니다.

import type { Config } from 'jest'

const config: Config = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
  clearMocks: true,
  collectCoverageFrom: ['src/**/*.{ts,tsx}'],
}

export default config

For Babel-based JavaScript or mixed repositories, keep the Babel file explicit:

module.exports = {
  presets: [
    ['@babel/preset-env', { targets: { node: 'current' } }],
    '@babel/preset-typescript',
  ],
}

Add only the browser shims your code needs

Capacitor and Electron tests frequently import code that expects window.matchMedia __CAPGO_KEEP_0__가 필요로 하는 브라우저 시뮬레이션만 추가하세요. IntersectionObserver__CAPGO_KEEP_0__ and Electron tests frequently import __CAPGO_KEEP_1__ that expects

Object.defineProperty(window, 'matchMedia', {
  writable: true,
  value: (query: string) => ({
    matches: false,
    media: query,
    onchange: null,
    addListener: () => {},
    removeListener: () => {},
    addEventListener: () => {},
    removeEventListener: () => {},
    dispatchEvent: () => false,
  }),
})

class MockIntersectionObserver {
  observe() {}
  unobserve() {}
  disconnect() {}
}

Object.defineProperty(window, 'IntersectionObserver', {
  writable: true,
  value: MockIntersectionObserver,
})

__CAPGO_KEEP_0__와 Electron 테스트는 자주 __CAPGO_KEEP_1__을 임포트하고 __CAPGO_KEEP_1__이 기대하는 transformIgnorePatterns and the package’s published format. Capacitor plugins can expose this problem when Jest ignores a dependency that still needs transformation. Jest’s newer releases have improved startup and memory behavior, but watch feedback can still trail ESM-focused alternatives in large projects (또는__CAPGO_KEEP_0__ and Electron tests frequently import __CAPGO_KEEP_1__ that expects experimentalVMModules __CAPGO_KEEP_0__와 Electron 테스트는 자주 __CAPGO_KEEP_1__을 임포트하고 __CAPGO_KEEP_1__이 기대하는 것을 확인합니다. 또는 __CAPGO_KEEP_0__와 Electron 테스트는 자주 __CAPGO_KEEP_1__을 임포트하고 __CAPGO_KEEP_1__이 기대하는 것을 확인합니다. (HTML 텍스트 조각은 더 긴 Capgo UI 문자열에서 가져옵니다. 부모 키는 `alternatives_cta_questions`입니다. 페이지/영역: Capacitor live-update alternatives 비교 페이지. 역할: 장기적인 마케팅 또는 법적 문구. 표시: 페이지 alternatives.astro. Capgo 제품/브랜드 및 개발자 용어를 정확하게 유지하세요. 메시지 키 `alternatives_cta_questions` (Alternatives CTA Questions). | HTML 텍스트 조각은 더 긴 Capgo UI 문자열에서 가져옵니다. 부모 키는 `appflow_cta_questions`입니다. 페이지/영역: Appflow 비교/이동 마케팅 복사본. 역할: 장기적인 마케팅 또는 법적 문구. 표시: 페이지 ionic-appflow.astro. Capgo 제품/브랜드 및 개발자 용어를 정확하게 유지하세요. 메시지 키 `appflow_cta_questions` (Appflow CTA Questions). | HTML 텍스트 조각은 더 긴 Capgo UI 문자열에서 가져옵니다. 부모 키는 `capwesome_cta_questions`입니다. 페이지/영역: Capawesome 비교 페이지. 역할: 장기적인 마케팅 또는 법적 문구. 표시: 페이지 capwesome.astro. Capgo 제품/브랜드 및 개발자 용어를 정확하게 유지하세요. 메시지 키 `capwesome_cta_questions` (Capwesome CTA Questions). | HTML 텍스트 조각은 더 긴 Capgo UI 문자열에서 가져옵니다. 부모 키는 `consulting_faq_subtitle`입니다. 페이지/영역: 컨설팅 서비스 페이지. 역할: 섹션 서브 타이틀 또는 태그 라인. 표시: 페이지 consulting.astro. Capgo 제품/브랜드 및 개발자 용어를 정확하게 유지하세요. 메시지 키 `consulting_faq_subtitle` (Consulting FAQ Subtitle). | 페이지/영역: Appflow 비교/이동 마케팅 복사본. 역할: 짧은 UI 레이블 또는 네비게이션 아이템. 표시: 페이지 ionic-appflow.astro, 페이지 ionic-enterprise-plugins.astro, 페이지 solutions/ionic-enterprise-plugins.astro. 메시지 키 `appflow_plugins_or` (Appflow Plugins Or). )

자바스크립트에 초점을 맞춘 설정.walkthrough를 위해 사용하세요. Capgo의 자바스크립트 단위 테스트 가이드를 참조하세요.. 실제 확인 명령어로 설치를 마무리하세요:

npx jest --runInBand

흡연 테스트가 통과하면 Jest가 프로젝트를 로드할 수 있음을 확인합니다. 그러나 프로덕션 및 테스트 모듈 그래프가 동일하게 동작하는지 확인하지는 않습니다. 따라서 ESM, DOM 및 플러그인 임포트 테스트를 작성하여 중요할 때 경로를 확인하세요.

첫 번째 신뢰할 수 있는 단위 테스트 작성

관찰 가능한 동작을 설명하는 유용한 단위 테스트는 제어된 환경에서 작동합니다. 준비, 실행, 확인 패턴은 의도한 것을 명확하게 유지합니다: 입력 및 종속성을 준비하고, 공개 함수를 호출한 다음 결과 또는 외부적으로 표시되는 효과를 확인합니다.

예를 들어, 인보이스 모듈이 이 함수를 내보내고 있다고 가정해 보겠습니다:

export function calculateInvoiceTotal(
  subtotal: number,
  taxRate: number,
  discountRate: number,
): number {
  const discounted = subtotal * (1 - discountRate)
  return Math.round(discounted * (1 + taxRate) * 100) / 100
}

테스트는 재정적 동작에 집중해야 하며, 지역 변수로 명명된 discounted:

import { calculateInvoiceTotal } from './calculateInvoiceTotal'

describe('calculateInvoiceTotal', () => {
  it('applies percentage discount before tax', () => {
    const subtotal = 100
    const taxRate = 0.2
    const discountRate = 0.1

    const total = calculateInvoiceTotal(subtotal, taxRate, discountRate)

    expect(total).toBe(108)
  })

  it('rounds the final amount to currency precision', () => {
    const total = calculateInvoiceTotal(19.99, 0.2, 0)

    expect(total).toBe(23.99)
  })
})

it 이름은 하나의 동작을 나타냅니다. 후속 리팩토링이 내부 계산을 변경하지만 계약을 유지한다면 이러한 테스트는 여전히 유용해야 합니다.

소프트웨어 개발에서 신뢰할 수 있는 단위 테스트를 작성하는 4 가지 필수 단계를 요약한 그래픽 목록입니다.

비동기 테스트도 동일한 discipline이 필요합니다. Jest의 resolves 그리고 rejects 기대하는 약속 결과를 명확하게 표현하세요:

it('returns an invoice from the API', async () => {
  await expect(fetchInvoice('invoice-123')).resolves.toMatchObject({
    id: 'invoice-123',
  })
})

it('rejects when the invoice is missing', async () => {
  await expect(fetchInvoice('missing')).rejects.toThrow('Invoice not found')
})

위험한 실수는 기대하는 것을 거부하는 것을 만드는 것입니다. 기다리지 않거나 반환하지 않는 것입니다. Jest에 초점을 맞춘 지침은 잊어버린 await 또는 return false positive를 일으키는 원인으로 선언문과 테스트를 만들지 마세요. 테스트가 실패 경로를 확인하지 않으면 테스트가 실패하지 않습니다.불안정한 자신감을 생산하는 세 가지 습관을 피하세요:비공개 도우미를 테스트하세요:

공개된 경계를 나타내는 의미 있는 도우미를 제외한 경우에만 노출된 동작을 테스트하세요.

  • Testing private helpers: Test the exported behavior unless the helper represents a meaningful public boundary.
  • 내부 상태를 확인하는 방법: 반환된 값, 발생한 이벤트, 저장된 레코드, 또는 표시된 출력을 선호하세요.
  • 콜 어설션을 과도하게 사용하는 경우: toHaveBeenCalled() 단독으로는 거의 아무것도 말하지 않습니다. 관련된 인수와 결과적인 동작을 확인하세요.

PR 체크리스트는 짧게 유지할 수 있습니다:

  • 각 테스트가 하나의 동작을 커버하는지 확인하세요.
  • 테스트가 Arrange, Act, Assert 순서를 따르는지 확인하세요.
  • 비동기적인 기대치를 기다리는지 확인하세요.
  • 의존성을 명확한 경계에서만 모킹하는지 확인하세요.
  • 테스트가 내부 리팩토링을 견딜 수 있는지 확인하세요.

컴포넌트에 특정한 예시의 경우 Capgo의 React 단위 테스트 가이드 동일한 동작 원칙을 렌더링된 출력과 사용자 인터랙션에 적용합니다.

실제로 확장되는 모킹 전략

모킹이 어려워질 때는 모든 단축이 유지 관리 의무를 부여합니다. 수동으로 작성된 jest.fn() can be exactly right for a callback. A module replacement can isolate an SDK. A network interceptor can preserve more of the application’s real request behavior. The choice should follow the seam you’re testing.

Consider a payment validator that calls a Stripe SDK, records an audit event, and reaches an HTTP risk service. A focused unit test might spy on the logger, replace the payment SDK, and intercept the risk request. Each technique controls a different boundary.

Stripe __CAPGO_KEEP_0__를 호출하는 결제 검증기, 감사 이벤트를 기록하고 HTTP 위험 서비스에 접근하는 경우, 로거에 대한 스파이를 사용하여 결제 __CAPGO_KEEP_1__를 대체하고 위험 요청을 인터셉트하는 단일 단위 테스트가 고려될 수 있습니다. 각 기술은 다른 경계를 제어합니다. 전략 설정 비용 정확도 유지 보수 부담
jest.fn() 최적 jest.spyOn() 또는 중점을 둔 지역에서 낮은 콜백, 로거, 주입 서비스
jest.mock() 중간 낮음에서 중간 빠르게 성장할 수 있습니다 비용이 많이 드는 사이드 이펙트를 가진 SDK, 모듈
MSW 중간 HTTP 경계에서 더 높음 중앙 집중식 요청 동작, 오류, 응답 계약

수동 스파이 (local decisions)

존재하는 의존성을 주입하고 테스트에서 관찰하거나 제어해야 하는 한 번의 상호 작용을 관찰할 때 스파이를 사용하십시오:

const audit = {
  record: jest.fn(),
}

const result = await validatePayment(input, {
  paymentClient,
  audit,
})

expect(audit.record).toHaveBeenCalledWith(
  expect.objectContaining({ event: 'payment.validated' }),
)
expect(result.status).toBe('approved')

테스트 케이스 간에 상태를 초기화하십시오. 공유 상태는 Jest 실패의 흔한 원인이며, 권고 사항은 mock clearing과 combine하여 호출 횟수 및 상태 누출을 방지하는 것을 권장합니다 (' beforeEach Jest 단위 테스트 마스터십중량급 SDK의 모듈 스파이).

Stripe 또는 네이티브 플러그인 모듈은 로드되면 즉시 설정을 수행합니다. 프로덕션 구현을 로드할 때 자격 증명, 네이티브 바인딩, 또는 무의미한 동작을 포함시키지 않도록 해당 모듈을 대체하십시오:

애플리케이션에서 반환된 값에 대한 테스트가 여전히 성공해야 합니다. 의미 있는 결과가 없는 __CAPGO_KEEP_0__ 호출 확인은 오직 mock이 구성된 것을 증명할 뿐입니다.

jest.mock('stripe', () => ({
  payments: {
    authorize: jest.fn(),
  },
}))

The test should still assert the value returned by the application. A passing SDK call assertion without a meaningful result can prove only that the mock was configured.

__CAPGO_KEEP_0__가 요청 생성, 응답 파싱, 재시도, 또는 오류 변환을 소유하고 있는 경우, MSW는 HTTP layer를 가로채면서 요청 경로를 보존할 수 있습니다:

For code that owns request construction, response parsing, retries, or error translation, MSW can intercept the HTTP layer while preserving the request path:

server.use(
  http.post('/risk/check', async () => {
    return HttpResponse.json({ decision: 'review' })
  }),
)

이것은 일반적으로 매 테스트마다 낮은 수준의 호출을 모킹하는 것보다 더 높은 자신감을 제공합니다. 또한 Node 및 브라우저와 같은 환경에서 응답 시나리오를 더 쉽게 이름付け하고 재사용할 수 있습니다. fetch 이것은 일반적으로 매 테스트마다 낮은 수준의 호출을 모킹하는 것보다 더 높은 자신감을 제공합니다. 또한 Node 및 브라우저와 같은 환경에서 응답 시나리오를 더 쉽게 이름付け하고 재사용할 수 있습니다.

Mock at the seam, not the seam itself.

Over-mocking은 통합 연결이 깨진 채로 테스트가 통과하는 테스트를 만들고, under-mocking은 실제 네트워크, 파일 시스템, 클록, 또는 데이터베이스를 유닛 테스트에 가져와 느리고 불확실한 스위트를 만듭니다. 순수 논리를 모든 I/O에서 자유롭게하고 경계 검증을 계약 또는 통합 테스트로 옮겨서 인터페이스가 중요할 때만 사용하세요.

Jest와 CI 및 Coverage Gates를 통합합니다.

CI는 두 가지 다른 질문에 답해야 합니다. 첫 번째로, 빠른 유닛 스위트는 안전하지 않은 변경을 거부합니까? 두 번째로, 더 느린 통합 검증은 중요한 경계가 여전히 작동합니까? 모든 테스트를 하나의 비분명한 명령으로 넣으면 feedback가 더 어려워지고 개발자가 테스트 스위트를 무시하게 됩니다.

Node 런타임을 고정하고 의존성 캐싱을 위해 lockfile를 사용하여 유닛 체크를 Jest의 CI 모드에서 실행하는 GitHub Actions 워크플로우는 다음과 같습니다.

name: test

on:
  pull_request:
  push:

jobs:
  unit:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node: [20, 22]
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          cache: npm
          cache-dependency-path: package-lock.json

      - run: npm ci
      - run: npm run test:unit, --ci --coverage

      - uses: actions/upload-artifact@v4
        with:
          name: coverage-${{ matrix.node }}
          path: coverage/

패키지 스크립트는 빠른 테스트와 통합 작업을 분리할 수 있습니다.

{
  "scripts": {
    "test:unit": "jest --runInBand tests/unit",
    "test:integration": "jest --runInBand tests/integration"
  }
}

위치값은 예시로, 실제 값은 저장소의 현재 기준선에서 설정하고 팀이 의미 있는 커버리지를 추가할 때 높여야 합니다. 엄격한 게이트는 생성된 또는 낮은 위험의 __CAPGO_KEEP_0__를 측정하는 경우에 급한 수정을 막을 수 있습니다. 느슨한 게이트는 중요한 경로가 무시되는 것을 허용할 수 있습니다.

module.exports = {
  collectCoverageFrom: ['src/**/*.{js,ts,tsx}'],
  coverageThreshold: {
    global: {
      branches: 70,
      functions: 80,
      lines: 80,
      statements: 80
    }
  }
}

https://docs.code.com/assets/images/help/repository/actions-illustration.png

Screenshot from https://docs.github.com/assets/images/help/repository/actions-illustration.png

대형 저장소의 경우, 테스트 격리 가 안정적일 때만 매트릭스 기반 샤딩을 사용하십시오. 각 샤드는 자신의 보고서에 명확한 소유권을 가지고 있어야 하며, 최종 상태는 pull request 에서 실패를 표시하도록 해야 하며 로그에 묻지 않도록 해야 합니다. 팀은 또한 HTML coverage 를 artifact 로 업로드하고 Codecov 또는 Coveralls 에 데이터를 게시할 수 있습니다. 단, 서비스가 보고서를 올바르게 병합하도록 구성되어 있어야 합니다. lcov Codecov 또는 Coveralls 에 데이터를 게시하려면, 서비스가 보고서를 올바르게 병합하도록 구성되어 있어야 합니다.

읽기 CI 운영 규칙 워크플로우 설계와 함께 CI 운영 규칙을 참조하십시오. 특히 여러 애플리케이션 이 하나의 저장소에 공유되는 경우입니다. Capgo의 CI/CD 통합 테스트 지침은 테스트 상태가 모바일 빌드 및 릴리즈 자동화와 연결되어야 할 때 유용합니다. 대규모 Jest 테스트를 신뢰할 수 있는 방법 대규모 Jest 테스트가 일관되게 통과하는 경우에도, 잘못된 것을 테스트하고 있는 경우가 있습니다. 테스트가 구현 세부 사항에 의존할 때, 스냅샷이 유용한 검토 범위 이상으로 커지거나, 공유된 모킹이 테스트가 구성한 것과는 거리가 먼 행동을 유발할 때, 신뢰가 떨어집니다.

스냅샷은 의도적으로 소유권을 가지고 있어야 합니다. 구조가 실제 계약인 경우, 예를 들어 안정적인 컴포넌트 또는 직렬화된 메시지의 경우 잘 작동합니다. 개발자가 출력을 검토하지 않고 광범위한 업데이트를 승인할 때는 소음만 발생합니다. 스냅샷을 의도적으로 다시 생성하고 diff 를 검토한 후 의미 있는 동작을 보호하는 파일을 제거하십시오.

Layer 를 사용하여 Jest 에 모든 것을 강요하지 마십시오.

각 테스트 Layer 에 좁은 작업을 부여하십시오.

테스트 격리 가 안정적일 때만 매트릭스 기반 샤딩을 사용하십시오. 각 샤드는 자신의 보고서에 명확한 소유권을 가지고 있어야 하며, 최종 상태는 pull request 에서 실패를 표시하도록 해야 하며 로그에 묻지 않도록 해야 합니다. 팀은 또한 HTML coverage 를 artifact 로 업로드하고 Codecov 또는 Coveralls 에 데이터를 게시할 수 있습니다. 단, 서비스가 보고서를 올바르게 병합하도록 구성되어 있어야 합니다.

Codecov 또는 Coveralls 에 데이터를 게시하려면, 서비스가 보고서를 올바르게 병합하도록 구성되어 있어야 합니다.

  • 순수 단위 테스트: 네트워크 또는 파일 시스템 접근이 없는 상태에서 결정론적인 계산, 파서, 리듀서, 정책 결정 및 오류 매핑을 확인합니다.
  • 계약 테스트: 모듈 경계, 어댑터 형태, 요청 페이로드 및 플러그인 대면 동작을 확인합니다.
  • 얇은 E2E 커버리지: 실제 사용자 여행을 Capacitor 또는 Electron 셸을 통해 작은 세트로 실행합니다.

이 구성은 단위 테스트를 빠르게 유지하면서 mocks가 생산을 대표하지 못하는 경계를 확인합니다. 또한 UI 경로를 통해 비싼 native 업데이트 또는 권한 흐름을 테스트하는 대신 JavaScript 결정 논리를 분리하는 일반적인 모바일 실패 모드를 피합니다.

한 가지 동작을 유지하십시오. it() 실패가 진단 가능하도록 유지하십시오. 호출 순서를만약 순서가 계약에 속한다면만 확인하십시오. 저장된 레코드를 노출하는 메서드를 가진 인 메모리 저장소와 같은 쿼리 가능한 가짜는 hardcoded 반환 값을 단순히 현재 implementation을 복사하는 것보다 더 좋은 feedback를 제공합니다.

통과 테스트는 사용자 또는 이웃 모듈이 오늘날의 code가 어떻게 구성되어 있는지에 대해 의존할 수 있는 것을 설명해야 합니다.

반복적인 테스트 건강 검진을 예약하십시오. 불안정한 테스트, 폐쇄된 스냅샷,冗余한 설정 및 mocks가 더 이상 생산 동작과 일치하지 않는 경우 검토하십시오. 낮은 가치의 테스트를 삭제하는 것이 이미 너무 많은 것을 숨기고 있는 테스트에 추가한 또 다른 확인을 추가하는 것보다 더 안전합니다.

CI dash보드에서 불안정성을 추적하세요. 테스트가 실패하는 경우 code 변경이 없다면, 실패 증거를 보존하고 공유 상태를 분리하고 시간과 난수를 제어하고, 실행자가 과부하일 때 워커 압력을 줄입니다. CI 머신에서 측정치를 기반으로 워커 한도를 설정하세요. 추가 병렬성은 경쟁을 증가시키고 스위트가 느려질 수 있으므로. 워커 설정을 실행자 구성과 함께 문서화하여 미래의 변경이 의도적으로 유지되도록 하세요.

팀의 결정 프레임워크 및 다음 단계

Jest는 이미 안정적인 스위트,established transforms 및 mocks, 그리고 팀이 실험적인 실행자보다 마이그레이션 안전성을 중요시하는 경우에 sound한 기본값입니다. 새로운 프로젝트가 ESM-first일 때, 네이티브 피드백이 우선순위인 경우, 또는 watch-mode 재실행이 개발을 중단하는 경우 비교 대안을 검토하세요. Benchmarks 결과는 저장소 아키텍처 및 트랜스포머 작업에 따라 크게 달라질 수 있으므로, 비교 결과를 방향성으로 대신하여 약속으로 간주하지 마세요.

사용할 기준 4가지:

  1. 기존 도구: Jest를 유지할 때, 구성, 테스트 유틸리티 및 CI convention이 이미 작동하는 경우.
  2. 모듈 형식: 실행자에 대해 다시 고려할 때, ESM-Only 의존성이 반복적으로 예외나 커스텀 워크아라운드가 필요할 때.
  3. 피드백 기대: 실제 저장소에서 대표적인 watch 변경을 측정하세요. 비어있는 데모 프로젝트가 아닌.
  4. 팀 능력: 팀이 구성하고 디버그할 수 있는 익숙한 실행자가 더 좋은 결과를 내는 경우가 있습니다. 더 빠른 도구를 잘못 사용하는 경우.

Vitest, Node의 내장 테스트 러너 및 Playwright는 서로 다른 요구 사항을 해결합니다. Playwright는 주로 브라우저 E2E 커버리지에 속합니다. Node의 러너는 집중된 Node 서비스에 적합합니다. Vitest는 일반적으로 초록색 필드 ESM 및 Vite-oriented 프로젝트에 적합합니다. Jest는 성숙한 모킹, 변환 및 기존 CI 규칙에 의존하는 팀에 적합합니다. 신뢰할 수 있는 경계를 유지하면서 feedback가 사용할 수 있는지 선택하세요.

실용적인 90일 재설정

1월, 스위트를 감사합니다. 플래키 테스트, 죽은 스냅샷, 구현 결합 진술, 실제 I/O를 수행하는 테스트에 대한 주인에게 assign하세요. 출력은 삭제, 수리 및 통합 커버리지가 필요한 경계를 기록한 작성 목록이여야 합니다.

2월, 디자인을 표준화하세요. 공유 테스트 유틸리티를 추가하세요, 모킹 규칙을 문서화하고 중요한 패키지에 대한 커버리지 보고서를 소개하세요. 게이트가 있는 패키지와 아직 집중 테스트가 부족한 동작을 기록하세요, 이래서 baseline은 검토할 수 있어야 합니다.

3월, 배달을 안정화하세요. CI 워커를 조정하세요, 단위 및 통합 작업을 분리하세요, 위험 기반 커버리지 Floor를 설정하세요, 그리고 living 문서에 규칙을 문서화하세요. pipeline은 동작할 수 있는 실패를 보고해야 하며, 새로운 테스트는 동일한 경계와 모킹 규칙을 따르야 합니다. TESTING.md. The pipeline should report actionable failures, while new tests follow the same boundaries and mocking rules.

정기적으로 스위트를 검토하세요. 더 이상 사용되지 않는 스냅샷, 중복된 설정, mocks를 제거하고, 더 이상 프로덕션 동작과 일치하지 않는 mocks를 제거하세요. 낮은 가치의 테스트는 다른 주장으로 강화하는 것보다 삭제하는 것이 더 안전할 수 있습니다. CI에서 불안정한 실패를 추적하고, 증거를 보존하고, 공유된 상태를 분리하고, 시간과 난수를 제어하고, 경쟁이 나타날 때 워커 압력을 줄이고, CI 머신에서 측정치를 사용하여 워커 제한을 설정하고, 러너 구성과 함께 문서화하세요.

이러한 관행은 더 광범위한 소프트웨어 개발 최선의 관행에 속합니다. Capacitor 또는 Electron 사용자를 위한 테스트된 자바스크립트修정을 목표로 하는 경우, Capgo은 목표 채널을 통해 signed 자바스크립트, CSS, 구성, 및 자산 번들을 전달할 수 있으며, 롤백 보호 및 릴리스 관찰성을 제공할 수 있습니다. 웹层 수정에 대한 매장 검토가 필요하지 않습니다.

Capacitor 또는 Electron 애플리케이션을 배포하는 팀이 있다면, Capacitor을 방문하여 Capgo 을 통해, 제어된 채널, 스테이징된 롤아웃, 및 롤백 보호를 사용하여, 라이브 자바스크립트 업데이트가 적합한 채널에 적합한지 평가하세요. 시작하기 위해 Jest 경계와 CI 게이트를 문서화하고, 다음으로 Capgo이 수정이 필요한 지속적인 전달을 위해 회복 경로에서 어디에 속하는지 정의하세요.

Capacitor 앱에 대한 즉각적인 업데이트

웹 레이어 버그가 활성화된 경우 Capgo을 통해 픽스를 배포하는 대신 앱 스토어 승인까지 기다리지 마세요. 사용자는 배경에서 업데이트를 받으면서 네이티브 변경은 일반적인 검토 경로를 따릅니다.

마틴의 인간 지원

시작하기

최신 뉴스

Capgo은 전문적인 모바일 앱을 만들기 위해 필요한 최고의洞察력을 제공합니다.