๐Ÿ”จ ๋‹ค๋“ฌ์„ ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ flow

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ โ†’ ํ…Œ์ŠคํŠธ ์ฝ๊ณ  โ†’ ์‹คํ–‰ โ†’ ์ถœ๋ ฅ(Reporter)

ํ…Œ์ŠคํŠธ ์ข…๋ฅ˜

  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ: ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ
    • ์˜์กด์„ฑ์ด ์žˆ๋Š” ๋ชจ๋“ˆ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ํ•„์—ฐ์ ์œผ๋กœ ๋ชจ์˜ ๊ฐ์ฒด(Mocking)์„ ์‚ฌ์šฉํ•  ์ˆ˜๋ฐ–์— ์—†์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ๊ฐ ๋ชจ๋“ˆ์ด ์‹ค์ œ๋กœ ์ž˜ ์—ฐ๊ฒฐ๋˜์–ด ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ๊ฒ€์ฆํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ: 2๊ฐœ ์ด์ƒ์˜ ๋ชจ๋“ˆ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ํ…Œ์ŠคํŠธ (๊ฐœ๋ฐœ์ž ๊ด€์ ์˜ ํ…Œ์ŠคํŠธ)
    • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ๋น„ํ•ด mocking์„ ๋œํ•˜๋ฉฐ, ๋ชจ๋“ˆ ๊ฐ„์˜ ์—ฐ๊ฒฐ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.
  • E2E ํ…Œ์ŠคํŠธ: ์‚ฌ์šฉ์ž์˜ ์‹คํ–‰ ํ™˜๊ฒฝ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ (์‚ฌ์šฉ์ž ๊ด€์ ์˜ ํ…Œ์ŠคํŠธ)
    • ์„ธ๋ถ€ ๋ชจ๋“ˆ๋“ค์ด ๊ฐ–๋Š” ๋‹ค์–‘ํ•œ ์ƒํ™ฉ๋“ค์˜ ์กฐํ•ฉ์„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ…Œ์ŠคํŠธ ๋„๊ตฌ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ…Œ์ŠคํŠธ๋Š” ๋„๊ตฌ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. Test Runners
  2. Testing Frameworks
  3. Assertion Libraries
  4. Testing Plugins

ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ์™€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์œ„ํ•œ ๊ธฐ๋ฐ˜์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ, ์‹ค์ œ๋กœ ํ…Œ์ŠคํŠธ ํ•  ํ•ญ๋ชฉ์ด ํ…Œ์ŠคํŠธ ํ•˜๋ ค๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ์ง€ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋‹จ์–ธ(assertion) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, mocks, stubs, and fake servers๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ…Œ์ŠคํŒ… ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋‹ค.

Test Runner

ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ ์ค‘ ์œ ๋ช…ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค๋ฉด Karma ๊ฐ™์€ ๊ฒƒ์ด ์žˆ๋‹ค.

๋” ๋งŽ์€ ์ข…๋ฅ˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด๋ ค๋ฉด ์•„๋ž˜ ์‚ฌ์ดํŠธ๋ฅผ ๋“ค์–ด๊ฐ€๋ณด๋ฉด ๋œ๋‹ค.

https://www.browserstack.com/docs/automate/javascript-testing/test-runners

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ…Œ์ŠคํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ๊ณผ Node.js ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์—์„œ ์˜ˆ์‹œ๋ฅผ ๋“ค์—ˆ๋˜ Karma๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” runner ์ด๊ณ , ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” fake server๋งŒ ๋งŒ๋“ค์–ด ์ค„ ๋ฟ Mocha์™€ ๊ฐ™์€ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ•จ๊ฒŒ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด Node.js ํ™˜๊ฒฝ์—์„œ ๋Œ์•„๊ฐ€๋Š” ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ๋“ค์€ ์–ด๋–ค ๊ฒƒ์ด ์žˆ์„๊นŒ? ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ๊ณผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๊ตฌ๋ถ„ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—(๋‘˜๋‹ค Node.js) Node.js ํ™˜๊ฒฝ์—์„œ ๋Œ์•„๊ฐ€๋Š” ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ ๋ณด๋‹ค๋Š” ๋Œ€๋ถ€๋ถ„ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์จ ํ†ตํ•ฉ๋œ ํ˜•ํƒœ๋กœ ์ œ๊ณต ๋œ๋‹ค. ์ฆ‰, Mocha, Jest, Jasmine ๋Š” Node.js ํ™˜๊ฒฝ์—์„œ ๋Œ์•„๊ฐ€๋Š” ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

