Skip to content

week4 tech from

bohyeon edited this page Nov 29, 2019 · 2 revisions

4์ฃผ์ฐจ ๊ธฐ์ˆ  ๊ณต์œ 

์ž‘์„ฑ์ž : ๊น€ํฌ์„ , ์„œ๋ณดํ˜„

testing

socket.io test

  • ํ•„์š”ํ•œ ์ด์œ : ํ˜„ ์ƒํ™ฉ์—์„œ api๋„ ์—†๊ณ  ์•ž์œผ๋กœ๋„ ๊ฑฐ์˜ ์•ˆ์ƒ๊ธธ๊ฒƒ. socket์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์œผ๋ฉด ํ…Œ์ŠคํŠธํ• ๋งŒํ•œ ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค.
  • socket.io ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๋ฒ•: server test๋ฅผ ํ•˜๊ธฐ์œ„ํ•ด test์ฝ”๋“œ์—์„œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ทธ ํด๋ผ์ด์–ธํŠธ๋กœ ์„œ๋ฒ„์— ์ ‘์†ํ•œ๋‹ค. connect ์ด๋ฒคํŠธ๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธํ•œ๋‹ค. testํ•  ๋•Œ ๋‹ค listener์— ๋“ค์–ด์˜ค๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— callbackํ•จ์ˆ˜ ์•ˆ์— done()์„ ์จ์ค˜์„œ ์ •ํ™•ํžˆ ํ…Œ์ŠคํŠธํ•œ๋‹ค. api ํ…Œ์ŠคํŠธ์ฒ˜๋Ÿผ socket๋„ emit๊ณผ on์ด ๋ฐ”๋กœ ์ผ์–ด๋‚˜๋Š” ์ด๋ฒคํŠธ๋“ค์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค. on์„ ๋จผ์ € ๋‹ฌ์•„์ฃผ๊ณ  ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” event๋ฅผ emitํ•œ๋‹ค.

jest

jest๋ž€?

  • All-in-one ํ…Œ์ŠคํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. Jest ์ด์ „์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ผ๋ฉด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ…Œ์ŠคํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณค ํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ Jest๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•˜๋‚˜๋งŒ ์„ค์น˜ํ•˜๋ฉด, Test Runner์™€ Test Mathcher ๊ทธ๋ฆฌ๊ณ  Test Mock ํ”„๋ ˆ์ž„์›Œํฌ๊นŒ์ง€ ์ œ๊ณตํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํžˆ ํŽธ๋ฆฌํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

jest ์‚ฌ์šฉํ•˜๊ธฐ

  1. jest ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ํ•˜๊ธฐ

    npm i -D jest
    
  2. test script ์ˆ˜์ •ํ•˜๊ธฐ

    • package.json ํŒŒ์ผ์„ ์—ด๊ณ  test ์Šคํฌ๋ฆฝํŠธ๋ฅผ jest๋กœ ์ˆ˜์ •ํ•œ๋‹ค.
    "scripts": {
      "test": "jest"
    },
    
    • ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— ์ฃผ๊ณ  ์‹ถ์€ option์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

    • test / it : ํ…Œ์ŠคํŠธ ํ•˜๋‚˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์›Œ๋“œ์ด๋‹ค.(ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ๋‹จ์œ„) ์•„๋ž˜๋Š” ์˜ˆ์‹œ์ด๋‹ค.
    test('socket connect test', (done) => {
        socket.on('connect', () => {
          done();
        });
    });
    
    • describe : describe ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋ฌถ์„ ์ˆ˜ ์žˆ๋‹ค.
    describe('socket.io test', () => {
      beforeAll(() => {
        ...
      });
    
      afterAll(() => {
       ...
      });
    
      test('socket connect test', (done) => {
        ...
      });
    
      test('[EMIT] \'enter_room\' event test', (done) => {
        ...
      });
    });
    

