상세 컨텐츠

λ³Έλ¬Έ 제λͺ©

[Node.js] 11μž₯ λ…Έλ“œ μ„œλΉ„μŠ€ ν…ŒμŠ€νŠΈν•˜κΈ°

22-23/22-23 Node.js

by dev otcroz 2022. 12. 1. 10:00

λ³Έλ¬Έ

728x90

πŸ” Test

βœ… test의 μ—­ν• 

μ½”λ“œλ‚˜ ν•¨μˆ˜κ°€ μ œλŒ€λ‘œ μ‹€ν–‰λ˜λŠ”μ§€ κ²€μ‚¬ν•˜κ³  값이 μΌμΉ˜ν•˜λŠ”μ§€ κ²€μ‚¬ν•œλ‹€.

 

test ν•¨μˆ˜μ˜ 첫 번째 μΈμˆ˜λ‘œλŠ” ν…ŒμŠ€νŠΈμ— λŒ€ν•œ μ„€λͺ…을 적고, 두 번째 인수인 ν•¨μˆ˜μ—λŠ” ν…ŒμŠ€νŠΈ λ‚΄μš©μ„ μ λŠ”λ‹€.

except ν•¨μˆ˜μ˜ 인수둜 μ‹€μ œ μ½”λ“œλ₯Ό, to Equal ν•¨μˆ˜μ˜ 인수둜 μ˜ˆμƒλ˜λŠ” 결과값을 λ„£λŠ”λ‹€.

expect에 넣은 κ°’κ³Ό toEqual에 넣은 값이 μΌμΉ˜ν•˜λ©΄ ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•œλ‹€.