๋‹ค์‹œํ•œ๋ฒˆ, Test Runner ์ •๋ฆฌ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ…Œ์ŠคํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ๊ณผ Node.js ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜๋Š” ์ผ (๊ธฐ๋Šฅ)
    • ํ…Œ์ŠคํŠธ ์ฝ๊ณ  โ†’ ์‹คํ–‰ โ†’ ์ถœ๋ ฅ(Reporter)
    • Watcher
  • ์ข…๋ฅ˜
    • ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์ฝ”๋“œ ์‹คํ–‰
      • ์ข…๋ฅ˜
        • Karma
          • ํ…Œ์ŠคํŠธ ๊ณผ์ •: command์—์„œ Karma ์‹คํ–‰ โ†’ ์ž์ฒด ์›น์„œ๋ฒ„ ๊ตฌ๋™ โ†’ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ HTML ํŽ˜์ด์ง€ ์ƒ์„ฑ โ†’ ์†Œ์Šค์ฝ”๋“œ ๋กœ๋“œ(ํ…Œ์ŠคํŠธ + ์†Œ์Šค) โ†’ ๋ธŒ๋ผ์šฐ์ € ์ง์ ‘ ์‹คํ–‰ โ†’ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”๋กœ ์ถœ๋ ฅ โ†’ Karma๊ฐ€ ์ง€์ •๋œ ๋ฆฌํฌํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฒฐ๊ณผ๋ฅผ ์ •๋ฆฌํ•˜์—ฌ ์ปค๋ฉ˜๋“œ์— ๋ณด์—ฌ์คŒ
          • ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ์˜ ์—ญํ• ๋งŒ ํ•˜๋ฏ€๋กœ Jasmine ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•จ
          • Selenium ๋„๊ตฌ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ(์šด์˜์ฒด์ œ, ๋ธŒ๋ผ์šฐ์ €) ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ ๊ฐ€๋Šฅ
      • ์žฅ์ : ๋ธŒ๋ผ์šฐ์ €์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ(๋„คํŠธ์›Œํฌ IO, ๋ Œ๋”๋ง ์—”์ง„ ๋“ฑ)์„ ํ™œ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ
      • ๋‹จ์ 
        • ํ…Œ์ŠคํŠธ์˜ ์ดˆ๊ธฐ ๊ตฌ๋™ ์†๋„๊ฐ€ ๋А๋ฆผ (Node.js ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ๋ฌด๊ฑฐ์›€)
        • ๋ชจ๋“ˆ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›€(๋ฒˆ๋“ค๋Ÿฌ ์‚ฌ์šฉ ํ•„์š”)
        • ๋ธŒ๋ผ์šฐ์ € ๋Ÿฐ์ฒ˜(launcher)๋ฅผ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•ด ์ค˜์•ผ ํ•จ.
        • ํฌ๋กœ์Šค ๋ถ€๋ผ์šฐ์ง• ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๋ณ„๋„ ํ™˜๊ฒฝ ๊ตฌ์ถ• ๋น„์šฉ์ด ํผ
          • โ†’ ๋‹จ์  ๊ทน๋ณต1: headless ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ (๊ฐœ๋ฐœ์‹œ์—๋Š” headless ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ์œผ๋กœ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์–ป๊ณ  ๊ฐœ๋ฐœ ์™„๋ฃŒ ํ˜น์€ ๋ฐฐํฌ์‹œ์—๋งŒ CI๋ฅผ ํ†ตํ•ด ํฌ๋กœ์Šค ๋ถ€๋ผ์šฐ์ง• ํ…Œ์ŠคํŠธ)
          • โ†’ ๋‹จ์  ๊ทน๋ณต2: Browser Stack, Sauce Lab ๋“ฑ์˜ ์™ธ๋ถ€ ์„œ๋น„์Šค ์‚ฌ์šฉ. (ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์ง์ ‘ ๊ตฌ์ถ•ํ•  ํ•„์š”์—†์ด Karama์™€ ์‰ฝ๊ฒŒ ์—ฐ๋™ ๊ฐ€๋Šฅ)
    • Node.js์—์„œ ์‹คํ–‰ (= Testing Framework)
      • ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ๊ณผ ์ฝ”๋“œ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๊ตฌ๋ถ„ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ†ตํ•ฉ๋œ ํ˜•ํƒœ๋กœ ์ œ๊ณต.
      • โ†’ ์ฆ‰, ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ์™€ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ†ตํ•ฉ๋˜์–ด ์žˆ์–ด ์„ค์น˜ ๋ฐ ์‹คํ–‰์ด ๋น„๊ต์  ๊ฐ„๋‹จ
      • ์ข…๋ฅ˜
        • Jest
        • Mocha
        • Jasmine
      • ์žฅ์ 
        • ์†๋„(๋ธŒ๋ผ์šฐ์ €์˜ ํ”„๋กœ์„ธ์Šค์— ๋น„ํ•ด ํ›จ์”ฌ ๊ฐ€๋ฒผ์›€ โ†’ ์‹คํ–‰ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค)
        • ์›ํ•˜๋Š” ๋ชจ๋“ˆ๋งŒ ๊ฐ€์ ธ์™€์„œ(import) ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ์•ˆ์ „ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
      • ๋‹จ์ 
        • ๋ธŒ๋ผ์šฐ์ €์˜ ๋ชจ๋“  API๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์—†์Œ. (๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” DOM(Document Object Model)์ด๋‚˜ BOM(Browser Object Model) ๋“ฑ์˜ API๊ฐ€ ์—†์Œ)
          • โ†’ ๋‹จ์  ๊ทน๋ณต: ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด jsdom๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์„ ๊ฐ€์ƒ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉ

Testing Framework

Framework์—์„œ๋Š” Jest ์™€ ๊ฐ™์ด assertion library๊นŒ์ง€ ํฌํ•จํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๋„ ์žˆ๊ณ , Mocha ์™€ ๊ฐ™์ด assertion library๋Š” ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. Mocha์—์„œ๋Š” Chai์™€ ๊ฐ™์€ assertion library๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

์ž‘์„ฑ๋ฒ• ์š”์•ฝ

describe๋ฅผ ์ด์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ grouping ํ•˜๊ณ  it์ด๋‚˜ test๊ตฌ๋ฌธ์„ ์จ์„œ ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ์•ˆ์—์„œ expect โ€ฆ toBe, toHave, ๋“ฑ๋“ฑ ์„ ๊ธฐ์ˆ ํ•œ๋‹ค.

describe('updateAll', () => {
  it('no force', () => {
    return updateAll(TableName, ["fileName"], {compandId: "test"})
        .then(updatedItems => {
          let undefinedCount = 0;
          for (let item of updatedItems) {
            undefinedCount += item === undefined ? 1 : 0;
          }
          // console.log("result", result);
          expect(undefinedCount).toBe(updatedItems.length);
        })
  });
  
  test('force update', () => {
    return updateAll(TableName, ["fileName"], {compandId: "test"}, true)
        .then(updatedItems => {
          let undefinedCount = 0;
          for (let item of updatedItems) {
            undefinedCount += item === undefined ? 1 : 0;
          }
          // console.log("result", result);
          expect(undefinedCount).toBe(0);
        })
  });
});

