[DevCamp] ๐Ÿงช ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ์™„์ „ ์ •๋ณต

๋™๊ฑดยท2025๋…„ 6์›” 5์ผ

DevCamp

๋ชฉ๋ก ๋ณด๊ธฐ
80/85

๐Ÿงช ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ์™„์ „ ์ •๋ณต

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ’ˆ์งˆ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ์ด ํ…Œ์ŠคํŠธ ์ž๋™ํ™”์ด๋‹ค.

์˜ค๋Š˜์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Test)์™€ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€(Code Coverage)์— ๋Œ€ํ•ด ์ •๋ฆฌํ•œ๋‹ค.


โœ… ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ž€?

์ฝ”๋“œ์˜ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„(ํ•จ์ˆ˜, ๋ชจ๋“ˆ ๋“ฑ)๊ฐ€ ๊ธฐ๋Œ€ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ

๐Ÿ”น ์™œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์ค‘์š”ํ•œ๊ฐ€?

  • ๊ธฐ๋Šฅ ์ˆ˜์ • ์‹œ ๋ถ€์ž‘์šฉ(๋ฒ„๊ทธ)์„ ๋น ๋ฅด๊ฒŒ ๊ฐ์ง€ ๊ฐ€๋Šฅ
  • ์ฝ”๋“œ์˜ ์‹ ๋ขฐ๋„ ์ƒ์Šน โ†’ ๋ฆฌํŒฉํ† ๋ง ์‹œ ์•ˆ์ „์žฅ์น˜ ์—ญํ• 
  • ๋ฌธ์„œํ™” ํšจ๊ณผ: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์‚ฌ์šฉ๋ฒ•์ด ๋“œ๋Ÿฌ๋‚จ

๐Ÿ”น ์˜ˆ์‹œ (Jest ๊ธฐ์ค€)

// sum.ts
export const sum = (a: number, b: number) => a + b;

// sum.test.ts
import { sum } from './sum';

test('1 + 2๋Š” 3์ด๋‹ค', () => {
  expect(sum(1, 2)).toBe(3);
});

๐Ÿ“Š ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ž€?

์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹ค์ œ ์ฝ”๋“œ์˜ ๋ช‡ %๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”์ง€ ์ธก์ •ํ•˜๋Š” ์ง€ํ‘œ

๐Ÿ”น ์ฃผ์š” ์ง€ํ‘œ

์ง€ํ‘œ์„ค๋ช…
Statements์ „์ฒด ์ฝ”๋“œ ์ค‘ ์‹คํ–‰๋œ ๊ตฌ๋ฌธ ๋น„์œจ
Branchesif/else, switch ๋“ฑ ์กฐ๊ฑด ๋ถ„๊ธฐ ์‹คํ–‰ ๋น„์œจ
Functionsํ˜ธ์ถœ๋œ ํ•จ์ˆ˜ ๋น„์œจ
Lines์‹ค์ œ ์‹คํ–‰๋œ ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜ ๋น„์œจ

๐Ÿ”น ์ปค๋ฒ„๋ฆฌ์ง€ ๋„๊ตฌ

  • Jest: --coverage ํ”Œ๋ž˜๊ทธ๋กœ ์†์‰ฝ๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅ
  • nyc (Istanbul): ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ปค๋ฒ„๋ฆฌ์ง€ ๋„๊ตฌ

๐Ÿ”ง ์ปค๋ฒ„๋ฆฌ์ง€ ์‹คํ–‰ ์˜ˆ์‹œ (Jest)

npm test -- --coverage

์ถœ๋ ฅ ๊ฒฐ๊ณผ:

Statements   : 90% (45/50)
Branches     : 85% (17/20)
Functions    : 100% (10/10)
Lines        : 90% (45/50)

๐ŸŽฏ ํ…Œ์ŠคํŠธ ์ „๋žต ํŒ

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ์œ ์ง€๋ณด์ˆ˜ ๋Œ€์ƒ์ด๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์ž
  • ํ…Œ์ŠคํŠธ๋Š” ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ์ค‘์‹ฌ์œผ๋กœ, ๋‚ด๋ถ€ ๋กœ์ง์— ๊ณผํ•˜๊ฒŒ ์˜์กดํ•˜์ง€ ์•Š๊ธฐ
  • ๋ณต์žกํ•œ ํ•จ์ˆ˜๋Š” edge case๋„ ํ•จ๊ป˜ ํ…Œ์ŠคํŠธ
  • CI ๋„๊ตฌ(GitHub Actions ๋“ฑ)์™€ ์—ฐ๋™ํ•˜์—ฌ PR ์‹œ ์ž๋™ ์‹คํ–‰๋˜๋„๋ก ๊ตฌ์„ฑ

๐Ÿง  TIL

  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ๋น ๋ฅด๊ณ  ๋ช…ํ™•ํ•ด์•ผ ํ•œ๋‹ค โ†’ ๋А๋ฆฌ๋ฉด ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋กœ ๋ถ„๋ฆฌ
  • ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ๋†’์„์ˆ˜๋ก ์ข‹์ง€๋งŒ, 100%๊ฐ€ ๋ชฉํ‘œ๋Š” ์•„๋‹˜ (ํ’ˆ์งˆ๋ณด๋‹ค ์ˆ˜์น˜ ์ง‘์ฐฉ์€ ๊ธˆ๋ฌผ)
  • ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์Šต๊ด€์ด ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ์ขŒ์šฐํ•œ๋‹ค!
profile
๋ฐฐ๊ณ ํ”ˆ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€