TIL ( ν…ŒμŠ€νŠΈ μ½”λ“œ )

2024. 6. 13. 23:24ㆍTIL

πŸ’‘ν…ŒμŠ€νŠΈμ½”λ“œ(Test Code) 

 

1. ν…ŒμŠ€νŠΈ μ½”λ“œ

 - ν…ŒμŠ€νŠΈμ½”λ“œλž€ 말 κ·ΈλŒ€λ‘œ μž‘μ„±ν•œ μ½”λ“œμ— λ¬Έμ œκ°€ μ—†λŠ”μ§€ μ˜λ„λŒ€λ‘œ λ™μž‘ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄ μž‘μ„±ν•˜λŠ” μ½”λ“œμ΄λ‹€.

 - ν…ŒμŠ€νŠΈμ½”λ“œμ˜ λͺ©μ μ€ "λ‚΄ μ½”λ“œκ°€ λ©€μ©‘ν•˜λ‹€"λ₯Ό 증λͺ…ν•˜κΈ° μœ„ν•œ 것이 μ•„λ‹ˆλΌ, "λ‚΄ μ½”λ“œκ°€ λ©€μ©‘ν•˜λ‹€λ©΄ κ²°κ³Όκ°€ μ΄λ ‡κ²Œ λ‚˜μ™€μ•Ό ν•œλ‹€"λΌλŠ” κΈ°λŒ€μΉ˜λ₯Ό μ„€μ •ν•˜κ³  κ²€μ¦ν•˜κΈ° μœ„ν•œ 것이닀.

 - λ”°λΌμ„œ ν…ŒμŠ€νŠΈμ½”λ“œλ₯Ό μž‘μ„±ν•  λ•ŒλŠ” ν…ŒμŠ€νŠΈ κΈ°λ³Έ 원칙쀑 "ν…ŒμŠ€νŒ…μ€ 결함이 μ—†λŠ” 것이 μ•„λ‹ˆλΌ, κ²°ν•¨μ˜ 쑴재λ₯Ό λ³΄μ—¬μ£ΌλŠ” 것이닀." λΌλŠ” 원칙을 μ•Œμ•„λ‘κ³  μž‘μ„±ν•΄μ•Όν•œλ‹€.

 

2. ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ μ’…λ₯˜

 - λ‹¨μœ„ ν…ŒμŠ€νŠΈ (Unit Test) : κ°€μž₯ μž‘μ€ 규λͺ¨μ˜ κΈ°λŠ₯을 ν…ŒμŠ€νŠΈν•œλ‹€.

 - 톡합 ν…ŒμŠ€νŠΈ (Integration Test) : λ‹€μ–‘ν•œ κΈ°λŠ₯을 ν•©μ³€μ„λ•Œ μƒκΈ°λŠ” 문제λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•œ ν…ŒμŠ€νŠΈμ΄λ‹€.

 - E2E ν…ŒμŠ€νŠΈ (End-to-end Test) : λμ—μ„œ 끝(쒅단 κ°„)을, λ°±μ—”λ“œλΆ€ν„° μ‹œμž‘ν•΄ μ΅œμ’…μ μœΌλ‘œ μ›ΉνŽ˜μ΄μ§€κ°€ μ›ν•˜λŠ”λŒ€λ‘œ λ™μž‘ν•˜λ©° μ›ν•˜λŠ” 데이터λ₯Ό 잘 λ³΄μ—¬μ£ΌλŠ”μ§€ ν™•μΈν•˜λŠ” ν…ŒμŠ€νŠΈμ΄λ‹€. 

 

3. ν…ŒμŠ€νŒ… ν”„λ ˆμž„μ›Œν¬ Jest

 - JestλŠ” Node.jsλ₯Ό 톡해 μ‚¬μš©ν•˜κ³  μžˆλŠ” 언어인 JavaScriptμ—μ„œ μ‚¬μš©μ΄ κ°€λŠ₯ν•œ ν…ŒμŠ€νŒ… ν”„λ ˆμž„μ›Œν¬μ€‘ ν•˜λ‚˜μ΄λ‹€.

 - JestλŠ” λ‹€λ₯Έ ν…ŒμŠ€νŒ… ν”„λ ˆμž„μ›ŒνŠΈμ€‘ κ°€μž₯ ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ ν‘œν˜„μ΄ κ°„κ²°ν•˜μ—¬ λ§Žμ€ κ°œλ°œμžλ“€μ—κ²Œ μ‚¬λž‘λ°›μœΌλ©° μ‚¬μš©λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