์ฐธ๊ณ ๋กœ, it๊ณผ test์˜ ์ฐจ์ด๋Š” ๋‘˜๋‹ค ๋˜‘๊ฐ™์€ ์—ญํ• ์„ ํ•˜๋Š”๋ฐ it์€ RSpec ์Šคํƒ€์ผ์˜ ๊ธฐ์ˆ  ๋ฐฉ์‹์ด๊ณ , test๋Š” xUnit ์Šคํƒ€์ผ์˜ ๊ธฐ์ˆ  ๋ฐฉ์‹์˜ ์ฐจ์ด์ด๋‹ค. (์ฐธ๊ณ )

๊ทธ๋ ‡๋‹ค๋ฉด, ์–ด๋А ๋ถ€๋ถ„๊นŒ์ง€๊ฐ€ Testing Framework๊ณ  ์–ด๋””๊นŒ์ง€๊ฐ€ assertion ์ผ๊นŒ?

it์ด๋‚˜ test ๋ธ”๋ก ์•ˆ์—์„œ ์šฐ๋ฆฌ๋Š” ์„ธ๋ถ€์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ, ๊ทธ๋•Œ expect...toBe, toHave, equal ๋“ฑ๋“ฑ์˜ ๋ฌธ๊ตฌ๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ถ€๋ถ„์ด assertion library ๋ถ€๋ถ„์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

Jest ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” assertion library๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋ฏ€๋กœ Mocha + chai ์™€ ๊ฐ™์ด ์ถ”๊ฐ€์ ์ธ ์กฐํ•ฉ์„ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

๋‹ค์‹œํ•œ๋ฒˆ, Test Framework ์ •๋ฆฌ

  • ํ•˜๋Š”์ผ (๊ธฐ๋Šฅ)
    • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ์ œ๊ณต
    • ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ
    • ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰
    • ํ…Œ์ŠคํŠธ ์„ฑ๊ณต ๋ฐ ์‹คํŒจ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
  • ์ข…๋ฅ˜
    • Mocha, Jasmine, AVA, Jest, Selenium

Assertion Library

  • ํ•˜๋Š”์ผ
    • assertion์€ ๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ธฐ์ˆ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
    • ๋ณดํ†ต์€ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ ๋‹จ์–ธ API๋ฅผ ๊ธฐ๋ณธ ์ œ๊ณต
    • ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋ฉฐ, Mocha์˜ ๊ฒฝ์šฐ์—๋งŒ Chai์™€ ๊ฐ™์€ ๋ณ„๋„์˜ ๋‹จ์–ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค.
  • ์ข…๋ฅ˜
    • BDD
      • Chai
      • Jasmine
    • TDD?
      • JUnit?

Testing Plugin

ํ…Œ์ŠคํŠธ ๋”๋ธ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š”๋ฐ, ์‹ค์ œ ๊ฐ์ฒด ๋Œ€์‹  ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋™์ž‘ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ŠคํŒŒ์ด(spy), ์Šคํ…(stub), ๋ชฉ(mock) ๋“ฑ๋“ฑ์„ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋ฉฐ, Mocha์˜ ๊ฒฝ์šฐ์—๋งŒ Sinon.JS ๋“ฑ์˜ ๋ณ„๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค.

์š”์ฆ˜ msw๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜๋Š”๋ฐ ๋‹ค์Œ ๊ธ€์—์„œ๋Š” mocking ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋น„๊ตํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค

์ฐธ๊ณ 

https://amzotti.github.io/testing/2015/03/16/what-is-the-difference-between-a-test-runner-testing-framework-assertion-library-and-a-testing-plugin/

https://ui.toast.com/fe-guide/ko_TEST/#๋‹จ์–ธassertion-๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