// routes/middlewares.test.js
{
  test('1+1은 2μž…λ‹ˆλ‹€.', () => {
  	expect(1 + 1).toEqual(2);
});

 

πŸ” μœ λ‹› ν…ŒμŠ€νŠΈ

μž‘μ€ λ‹¨μœ„μ˜ ν•¨μˆ˜λ‚˜ λͺ¨λ“ˆμ΄ μ˜λ„λœ λŒ€λ‘œ μ •ν™•νžˆ μž‘λ™ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈν•˜λŠ” 것.

λ‹¨μœ„ ν…ŒμŠ€νŠΈλΌκ³ λ„ λΆ€λ₯΄λ©°, λ‚˜μ€‘μ— ν•¨μˆ˜λ₯Ό μˆ˜μ •ν•˜λ©΄ 기쑴에 μž‘μ„±ν•΄λ‘” ν…ŒμŠ€νŠΈλŠ” μ‹€νŒ¨ν•˜κ²Œ λ˜λ―€λ‘œ ν•¨μˆ˜κ°€ μˆ˜μ •λ˜μ—ˆμ„ λ•Œ μ–΄λ–€ 뢀뢄이 κ³ μž₯λ‚˜λŠ”μ§€ ν…ŒμŠ€νŠΈλ₯Ό 톡해 μ•Œ 수 μžˆλ‹€.

ν…ŒμŠ€νŠΈ μ½”λ“œλ„ κΈ°μ‘΄ μ½”λ“œκ°€ λ³€κ²½λœ 것에 맞좰 μˆ˜μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

 

πŸ“Œ describe ν•¨μˆ˜

ν…ŒμŠ€νŠΈλ₯Ό κ·Έλ£Ήν™”ν•΄μ€€λ‹€.

 

πŸ“Œ λͺ¨ν‚Ή(mocking)

κ°€μ§œ 객체, κ°€μ§œ ν•¨μˆ˜λ₯Ό λ„£λŠ” ν–‰μœ„.

ν•¨μˆ˜λ₯Ό λͺ¨ν‚Ήν•  λ•ŒλŠ” jest.fn λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©°, ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ„ μ§€μ •ν•˜κ³  μ‹Άλ‹€λ©΄ jest.fn(() => λ°˜ν™˜κ°’)을 μ‚¬μš©ν•œλ‹€.

 

πŸ” ν…ŒμŠ€νŠΈ 컀버리지

πŸ“Œ 컀버리지(coverage) κΈ°λŠ₯

전체 μ½”λ“œ μ€‘μ—μ„œ ν…ŒμŠ€νŠΈλ˜κ³  μžˆλŠ” μ½”λ“œμ˜ λΉ„μœ¨κ³Ό ν…ŒμŠ€νŠΈλ˜κ³  μžˆμ§€ μ•Šμ€ μ½”λ“œμ˜ μœ„μΉ˜λ₯Ό μ•Œλ €μ£ΌλŠ” jest의 κΈ°λŠ₯

 

πŸ“Œ testμ—μ„œ μ‚¬μš©λ˜λŠ” 컀버리지 κΈ°λŠ₯

μ–΄λ–€ 뢀뢄이 ν…ŒμŠ€νŠΈλ˜κ³  μ–΄λ–€ 뢀뢄이 ν…ŒμŠ€νŠΈλ˜μ§€ μ•ŠλŠ”μ§€ μ•Œμ•„μ•Ό λ‚˜μ€‘μ— ν•΄λ‹Ή λΆ€λΆ„μ˜ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.

컀버리지 κΈ°λŠ₯ μ‚¬μš©μ„ μœ„ν•΄ package.json에 jest 섀정을 μž…λ ₯ν•œλ‹€.

jest λͺ…λ Ήμ–΄ 뒀에 coverage μ˜΅μ…˜μ„ 뢙이면 jestκ°€ ν…ŒμŠ€νŠΈ 컀버리지λ₯Ό λΆ„μ„ν•œλ‹€.

{
	"scripts": {
    	"start": "nodemon app",
        "test": "jest",
        "coverage": "jest --coverage"
 }

 

$ npm run coverage λ₯Ό μˆ˜ν–‰ν•˜λ©΄ ν…ŒμŠ€νŠΈ 결과와 ν‘œκ°€ 좜λ ₯λœλ‹€.

  • File (파일과 폴더 이름)
  • % Stmts (ꡬ문 λΉ„μœ¨)
  • % Branch (if λ¬Έ λ“±μ˜ 뢄기점 λΉ„μœ¨)
  • % Funcs (ν•¨μˆ˜ λΉ„μœ¨)
  • % Lines (μ½”λ“œ 쀄 수 λΉ„μœ¨)
  • Uncovered Line #s (μ»€λ²„λ˜μ§€ μ•Šμ€ 쀄 μœ„μΉ˜)

퍼센티지가 λ†’μ„μˆ˜λ‘ λ§Žμ€ μ½”λ“œκ°€ ν…ŒμŠ€νŠΈλœ 것이닀.

ν…ŒμŠ€νŠΈ 컀버리지가 100%라 ν•˜λ”λΌλ„ μ‹€μ œλ‘œ λͺ¨λ“  μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν•œ 것은 아닐 수 μžˆλ‹€.

 

πŸ” 톡합 ν…ŒμŠ€νŠΈ (integration test)

ν•˜λ‚˜μ˜ λΌμš°ν„°μ—λŠ” μ—¬λŸ¬ 개의 미듀웨어가 λΆ™μ–΄ 있고, λ‹€μ–‘ν•œ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ‚¬μš©λœλ‹€.

이런 것듀이 λͺ¨λ‘ 유기적으둜 잘 μž‘λ™ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈν•˜λŠ” 것이 톡합 ν…ŒμŠ€νŠΈμ΄λ‹€.

 

βœ… ν…ŒμŠ€νŠΈμš© λ°μ΄ν„°λ² μ΄μŠ€

톡합 ν…ŒμŠ€νŠΈμ—μ„œλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ½”λ“œλ₯Ό λͺ¨ν‚Ήν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ— μ‹€μ œλ‘œ ν…ŒμŠ€νŠΈμš© 데이터가 μ €μž₯λœλ‹€.

μ‹€μ œ μ„œλΉ„μŠ€ 쀑인 λ°μ΄ν„°λ² μ΄μŠ€μ— ν…ŒμŠ€νŠΈμš© 데이터가 λ“€μ–΄κ°€λ©΄ μ•ˆ λ˜λ―€λ‘œ, ν…ŒμŠ€νŠΈμš© λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ”°λ‘œ λ§Œλ“œλŠ” 것이 μ’‹λ‹€.

 

πŸ“Œ afterAll ν•¨μˆ˜

ν…ŒμŠ€νŠΈ 후에 λ°μ΄ν„°λ² μ΄μŠ€μ— 데이터가 남아 있으면 λ‹€μŒ ν…ŒμŠ€νŠΈμ— 영ν–₯을 λ―ΈμΉ  수 μžˆλ‹€.

ν…ŒμŠ€νŠΈ μ’…λ£Œ μ‹œ 데이터λ₯Ό μ •λ¦¬ν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•˜λŠ”λ° 보톡 afterAll에 μ •λ¦¬ν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν•œλ‹€.

// sync λ©”μ„œλ“œμ— force: trueλ₯Ό λ„£μ–΄ ν…Œμ΄λΈ”μ„ λ‹€μ‹œ λ§Œλ“€κ²Œ ν•œλ‹€.

afterAll(async () => {
	await sequelize.sync({ force: true });
});

 

πŸ” λΆ€ν•˜ ν…ŒμŠ€νŠΈ (load test)

μ„œλ²„κ°€ μ–Όλ§ˆλ§ŒνΌμ˜ μš”μ²­μ„ κ²¬λ”œ 수 μžˆλŠ”μ§€ (λ˜λŠ” μˆ˜μš©ν•  수 μžˆλŠ”μ§€) ν…ŒμŠ€νŠΈν•˜λŠ” 방법.

μ½”λ“œμ— 문법적, 논리적 λ¬Έμ œκ°€ 없더라도 μ„œλ²„μ˜ ν•˜λ“œμ›¨μ–΄ μ œμ•½ λ•Œλ¬Έμ— μ„œλΉ„μŠ€κ°€ 쀑단될 수 μžˆλ‹€.

 

πŸ“Œ OOM (Out of Memory) 문제

μ„œλ²„λŠ” μ ‘μ†μžλ“€μ˜ 정보λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ 각각의 μ ‘μ†μžλ§ˆλ‹€ μΌμ •ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•œλ‹€. 

μ‚¬μš©ν•˜λŠ” λ©”λͺ¨λ¦¬ 양이 μ¦κ°€ν•˜λ‹€κ°€ μ„œλ²„μ˜ λ©”λͺ¨λ¦¬ μš©λŸ‰μ„ λ„˜μ–΄μ„œκ²Œ 되면 λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

μ΄λŠ” λΆ€ν•˜ ν…ŒμŠ€νŠΈλ₯Ό 톡해 μ–΄λŠ 정도 예츑 κ°€λŠ₯ν•˜λ‹€.

 

 

 

728x90

κ΄€λ ¨κΈ€ 더보기