[ν…ŒμŠ€νŒ… ν”„λ ˆμž„μ›Œν¬ μ‚¬μš©λ₯  μ§€ν‘œ] νŒŒλž€μƒ‰μ΄ Jest, κ·Έ μ™Έμ—” μ›λž˜ μ‘΄μž¬ν•˜λ˜ ν…ŒμŠ€νŒ… ν”„λ ˆμž„μ›Œν¬

1) Jest μ‚¬μš©μ „ μ€€λΉ„

<λͺ¨λ“ˆ μ„€μΉ˜>
# DevDependencies둜 jestλ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.
yarn add -D jest

 

package.json 파일 μˆ˜μ •
{
  "license": "MIT",
  ...
}
μ•„λž˜μ— μΆ”κ°€
{
  "type": "module",
  "scripts": {
    "test": "node --experimental-vm-modules node_modules/.bin/jest"
  },
}
// => yarn test λͺ…λ Ήμ–΄ μ‹€ν–‰ κ°€λŠ₯

 

2) ν…ŒμŠ€νŠΈ μ½”λ“œ 파일 생성 & μž‘μ„±

- 일반적인 κ΄€λ‘€λ‘œ ν…ŒμŠ€νŠΈ νŒŒμΌμ€ [ ν…ŒμŠ€νŠΈν•  νŒŒμΌμ΄λ¦„.spec.js ] 와 같은 ν˜•μ‹μœΌλ‘œ λ§Œλ“ λ‹€.

- test() : λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό λ¬Άμ–΄μ£ΌλŠ” ν•¨μˆ˜μ΄λ‹€.

- expect(): νŠΉμ • 값이 μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•œ ν‘œν˜„μ‹μ„ μž‘μ„±ν•  수 있게 ν•΄μ£ΌλŠ” ν•¨μˆ˜μ΄λ‹€.

//ν…ŒμŠ€νŠΈ μ½”λ“œ μ˜ˆμ‹œ

import { isEmail } from './validation';

test('μž…λ ₯ν•œ 이메일 μ£Όμ†Œμ—λŠ” "@" λ¬Έμžκ°€ 1개만 μžˆμ–΄μ•Ό 이메일 ν˜•μ‹μ΄λ‹€.', () => {
  expect(isEmail("my-email@domain.com")).toEqual(true); // 1개만 μžˆλŠ” 상황
  expect(isEmail("my-email@@@@domain.com")).toEqual(false); // μ—¬λŸ¬κ°œ μžˆλŠ” 상황
  expect(isEmail("my-emaildomain.com")).toEqual(false); // ν•˜λ‚˜λ„ μ—†λŠ” 상황
});

test("μž…λ ₯ν•œ 이메일 μ£Όμ†Œμ— 곡백(슀페이슀)이 μ‘΄μž¬ν•˜λ©΄ 이메일 ν˜•μ‹μ΄ μ•„λ‹ˆλ‹€.", () => {
  expect(isEmail("myemail@domain.com")).toEqual(true);
  expect(isEmail("my email@domain.com")).toEqual(false);
});

test("μž…λ ₯ν•œ 이메일 μ£Όμ†Œ 맨 μ•žμ— ν•˜μ΄ν”ˆ(-)이 있으면 이메일 ν˜•μ‹μ΄ μ•„λ‹ˆλ‹€.", () => {
  expect(isEmail("e-m-a-i-l@domain.com")).toEqual(true);
  expect(isEmail("-email@domain.com")).toEqual(false);
});

 

// isEmailν•¨μˆ˜ 디버깅 μ˜ˆμ‹œ

export const isEmail = (value) => {
  const email = (value || '');

  if (email.split('@').length !== 2) {
      return false;
  } else if (email.includes(' ')) {
      return false;
  } else if (email[0] === '-') {
      return false;
  }
  return true;
};

 

 

*μ •λ¦¬ν•˜λ©΄μ„œ λ‹€μ‹œ μ΄ν•΄ν•˜λŠ” 데 아직 μ˜¨μ „νžˆ 이해가 λ˜μ§€μ•ŠλŠ”λ‹€..

 

 

**좜처 ν…ŒμŠ€νŒ…ν”„λ ˆμž„μ›Œν¬ 이미지

https://2022.stateofjs.com/