ã2026幎çãJestã®å§ãæ¹ â ã»ããã¢ããããæåã®ãŠããããã¹ããŸã§å®å šã¬ã€ã
- ãã¹ãã®çš®é¡ïŒãŠããã/çµ±å/E2EïŒã®çè§£
- JestãŸãã¯Vitestã®ã»ããã¢ãã
- describe/test/expect ã䜿ã£ãåºæ¬ãã¹ãã®æžãæ¹
- ã¢ãã¯ïŒjest.fn/vi.fnïŒã®åºæ¬
ã»ããã¢ããïŒVitestã®å ŽåïŒ
# Viteãããžã§ã¯ããžã®ã€ã³ã¹ããŒã«
npm install -D vitest @vitest/coverage-v8
# package.json ã«è¿œå
# "scripts": { "test": "vitest", "coverage": "vitest run --coverage" }
ã¯ãããŠã®ãã¹ã
// src/utils/math.ts
export function add(a: number, b: number): number {
return a + b;
}
export async function fetchUser(id: number): Promise<{ name: string }> {
const res = await fetch(`/api/users/${id}`);
return res.json();
}
// src/utils/math.test.ts
import { describe, test, expect, vi } from 'vitest';
import { add, fetchUser } from './math';
describe('add颿°', () => {
test('æ£ã®æ°ã®è¶³ãç®', () => {
expect(add(1, 2)).toBe(3);
});
test('è² ã®æ°ã®è¶³ãç®', () => {
expect(add(-1, 1)).toBe(0);
});
});
describe('fetchUser颿°', () => {
test('ãŠãŒã¶ãŒãååŸã§ãã', async () => {
// fetchãã¢ãã¯
global.fetch = vi.fn().mockResolvedValue({
json: () => Promise.resolve({ name: 'ã²ãã' }),
} as Response);
const user = await fetchUser(1);
expect(user.name).toBe('ã²ãã');
expect(fetch).toHaveBeenCalledWith('/api/users/1');
});
});
ããããè©°ãŸããã€ã³ã
Q: import ã䜿ããªããšã©ãŒãåºãïŒJestã®ESM察å¿ïŒ
â Jestã¯ããã©ã«ãã§ESMã«å¯Ÿå¿ããŠããŸãããtransform ã®èšå®ã --experimental-vm-modules ãã©ã°ãå¿
èŠã§ããæ°èŠãããžã§ã¯ãã§ã¯ESMã«æšæºå¯Ÿå¿ããVitestã®æ¹ãèšå®ã楜ã§ãã
Q: ã¢ãã¯ãå¹ããªãïŒvi.mockãåããªãïŒ
â vi.mock('ã¢ãžã¥ãŒã«ãã¹') ã¯ãã¡ã€ã«ã®å
é ïŒãã€ã¹ãïŒã«ç§»åããããããã€ã³ããŒãæããåã«å®è¡ãããŸãããã¹ãå
ã§åçã«ã¢ãã¯ãããå Žå㯠vi.mocked() ã mockImplementation ã䜿ããŸãããã
Q: ã©ããŸã§ãã¹ããæžãã°ããïŒ â ãŸãã¯ãããžãã¹ããžãã¯ïŒèšç®ã»ããªããŒã·ã§ã³ã»å€æåŠçïŒãããå§ããŸããããUIã³ã³ããŒãã³ãã®ãã¹ãã¯åŸåãã§ãåé¡ãããŸãããããã°ãçºèŠããããã®ãã°ãåçŸãããã¹ããæžããŠããä¿®æ£ãããç¿æ £ãã€ãããšèªç¶ãšãã¹ããå¢ããŠãããŸãã
ãã¹ãã£ãŠãããã°ã©ã ãåãã確èªããäœæ¥ã®ããšïŒæåã§ç¢ºèªããã®ãšäœãéãã®ïŒ
æåãã¹ãã¯ãå®éã«ç»é¢ãæäœããŠç¢ºèªãããæ¹æ³ã ãã©ãèªåãã¹ãã¯ãã³ãŒããã³ãŒãããã¹ããããä»çµã¿ã ããäžåºŠãã¹ãã³ãŒããæžããŠããã°ãäœåºŠã§ãèªåã§å®è¡ã§ãããããæ©èœã远å ã»å€æŽãããã³ã«ãåã®æ©èœãå£ããŠããªããããç¬æã«ç¢ºèªã§ãããã ããããããªã°ã¬ãã·ã§ã³ãã¹ãïŒãã°ã¬é²æ¢ïŒããšåŒã¶ãã倧ããªãããžã§ã¯ãã§ã¯æåãã¹ãã ãã§ã¯è¿œãã€ããªããããèªåãã¹ãã¯å¿ é ã®ã¹ãã«ãªãã ã
ãã¹ãã«ãçš®é¡ãããã£ãŠèãããã©ãã©ãéãã®ïŒ
倧ãã3çš®é¡ãããããŠããããã¹ãã¯ã颿°ãã¯ã©ã¹åäœããæ£ããåããã確èªããæãå°ãããã¹ããçµ±åãã¹ãïŒã€ã³ãã°ã¬ãŒã·ã§ã³ãã¹ãïŒã¯ãè€æ°ã®ã³ã³ããŒãã³ããå€éšãµãŒãã¹ãšçµã¿åããããåäœã確èªãããã¹ããE2Eãã¹ãïŒEnd-to-EndïŒã¯ãã©ãŠã¶ãèªåæäœããŠããŠãŒã¶ãŒèŠç¹ã§ã®å šäœçãªåäœãã確èªãããã¹ãã ãããŸãã¯ãŠããããã¹ãããå§ããã®ãäžè¬çã ãã
ã©ã¡ãã人æ°ã®JavaScript/TypeScriptãã¹ããã¬ãŒã ã¯ãŒã¯ã ããJestã¯Facebookãäœã£ãèèã§ãReactãããžã§ã¯ãã§ã¯ããã©ã«ããšããŠäœ¿ãããããšãå€ãããVitestã¯ViteïŒããã³ããšã³ããã«ãããŒã«ïŒããŒã¹ã§ãViteãSvelteKitãããžã§ã¯ãã§ã¯èªç¶ãªéžæè¢ã ããAPIãã»ãŒåããªã®ã§ãäžæ¹ãèŠããã°ããäžæ¹ããã䜿ãããã ã2026幎çŸåšã¯æ°èŠãããžã§ã¯ãã§ã¯Vitestã®æ¡çšãå¢ããŠãããã
ããã§ãnpm create vite@latest test-project -- --template vanilla-tsãã§ãããžã§ã¯ããäœã£ãŠããnpm install -D vitestãã§ã€ã³ã¹ããŒã«ããŠã¿ãŠãããpackage.jsonãã®scriptsã«ãtest: vitestãã远å ããŠãç°¡åãªãã¹ããæžããŠãnpm testããå®è¡ããŠã¿ããïŒïŒè©ŠããŠã¿ãŠïŒ
ãã¹ãã¯ã©ããã£ãŠæžãã®ïŒ
ãã¹ãã¯ãdescribeïŒãã¹ãã®ã°ã«ãŒãïŒããtest/itïŒåã ã®ãã¹ãã±ãŒã¹ïŒããexpectïŒæåŸ å€ã®æ€èšŒïŒãã®3èŠçŽ ã§æžãããããšãã°ãè¶³ãç®é¢æ°ã®ãã¹ãããªããdescribe('add颿°', () => { test('1+2ã¯3ã«ãªã', () => { expect(add(1, 2)).toBe(3) }) })ããšæžããã ããexpect(å€).toBe(æåŸ å€)ããåºæ¬ã§ããtoEqualïŒãªããžã§ã¯ãæ¯èŒïŒããtoBeTruthyïŒçå€ïŒããtoContainïŒé åã»æååãå«ãïŒããªã©å€ãã®ãããã£ãŒãçšæãããŠãããã
å€éšAPIãããŒã¿ããŒã¹ã«äŸåããã³ãŒãã¯ã©ããã£ãŠãã¹ãããã®ïŒ
ã¢ãã¯ïŒMockïŒãšããæè¡ã䜿ããããjest.fn()ãããvi.fn()ãã§ãããŒã®é¢æ°ãäœã£ãŠãå®éã®å€éšãµãŒãã¹ã®ä»£ããã«äœ¿ããã ãããšãã°ãfetchUserFromAPIããšãã颿°ããvi.fn().mockResolvedValue({name: 'ã²ãã'})ãã§ã¢ãã¯ããã°ãå®éã«APIãåŒã°ãã«ãã¹ãã§ããããã¢ãžã¥ãŒã«å šäœãã¢ãã¯ãããvi.mock('ã¢ãžã¥ãŒã«ãã¹')ããèŠããŠãããšäŸ¿å©ã ãã
TDDã£ãŠäœïŒãã¹ãé§åéçºã£ãŠèããããšããã
TDDïŒTest Driven DevelopmentïŒã¯ããŸããã¹ããæžããŠããå®è£ ãããéçºææ³ã ããâ 倱æãããã¹ããæžãââ¡æå°éã®ã³ãŒãã§ãã¹ããéãââ¢ãªãã¡ã¯ã¿ãªã³ã°ããšãããµã€ã¯ã«ãç¹°ãè¿ããã ãæåã¯æ £ããªããŠæéãããããã©ãèšèšãèªç¶ãšããã¹ãããããïŒ=ççµåãªïŒã³ãŒããã«ãªããšããã¡ãªãããããããæåããå®ç§ãªTDDãç®æããªããŠããæžãçµãã£ãåŸã«ãã¹ãã远å ããã ãã§ãåå䟡å€ããããã
ãã¹ãã«ãã¬ããžã£ãŠäœïŒã©ã®ãããããã°ããã®ïŒ
ãã¹ãã«ãã¬ããžã¯ãã³ãŒãå šäœã®ãã¡äœ%ããã¹ããããŠãããããç€ºãææšã ãããvitest --coverageãããjest --coverageãã§èšæž¬ã§ãããã ã100%ãç®æãå¿ èŠã¯ãªããäžè¬çã«ã¯80%ååŸãç®å®ãšãããŠããããã«ãã¬ããžãé«ããŠããã¹ãã®è³ªãäœããã°æå³ããªãããéèŠãªããžãã¹ããžãã¯ãåªå ããŠãã¹ãããèãæ¹ã倧åã ãã
CI/CDã«ãã¹ããçµã¿èŸŒãã®ã¯ã©ãããã®ïŒ
GitHub Actionsãªããnpm testããã¯ãŒã¯ãããŒã®stepã«è¿œå ããã ãã ãããruns-on: ubuntu-latestãã®ç°å¢ã§ãnpm ciãâãnpm testããå®è¡ããã ãã§ããã«ãªã¯ãšã¹ãã®ãã³ã«ãã¹ããèªåå®è¡ããããã ããã¹ãã倱æãããããŒãžããããã¯ããèšå®ãã§ããããããã«ãã£ãŠããã¹ããéã£ãŠããªãã³ãŒãã¯æ¬çªã«å ¥ããªãããšããå®å šç¶²ãèªåã§åŒµããããã ã