jest ๋” ์•Œ์•„๋ณด๊ธฐ

  • ์•„๋ž˜์˜ Methods๋“ค์€ ๋ชจ๋‘ scope๊ฐ€ ์žˆ๋‹ค. ์ „์—ญ์— ์“ฐ๋ฉด ๋ชจ๋“  ํ…Œ์ŠคํŠธ์— ์ ์šฉ๋˜๊ณ  ํ•˜๋‚˜์˜ describe์•ˆ์— ๋„ฃ์œผ๋ฉด ๊ทธ describe์•ˆ์— ์žˆ๋Š” test์—๋งŒ ์ ์šฉ๋œ๋‹ค. ์˜ˆ์‹œ๋Š” ์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™๋‹ค.
  • afterAll(fn, timeout): ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๊ณ  ํ•œ๋ฒˆ ์‹คํ–‰๋œ๋‹ค.
  • afterEach(fn, timeout): ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚  ๋•Œ ๋งˆ๋‹ค ๋งค๋ฒˆ ์‹คํ–‰๋œ๋‹ค.
  • beforeAll(fn, timeout): ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ•œ๋ฒˆ ์‹คํ–‰๋œ๋‹ค.
  • beforeEach(fn, timeout): ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋งค๋ฒˆ ์‹คํ–‰๋œ๋‹ค.

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” Matcher

  • toEqual(): ๋‘ ๊ฐ’์ด ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋Š” Matcher์ด๋‹ค. object๊ฐ€ ์ •ํ™•ํžˆ ๊ฐ™์€์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค. javascript์—์„œ ===์™€ ๊ฐ™๋‹ค.
    expect(response).toEqual(value);
    
  • toBeTruthy(), toBeFalsy(): ๊ฐ’์ด false์ธ์ง€ true์ธ์ง€ ํ™•์ธํ•˜๋Š” Matcher์ด๋‹ค.
    expect(response).toBeTruthy(); // response๊ฐ€ true์ธ์ง€ ํ™•์ธ
    
  • toHaveLength(): object์˜ ๊ธธ์ด๋ฅผ ํ™•์ธํ•˜๋Š” Matcher์ด๋‹ค.
    expect(response).toHaveLength(3);
    
  • toContain(): array์— ํฌํ•จํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” Matcher์ด๋‹ค.
    expect(response).toContain('hello');
    
  • toThrow(): ์—๋Ÿฌ๋ฅผ throw()ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” Matcher์ด๋‹ค.
    expect(() => {
        drinkFlavor('octopus');
    }).toThrow();
    

JSdoc ์‚ฌ์šฉ๊ณผ ์ž๋™ ๋ฌธ์„œํ™”

  • JSDoc์€ Javascript๋ฅผ ์œ„ํ•œ API ๋ฌธ์„œ ์ƒ์„ฑ๊ธฐ์ด๋‹ค. ์†Œ์Šค์ฝ”๋“œ์— ์ง์ ‘ ๋ฌธ์„œํ™” ์ฃผ์„์„ ์ž‘์„ฑํ•˜๊ณ , JSDoc์—์„œ ์ด๋ฅผ ํƒ์ƒ‰ํ•ด HTML ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • VS Code๋Š” ๋‹ค์–‘ํ•œ JSDoc ์ฃผ์„์„ ์ดํ•ดํ•˜๊ณ , ์ด ์ฃผ์„์„ Intellisense์—๊ฒŒ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ์— ๋”ฐ๋ผ Javascript์—์„œ๋„ type ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ ์ž‘์„ฑ์‹œ type check๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹ค์ œ ํŒ€ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ์— ์ž‘์„ฑํ•œ JSDoc ์ฃผ์„
    /**
    * @param {number} newIndexX
    * @param {number} newIndexY
    * @returns {Boolean} ์›€์ง์ž„์ด ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€
    */
    _canBeMoved(newIndexX, newIndexY) {
      if (newIndexX < 0 || newIndexX >= ROOM.FIELD_COLUMN) return false;
      if (newIndexY < 0 || newIndexY >= ROOM.FIELD_ROW) return false;
      if (this.indexOfCharacters[newIndexX][newIndexY] !== undefined) return false;
      return true;
    }
  • ๊ฒฐ๊ณผ
  • ์—ญ์‹œ JSDoc์„ ์ดํ•ดํ•˜๋Š” API ๋ฌธ์„œํ™” ์‹œ์Šคํ…œ์ด๋‹ค.

  • JSDoc์€ ์ฃผ์„ ํ˜•์‹์„ ์˜๋ฏธํ•˜๊ณ , JSDoc์„ ์ด์šฉํ•ด์„œ ์ž๋™์œผ๋กœ ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ณ„๊ฐœ๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ documentation.js๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๊ธฐ๋กœ ํ–ˆ๋‹ค. (์ฐธ๊ณ  ๋งํฌ : https://meetup.toast.com/posts/208)

    • ์œ„ ๋งํฌ์—์„œ ์–ธ๊ธ‰ํ•œ documentation.js์˜ ์žฅ์ ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    โ€ข ES5, ES2017, JSX, Vue, Flow ํƒ€์ž…์„ ์ง€์›ํ•œ๋‹ค.
    โ€ข JSDoc ํŒŒ์‹ฑ ๋ฐ์ดํ„ฐ๋ฅผ ๋งˆํฌ๋‹ค์šด, JSON์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค.
    โ€ข ๋…ธ๋“œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    
  • serve, watch ๋“ฑ ํŽธ๋ฆฌํ•œ CLI ๋ช…๋ น๋“ค๋„ ์ง€์›ํ•ด์ค€๋‹ค.

  •   $ documentation build index.js -f md
      $ documentation build src/** -f html -o docs/apidocs
    
      # document index.js, ignoring any files it requires or imports
      $ documentation build index.js -f md --shallow
    
      # build and serve HTML docs for app.js
      $ documentation serve app.js
    
      # build, serve, and live-update HTML docs for app.js
      $ documentation serve --watch app.js
  • ๋ฌธ์„œํ™” ๊ฒฐ๊ณผ

JSDoc + VSCode + documentation.js

  • ๊ฒŒ์ž„ ๋‚ด ๋ชจ๋ธ์˜ ๋ฉ”์†Œ๋“œ๋“ค์ด ๋งŽ์•„์ง€๊ณ , ๋กœ์ง์ด ๋ณต์žกํ•ด์ง€๋ฉด์„œ ์ธ์ž๋กœ ๋ฐ›๋Š” ๊ฐ’์˜ ๊ฐœ์ˆ˜์™€ ํƒ€์ž…, ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์ด ์žˆ๋Š”์ง€ ์žˆ์œผ๋ฉด ํƒ€์ž…์€ ๋ฌด์—‡์ธ์ง€ ๋“ฑ์„ ์•Œ๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค.

  • Jsdoc์„ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ํ•œ ๊ณณ์—์„œ ์ž‘์„ฑํ•œ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋„ ๋ฐ›์•„์•ผ ํ•˜๋Š” ์ธ์ž์™€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€ ๋“ฑ์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์—ˆ๋‹ค.

  • ๊ฑฐ๊ธฐ์— ๋”ํ•ด documentation.js๋ฅผ ์‚ฌ์šฉํ•ด ํ˜„์žฌ ํŒ€ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋ธ๊ณผ ๋ชจ๋ธ์ด ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋“ค์„ ์‰ฝ๊ฒŒ ๋ฌธ์„œํ™”ํ•ด์„œ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค.

  • ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ด๋Ÿฐ ๋ฐฉ์‹์€ ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฉ”์†Œ๋“œ๋“ค์€ ๋งŽ์ง€๋งŒ, ๋ฐ›๋Š” ์ธ์ž๋“ฑ์€ ๊ทธ๋ ‡๊ฒŒ๊นŒ์ง€ ๋ณต์žกํ•˜์ง€ ์•Š์•„์„œ JSDoc์„ ์ตœ๋Œ€ ํ™œ์šฉํ•˜๊ณ  ์žˆ์ง€๋Š” ์•Š์€ ๊ฒƒ ๊ฐ™๋‹ค.

  • ๋‹จ, TypeScript๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด type check๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ JSDoc์„ ์‚ฌ์šฉํ•˜๋Š” ์ผ์€ ์—†์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค.

Clone this wiki locally