Jest: console.log๋Š” ์ถœ๋ ฅ์„ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 06์›” 19์ผ  ยท  137์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/jest

console.log ์ถœ๋ ฅ์ด ๋ˆ„๋ฝ๋œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ Jest 24๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์‹ญ์‹œ์˜ค.


๋ฌธ์ œ #2441์—์„œ ๋ถ„๊ธฐ

@cpojer ์ด ์„ค์ •(macOS)์—์„œ๋Š” console.log ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

$ node --version
v7.4.0

ํŒŒ์ผ

package.json :

{
  "dependencies": {
    "@types/jest": "19.2.4",
    "jest": "20.0.4",
    "ts-jest": "20.0.6",
    "typescript": "2.3.4"
  }
}

__tests__/jestconfig.json :

{
  "rootDir": "../",
  "globals": {
    "__TS_CONFIG__": {}

  },
  "moduleFileExtensions": [
    "ts",
    "tsx",
    "js",
    "jsx",
    "json"
  ],
  "transform": {
    "\\.(ts|tsx)$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
  },
  "testRegex": "__tests__/.*test_.*\\.(ts|tsx|js)$"

__tests__/test_foo.ts :

import {} from 'jest';

console.log('CONSOLE before test');
test('fail', () => {
  console.log('CONSOLE inside test');
  expect(true).toEqual(false);
  console.log('CONSOLE end of test');
})

__tests__/test_bar.js :

console.log('BAR CONSOLE before test');
test('fail', () => {
  console.log('BAR CONSOLE inside test');
  expect(true).toEqual(false);
  console.log('BAR CONSOLE end of test');
})

์‚ฐ์ถœ

$ jest -c __tests__/jestconfig.json 
 FAIL  __tests__/test_foo.ts
  โ— fail

    expect(received).toEqual(expected)

    Expected value to equal:
      false
    Received:
      true

      at Object.<anonymous> (__tests__/test_foo.ts:6:16)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

 FAIL  __tests__/test_bar.js
  โ— fail

    expect(received).toEqual(expected)

    Expected value to equal:
      false
    Received:
      true

      at Object.<anonymous>.test (__tests__/test_bar.js:4:16)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

Test Suites: 2 failed, 2 total
Tests:       2 failed, 2 total
Snapshots:   0 total
Time:        1.379s
Ran all test suites.

๋‹จ์ผ JS ํ…Œ์ŠคํŠธ:

$ jest -c __tests__/jestconfig.json __tests__/test_bar.js 
 FAIL  __tests__/test_bar.js
  โ— fail

    expect(received).toEqual(expected)

    Expected value to equal:
      false
    Received:
      true

      at Object.<anonymous>.test (__tests__/test_bar.js:4:16)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

  โœ• fail (7ms)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.596s, estimated 1s
Ran all test suites matching "__tests__/test_bar.js".

๋‹จ์ผ TS ํ…Œ์ŠคํŠธ:

$ jest -c __tests__/jestconfig.json __tests__/test_foo.ts 
 FAIL  __tests__/test_foo.ts
  โ— fail

    expect(received).toEqual(expected)

    Expected value to equal:
      false
    Received:
      true

      at Object.<anonymous> (__tests__/test_foo.ts:6:16)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

  โœ• fail (116ms)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        1.27s
Ran all test suites matching "__tests__/test_foo.ts".
Confirmed

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

2๋…„ ๋™์•ˆ ์ฝ˜์†” ๋กœ๊ทธ๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋‚˜์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Jest ํŒ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋ชจ๋“  137 ๋Œ“๊ธ€

@thymikee ์™œ ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์•„์‹ญ๋‹ˆ๊นŒ?

์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์˜ˆ๋ฅผ ๋“ค์–ด typescript๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์˜ˆ์ œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Typescript ์—†์ด ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ 7.4๊ฐ€ ์ฝ˜์†” ๋กœ๊ทธ๋ฅผ ๋จน๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋…ธ๋“œ 7.5.0, 7.10.0, 8.0.0 ๋ฐ 8.1.2์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๋…ธ๋“œ ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์‹ญ์‹œ์˜ค. ํ์‡„

@thymikee ํ˜„์žฌ LTS ๋ฆด๋ฆฌ์Šค์ธ Node 6์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? (์•„์ง ์ถฉ๋ถ„ํžˆ ๋””๋ฒ„๊น…ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ด๊ฒƒ๋„ ์น˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ์€ LTS ๋ฆด๋ฆฌ์Šค๋กœ ์ œํ•œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)

v6.11.0์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ console.log ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์•„, ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. @thymikee ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ข€ ๋” ๋””๋ฒ„๊น…์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ ๋ชจ๋ฅด๊ฒŒ Node 7.3.0(n์„ ํ†ตํ•œ ์ž˜๋ชป๋œ ๋ฒ„์ „)์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ๋กœ๊น…์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. 8.1.1๋กœ ์ „ํ™˜ํ•˜๊ณ  ๋‹ค์‹œ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.

@thymikee - ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ์ฑ…์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๊นŒ? ...๋…ธ๋“œ ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋…ธ๋“œ ๋ฒ„๊ทธ๋กœ ๊ฐ„์ฃผ๋˜๊ณ  ์ ์–ด๋„ Jest ์ž์ฒด์™€ ๊ด€๋ จ์ด ์—†๋Š”์ง€ ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Jest v19.0.2์™€ ํ•จ๊ป˜ Node v7.4.0์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด ํ…Œ์ŠคํŠธ์—์„œ ์ฝ˜์†” ๋กœ๊น…์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  Jest๋ฅผ v20.0.4๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์ฝ˜์†” ๋กœ๊น…์ด ๋” ์ด์ƒ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@thymikee ๋…ธ๋“œ ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๋Š”๋ฐ Node 8.2.1 Winx64 + Jest 20.0.4์— ์ฝ˜์†” ๋กœ๊ทธ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํด๋ฐฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  console.log = s => {
    process.stdout.write(s + "\n");
  };

์ด์ „ ๋ฒ„์ „์—๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Jest์—์„œ ์ˆ˜์ •๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

@nowherenone ์ตœ์‹  ์•ŒํŒŒ ๋ฆด๋ฆฌ์Šค jest@test ์—์„œ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@thymikee 8.2.1 ๋…ธ๋“œ์—์„œ jest@test ๋กœ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ๊ฐ™์Šต๋‹ˆ๋‹ค. console.log ๋ฌธ์€ ํ•ญ์ƒ ์‚ผ์ผœ์ง‘๋‹ˆ๋‹ค.

@thymikee ์ฝ˜์†” ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์˜ˆ์ƒ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” BufferedConsole ๋ชจ๋“ˆ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

PR์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://github.com/facebook/jest/pull/4157

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” Jest๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฒ„ํผ๋งํ•˜์ง€๋งŒ ๊ตฌ์ œ๊ธˆ์œต(๋˜๋Š” ๋ฌดํ•œ ๋ฃจํ”„ ๋“ฑ)์„ ์œ ๋ฐœํ•˜๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์— ์ง์ ‘ ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•˜๋ ค๋ฉด --verbose ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

Jest๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด ์ œ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค.

describe('index', () => {
  it('doesnt print anything', () => {
    console.log('Hellllooo');
    expect(true).toBe(true);
  });
});
$ yarn test -- src/__tests__/index.spec.js --verbose
yarn test v0.27.5
warning package.json: No license field
$ jest "src/__tests__/index.spec.js" "--verbose"
 PASS  src/__tests__/index.spec.js
  Index
    โœ“ doesnt print anything (2ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.969s, estimated 2s
$ jest "--version"
v20.0.4
$ node --version
v7.4.0

Node Lmao์˜ ์ตœ์‹  ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๋ผ๋Š” ๋ง์„ ๋“ฃ๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋†๋‹ด์ž…๋‹ˆ๋‹ค ๐Ÿ˜‚ ๐Ÿ˜‚ ๐Ÿ˜‚

@nf071590 ์€ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ •ํ™•ํžˆ ๋™์ผํ•œ Jest ๋ฐ Node ๋ฒ„์ „์œผ๋กœ repl.it์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. https://repl.it/KYLc/0

ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž์— ๋Œ€ํ•ด ํ˜ธ์–ธ์žฅ๋‹ดํ•˜๊ธฐ ์ „์— ์ง„์ง€ํ•œ ๋ฐ˜๋ฐ•์„ ํ•ด๋ณด์„ธ์š”.
๊ฑด๋ฐฐ!

screen shot 2017-08-24 at 17 39 59

์ด์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๋‹น์‹ ์˜ ์˜ˆ์ œ๋ฅผ ํŒŒ์ผ์— ๋ถ™์—ฌ๋„ฃ๊ณ  Jest๋ฅผ ์‹คํ–‰ํ–ˆ๊ณ , 1๋ถ„ ์ „ Jest์˜ ์ตœ์‹  ๋งˆ์Šคํ„ฐ ๋ฒ„์ „๊ณผ ํ•จ๊ป˜ ๋‚ด Mac์—์„œ ๊ด‘๊ณ ๋œ ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ณด๋‹ค:

screen shot 2017-08-24 at 4 38 11 pm

Windows(๋…ธ๋“œ 8.4, jest 21.0.0-alpha.2)๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ฏ€๋กœ console.log ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด --verbose #$0$#$ ๊ฐ€ _๋•Œ๋•Œ๋กœ_ ์ˆจ๊ฒจ์ง€์ง€๋งŒ ์ผ๊ด€๋˜๊ฒŒ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ. ๋…ธ๋“œ 7๊ณผ ์•ˆ์ •์ ์ธ ๋†๋‹ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

describe('index', () => {
  it('doesnt print anything', () => {
    console.log('Hellllooo');
    expect(true).toBe(true);
  });
});
$ node --version
v7.4.0
$ jest "--version"
v21.1.0

screen shot 2017-09-21 at 14 34 32

ํ˜„์žฌ ๋…ธ๋“œ v8.7.0(npm v5.4.2)์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹โ€‹โ€‹๋ฌธ์ œ์ž…๋‹ˆ๋‹ค

์žฌ์ƒ์‚ฐ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

FWIW, ๋‚˜๋Š” ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ v7.4.0. ๋‚ด ๋…ธ๋“œ ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๊ณ  $# --verbose ์—†์ด๋„ ์ด์ œ ์˜ˆ์ƒ๋Œ€๋กœ console.log ๊ฐ€ ์ธ์‡„๋ฉ๋‹ˆ๋‹ค. V7.4.0์—๋งŒ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋ฒ„์ „๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์ผ๋ถ€ Node ๋ฒ„์ „์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด์ œ Node v8.3.0์„ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ ์ „์— @nf071590 ๊ณผ ๋™์ผํ•œ ๋ฒ„์ „๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. repl.it์—์„œ๋Š” ์™œ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๊ทธ์˜ ์ปดํ“จํ„ฐ์—์„œ๋งŒ ์ผ์–ด๋‚˜๋Š” ์ด์ƒํ•œ ์ผ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ node 8.9.0๊ณผ jest 21.2.1, macOS 10.12.6(16G1036)์œผ๋กœ ์žฌํ˜„ ๊ฐ€๋Šฅ

@SimenB ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์ฃฝ์„ ์ •๋„๋กœ ๋…ผ์˜๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. jest์˜ ๋‹ค์ค‘(์ž์‹) ํ”„๋กœ์„ธ์Šค ํŠน์„ฑ์€ console.logs ์„ ๋ฎ์–ด์“ฐ๊ณ  ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋Œ€๊ทœ๋ชจ ์žฌ์ž‘์„ฑ ์—†์ด๋Š” ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์— ์™€์„œ --verbose console.log ๋ฅผ ์‚ฌ์šฉํ•œ ๋””๋ฒ„๊น…์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋ ค๋ฉด --watch ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž์‹ ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ˜์†” ๋กœ๊ทธ์™€ ํ•จ๊ป˜ ์ž์„ธํ•œ ์ถœ๋ ฅ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. --watch ๋Š” ๋งค์šฐ ๋น ๋ฅด๊ณ  ๋ณ€๊ฒฝ๋œ ํ…Œ์ŠคํŠธ์™€ ์ฝ”๋“œ์— ์ฃผ์˜๋ฅผ ์ง‘์ค‘ํ•˜๊ณ  ์ €์žฅ ์‹œ ๋ณ€๊ฒฝ๋œ ํ…Œ์ŠคํŠธ๋งŒ ์‹คํ–‰ํ•˜์—ฌ ๋” ๋งŽ์€ ๊ฐ€์น˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ์žฅํ™ฉํ•œ ๋ฉ”์‹œ์ง•์ด ์ผ๋ถ€ console.log ๋ฉ”์‹œ์ง€๋ฅผ ๋จน์ง€๋งŒ ์ผ๋ถ€๋Š” ๋จน์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์˜ต์…˜์„ ์ œ๊ฑฐํ–ˆ๋Š”๋ฐ ์–ด๋Š ์ •๋„ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

๋ฐฉ๊ธˆ ๋…ธ๋“œ ๋ฒ„์ „์„ v6์—์„œ v9๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์œผ๋ฉฐ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์œ„์•ˆ์ด ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ช‡ ์ฃผ ๋™์•ˆ ๊ทธ ๋ฌธ์ œ์™€ ์”จ๋ฆ„ํ•˜๊ณ  ์žˆ๋‹ค. ์ด์ œ ์ž‘๋™ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” --forceExit ์™€ ๊ฒฐํ•ฉ ํ•  ๋•Œ --verbose ์—์„œ ์—ฌ์ „ํžˆ ์ง€์†๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” jest๊ฐ€ stderr ์— ์“ฐ๋Š” ๋™์•ˆ console.log ๊ฐ€ stdout $๋กœ ์ถœ๋ ฅ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. stderr ๋ฐ --forceExit ๋•Œ $# stdout ์— ์ฝ˜ํ…์ธ ๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ”Œ๋Ÿฌ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

console.log๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๊ณ /๋˜๋Š” console.log๊ฐ€ ๋ฒ„ํผ๋ง๋˜์–ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์†”๋ฃจ์…˜( --verbose ํ•„์š” ์—†์Œ)์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

๋ช…๋ น
jest .... --forceExit --setupTestFrameworkScriptFile ./src/tests/jestShim.js

jestShim.js ์˜ ๋‚ด์šฉ

const { Console } = require('console');
global.console = new Console(process.stderr, process.stderr);

๋™์ผํ•œ ๋ฌธ์ œ - ๊ฒฐ์ฝ” console.log ์ถœ๋ ฅ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Node 9.80 Jest 22.4.2 Mac OS 10.13.3

์—ฌ๊ธฐ์— ์ œ์•ˆ๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ํšจ๊ณผ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ’€๋‹ค์šดํ•  ์ˆ˜ ์žˆ๋Š” ๋ณต์ œ๋ฌผ์„ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@ledbit ์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
NPM 5.3.0
๋†๋‹ด 22.4.3

  • ๋งฅ OS

๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋ฒˆ์‹์ด ํ•„์š”ํ•œ ์‹œ์ ์— ์žˆ์Šต๋‹ˆ๋‹ค.

--forceExit ๋‹ค์†Œ ๊นจ์ง„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

[์ตœ์‹  Jest v23.0.0, ๋…ธ๋“œ v8.11.2๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„๊ธฐ๋œ react-scripts ์‚ฌ์šฉ]

๋งˆ์ง€๋ง‰์œผ๋กœ ํŠน์ • ๋ฌธ์ž์—ด(์˜ˆ: @@@ )๋กœ ๊ฐ ๋กœ๊ทธ์— ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๊ณ  ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ํ‘œ์‹œํ•  ๋กœ๊ทธ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

yarn test --verbose | grep '@@@'

์ด๊ฒƒ์€ ๋”์ฐํ•œ ํ•ดํ‚น์ž…๋‹ˆ๋‹ค(๋ชจ๋“  ์ฝ˜์†” ์ƒ‰์ƒ์„ ์žƒ๊ฒŒ ๋˜์ง€๋งŒ ์—ฌ์ „ํžˆ ํ…Œ์ŠคํŠธ ์‹คํŒจ์™€ ์ตœ์ข… ํ…Œ์ŠคํŠธ ์š”์•ฝ์€ ํ‘œ์‹œ๋จ). ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ๊นŒ์ง€ ์ž‘๋™ํ•œ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์œ„์˜ ์˜๊ฒฌ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์—๋Š” --verbose arg๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค( react-scripts --watch ์™€ ์•”์‹œ์ ์œผ๋กœ ๊ฒฐํ•ฉ๋จ).

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹โ€‹โ€‹๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. Node 10.1.0์—์„œ jest v22.4.3์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋‚ด ์•ฑ์˜ ์ฒซ ๋ฒˆ์งธ console.log ๋ฌธ๋งŒ ํ‘œ์‹œ๋˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ stdout์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฉด ์ผ๋ถ€ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์‹คํ–‰์ž๋กœ์„œ Jest์˜ ์ž„๋ฌด๋Š” ์ฝ”๋“œ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋กœ๊ทธ ์—†์ด๋Š” ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@thymikee ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด์–ด์ฃผ์„ธ์š”

@thanpolas ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฒ„๊ทธ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ €์žฅ์†Œ์™€ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :) ๋˜ํ•œ ์ตœ์‹  ๋ฒ„์ „์ธ Jest 23์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋‚ด ๋ฌธ์ œ๋ฅผ ์•Œ์•„ ๋ƒˆ์–ด์š”. stdout์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๋กœ๊ฑฐ๋ฅผ ํ†ตํ•ด ๋กœ๊น…์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. console.log๋กœ ๋ฆฌ๋””๋ ‰์…˜๋  ๋•Œ ์ŠคํŠธ๋ฆผ ์ž‘์„ฑ๊ธฐ ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ ค ์ŠคํŠธ๋ฆผ์ด ๋กœ๊ทธ ์ „์†ก์„ ์ค‘์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ„ฐ๋ฏธ๋„๊ณผ iTerm2์˜ ์ฐจ์ด์ ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

jest์—๊ฒŒ stdout ๋ฐ console์—์„œ ๋งˆ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ง€์‹œํ•˜๋Š” ์˜ต์…˜์€ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋งค์šฐ ์œ ์ตํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ฒ„๊ทธ์˜ ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์†Œ์Šค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/spion/jest-logging-repro

yarn install; yarn repro

์„ค์ •: Jest๋Š” ๊ฐ์‹œ ๋ชจ๋“œ์— ์žˆ์œผ๋ฉฐ ์ƒ์„ธ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ผœ์ ธ ์žˆ๊ณ  ์ตœ์†Œ ๋‘ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

์ด๋ก : ์ž‘์—…์ž ์ค‘ ํ•˜๋‚˜์˜ ์ถœ๋ ฅ์ด ์ฝ˜์†” ์ปค์„œ๋ฅผ ์ž˜๋ชป๋œ ์œ„์น˜๋กœ ์ด๋™ํ•˜์—ฌ ์ž˜๋ชป๋œ ๋‚ด์šฉ์„ ๋ฎ์–ด์”๋‹ˆ๋‹ค.

์ฝ˜์†”์—์„œ ๊ด€์ฐฐ:

 RUNS  tests2/other-tests.js
 RUNS  lib/example.spec.js
 PASS  tests2/other-tests.js
  bar
    โœ“ always is true (17ms)

 PASS  lib/example.spec.js
  foo
    โœ“ adds 5 (5ms)

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        1.673s
Ran all test suites.

Watch Usage: Press w to show more.

์ฝ˜์†” ๋กœ๊ทธ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์‹œ๊ฐ์ ์œผ๋กœ "RUNS"๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ๋ฎ์–ด์“ฐ์—ฌ์ง‘๋‹ˆ๋‹ค.

 PASS  lib/example.spec.js
  foo
    โœ“ adds 5 (5ms)

 PASS  tests2/other-tests.js
  bar
    โœ“ always is true (5ms)

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        1.597s
Ran all test suites.

Watch Usage: Press w to show more.

3๊ฐœ์˜ ์ฝ˜์†” ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ:

 PASS  lib/example.spec.js
  foo
    โœ“ adds 5 (5ms)


 RUNS  tests2/other-tests.js

Test Suites: 1 passed, 1 of 2 total
Tests:       1 passed, 1 total
Snapshots:   0 total
  console.log tests2/other-tests.js:5
    JEST

 PASS  tests2/other-tests.jsests.js:6
  bar
    โœ“ always is true (19ms)

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 totalTime:        1.788sRan all test suites.

Watch Usage: Press w to show more.

๋…ธ๋“œ ๋ฒ„์ „:

30656 % node --version
v8.11.2

@spion ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐˆ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์‰ฌ์šด ์žฌํ˜„.

์ด๊ฒƒ์ด Node v8.11.1 LTS์—์„œ ๋ฐœ์ƒํ•˜๊ณ  watch ๋ฐ watchAll ๋ชจ๋“œ์—์„œ๋งŒ ๋ฐœ์ƒํ•จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ณ„ ๋ชจ๋“œ๊ฐ€ ์—†์–ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

Node v10.6.0 ๋ฐ Jest 23.4.1๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‘ ๋‚˜๋„. -w 1 ์ด @spion ์˜ ๊ฐ€์„ค์— ๋งž๋Š” ๋กœ๊น…์ด ๋‹ค์‹œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ 8.11.3
๋†๋‹ด 23.4.0

ํŒŒ์ผ ์ •๊ทœ์‹ ์ผ์น˜๋ฅผ ์ผค ๋•Œ( watch p ๋ˆ„๋ฆ„) ์ด ๋ฌธ์ œ ๋˜๋Š” ์ตœ์†Œํ•œ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. all ๋ฅผ ์ผœ๋ฉด ๋กœ๊ทธ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ธ์‡„๋ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ  --verbose ๋Š” ์—ฌ๊ธฐ์— ์—†์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ 1

it.only(`should display a ErrorMessage component if state.validated is 'error'`, () => {
    const fV = shallow(<FormValidator/>);
    console.log('r1');
    console.error('r2');
    console.error('r3');
    ...

all ์‹œ์ฒญ ์‹œ( log ๋ฐ error ๋ชจ๋‘ ์ธ์‡„:

 PASS  src/components/__tests__/FormValidator.js
  โ— Console

    console.log src/components/__tests__/FormValidator.js:56
      r1
    console.error src/components/__tests__/FormValidator.js:57
      r2
    console.error src/components/__tests__/FormValidator.js:58
      r3

file regex ๋ชจ๋“œ์—์„œ( error ๊ฐ€ ์•„๋‹Œ ์ฒซ ๋ฒˆ์งธ log ๋งŒ ์ธ์‡„):

Test Suites: 0 of 1 total
Tests:       0 total
Snapshots:   0 total
  console.log src/components/__tests__/FormValidator.js:56
    r1

 PASS  src/components/__tests__/FormValidator.jsidator.js:57
  FormValidator
    โ—‹ skipped 3 tests
  FormValidator.displayMessage
    โœ“ should display a ErrorMessage component if state.validated is 'error' (32ms)
    โ—‹ skipped 5 tests
  FormValidator.render
    โ—‹ skipped 1 test

์ƒ˜ํ”Œ 2

it.only(`should display a ErrorMessage component if state.validated is 'error'`, () => {
    const fV = shallow(<FormValidator/>);
    console.log('r1');
    console.error('r3');
    ...

all (์˜ˆ์ƒ๋Œ€๋กœ log ๋ฐ error ๋ชจ๋‘ ์ธ์‡„):

 PASS  src/components/__tests__/FormValidator.js
  โ— Console

    console.log src/components/__tests__/FormValidator.js:56
      r1
    console.error src/components/__tests__/FormValidator.js:59
      r3

watch (์œ„์˜ ์ฝ”๋“œ๋กœ ์•„๋ฌด ๊ฒƒ๋„ ์ธ์‡„๋˜์ง€ ์•Š์Œ):

Snapshots:   0 total
 PASS  src/components/__tests__/FormValidator.jsator.js:56
  FormValidator
    โ—‹ skipped 3 tests
  FormValidator.displayMessage
    โœ“ should display a ErrorMessage component if state.validated is 'error' (20ms)
    โ—‹ skipped 5 tests
  FormValidator.render
    โ—‹ skipped 1 test

Test Suites: 1 passed, 1 total

์ƒ˜ํ”Œ 3

it.only(`should display a ErrorMessage component if state.validated is 'error'`, () => {
    const fV = shallow(<FormValidator/>);
    console.log('r1');
    console.log('r2');
    console.log('r3');
    console.log('r4');
    ...

all (์˜ˆ์ƒ๋˜๋Š” log 4๊ฐœ ๋ชจ๋‘ ์ธ์‡„):

 PASS  src/components/__tests__/FormValidator.js
  โ— Console

    console.log src/components/__tests__/FormValidator.js:56
      r1
    console.log src/components/__tests__/FormValidator.js:57
      r2
    console.log src/components/__tests__/FormValidator.js:58
      r3
    console.log src/components/__tests__/FormValidator.js:59
      r4

watch (์ฒ˜์Œ ๋‘ ๊ฐœ์˜ log ์œ„์˜ ์ฝ”๋“œ๋กœ ์ธ์‡„๋จ):

Snapshots:   0 total
  console.log src/components/__tests__/FormValidator.js:56
    r1

  console.log src/components/__tests__/FormValidator.js:57
    r2

 PASS  src/components/__tests__/FormValidator.jsator.js:58
  FormValidator
    โ—‹ skipped 3 tests
  FormValidator.displayMessage
    โœ“ should display a ErrorMessage component if state.validated is 'error' (31ms)
    โ—‹ skipped 5 tests
  FormValidator.render
    โ—‹ skipped 1 test

Test Suites: 1 passed, 1 total

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

node -v v8.11.2
jest -v 23.4.0

์•„๋ž˜๋Š” ๋‚ด package.json์˜ ๋†๋‹ด ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.

```
"๋†๋‹ด": {
"๋ณ€ํ™˜ ๋ฌด์‹œ ํŒจํ„ด": [
"/๋…ธ๋“œ ๋ชจ๋“ˆ/"
],
"์„ค์ • ํŒŒ์ผ": [
"/src/setupTests.js"
],
"testEnvironment": "jsdom",
"์ƒ์„ธํ•œ": ์‚ฌ์‹ค,
"ํ”„๋กœ์ ํŠธ": [
{
"๋””์Šคํ”Œ๋ ˆ์ด ์ด๋ฆ„": " ๊ตฌ์„ฑ ์š”์†Œ ",
"์„ค์ • ํŒŒ์ผ": [
"/src/setupTests.js"
],
"๋ชจ๋“ˆ ๊ฒฝ๋กœ": ["/src/"],
"ํ…Œ์ŠคํŠธ ์ผ์น˜": ["/src/components/__tests__/ / .test.js"]},{"๋””์Šคํ”Œ๋ ˆ์ด ์ด๋ฆ„": " ๊ฐ์†๊ธฐ ","์„ค์ • ํŒŒ์ผ": ["/src/setupTests.js"],"๋ชจ๋“ˆ ๊ฒฝ๋กœ": ["/src/"],"ํ…Œ์ŠคํŠธ ์ผ์น˜": ["/src/reducers/__tests__/ /.test.js"]
},
{
"๋””์Šคํ”Œ๋ ˆ์ด ์ด๋ฆ„": " ์ž‘์—… ",
"์„ค์ • ํŒŒ์ผ": [
"/src/setupTests.js"
],
"๋ชจ๋“ˆ ๊ฒฝ๋กœ": ["/src/"],
"ํ…Œ์ŠคํŠธ ์ผ์น˜": ["/src/actions/__tests__/ */ .test.js"]
}
]
},

Here are my dependencies

"์ข…์†์„ฑ": {
"babel-core": "^6.26.3",
"๋ฐ”๋ฒจ ๋†๋‹ด": "^23.4.0",
"๋ฐ”๋ฒจ ๋กœ๋”": "^7.1.5",
"babel-preset-env": "^1.7.0",
"babel-preset-react": "^6.24.1",
"dotenv": "^6.0.0",
"์ต์Šคํ”„๋ ˆ์Šค": "^4.16.3",
"๋†๋‹ด": "^23.4.0",
"๋ฐ˜์‘": "^16.4.1",
"react-dom": "^16.4.1",
"๋ฐ˜์‘ redux": "^5.0.7",
"๋ฐ˜์‘ ์Šคํฌ๋ฆฝํŠธ": "1.1.4",
"redux": "^4.0.0",
"์žฌ์ƒ๊ธฐ ๋Ÿฐํƒ€์ž„": "^0.12.0"
},

output from just running jest

ํŒจ์Šค ๋ฆฌ๋“€์„œ src/reducers/__tests__/comments/index.test.js
โœ“ SAVE_COMMENT(4ms) ์œ ํ˜•์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
โœ“ ์•Œ ์ˆ˜ ์—†๋Š” ์œ ํ˜•์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—… ์ „๋‹ฌ src/actions/__tests__/ index.test.js
๋Œ“๊ธ€ ์ €์žฅ
โœ“ ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•(1ms)์ด ์žˆ์Šต๋‹ˆ๋‹ค.
โœ“ ์˜ฌ๋ฐ”๋ฅธ ํŽ˜์ด๋กœ๋“œ(1ms)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ ์ „๋‹ฌ src/components/__tests__/App/index.test.js
โœ“ CommentList๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•จ(5ms)
โœ“ CommentBox๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•จ(1ms)

๊ตฌ์„ฑ ์š”์†Œ ์ „๋‹ฌ src/components/__tests__/CommentBox/index.test.js
โœ“ ํ…์ŠคํŠธ ์˜์—ญ์ด ์žˆ์Œ(23ms)
โœ“ ๋ฒ„ํŠผ์ด ์žˆ์Œ(3ms)
ํ…์ŠคํŠธ ์˜์—ญ
โœ“ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ ์˜์—ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค(9ms).
โœ“ ์–‘์‹์ด ์ œ์ถœ๋˜๋ฉด ํ…์ŠคํŠธ ์˜์—ญ์ด ๋น„์›Œ์ง‘๋‹ˆ๋‹ค(5ms).

๊ตฌ์„ฑ ์š”์†Œ ์ „๋‹ฌ src/components/__tests__/CommentList/index.test.js
โœ“ ์ฃผ์„๋‹น ํ•˜๋‚˜์˜ LI ์ƒ์„ฑ(32ms)

ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ: 5๊ฐœ ํ†ต๊ณผ, ์ด 5๊ฐœ
ํ…Œ์ŠคํŠธ: 11๊ฐœ ํ†ต๊ณผ, ์ด 11๊ฐœ
์Šค๋ƒ…์ƒท: ์ด 0๊ฐœ
์‹œ๊ฐ„: 3.79์ดˆ
3๊ฐœ์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
console.log src/components/__tests__/CommentList/index.test.js:26
0

console.log src/components/__tests__/CommentList/index.test.js:27
ํ…Œ์ŠคํŠธ

```

์ด ๋ฌธ์ œ๋Š” ๋‹ค์‹œ ์—ด๋ ค์•ผ ํ•˜๊ณ  ์ฝ˜์†” ์ถœ๋ ฅ๋„ jest์— ์˜ํ•ด ์‚ผ์ผœ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

โ†’ ๋…ธ๋“œ --๋ฒ„์ „
v8.11.3

โ†’ npx jest --๋ฒ„์ „
23.4.1

๋‚˜๋Š” ๊นจ๋—ํ•œ ์„ค์ •์œผ๋กœ ์‹œ๋„ํ–ˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

// console.test.js
describe('jest should console output', () => {
  test('should console.log output be print', () => {
    console.log('console.log')
    expect(1).toBe(1)
  })

  test('should console.error output be print', () => {
    console.error('console.error')
    expect(1).toBe(1)
  })

  test('should console.info output be print', () => {
    console.info('console.info')
    expect(1).toBe(1)
  })
})

์‚ฐ์ถœ:

image

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋‚ด ๋†๋‹ด ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

{
  "globals": {
    "API_SERVER_PLACEHOLDER": "SOME_API_ADDRESS"
  },
  "moduleFileExtensions": [
    "js",
    "jsx"
  ],
  "transform": {
    "^.+\\.jsx?$": "babel-jest"
  },
  "moduleNameMapper": {
    "\\.(css|less|sass|scss|png)$": "<rootDir>/__mocks__/styleMock.js",
    "\\.(gif|ttf|eot|svg|png)$": "<rootDir>/__mocks__/fileMock.js"
  }
}

๋‚ด ๋ณธ๋Šฅ์€ verbose ๋ฅผ ํ™•์ธํ•˜๋ผ๊ณ  ๋งํ–ˆ๊ณ  ์ œ๊ฑฐํ•œ ํ›„์—๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค.

์š”์•ฝ

verbose ๊ตฌ์„ฑ์ด $#$ true $#$๋กœ ์„ค์ •๋œ jest ๋ฒ„์ „ 23.4.1์€ ์ฝ˜์†” ์ถœ๋ ฅ์„ ์‚ผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ stdout ๋กœ ๋ณ€๊ฒฝ ์ œ์•ˆ: https://github.com/noscripter/jest/pull/1

๋˜ ๋งํ–ˆ์–ด?! ์™œ ๊ณ„์† ๊นจ์ง€๋Š” ๊ฑธ๊นŒ์š”?

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

expect(str).toBe("not this");

๐Ÿ˜ฌ

package.json์— verbose: true ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ --verbose ํ”Œ๋ž˜๊ทธ๋กœ jest๋ฅผ ์‹คํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ(๋˜๋Š” ๋‘˜ ๋‹ค?) ์ œ๊ฑฐํ•ด ๋ณด์‹ญ์‹œ์˜ค.

๋” ์ด์ƒ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ข…์ข… ์ „์ฒด ํ…Œ์ŠคํŠธ ์š”์•ฝ์ด ์ฝ˜์†”์— ์ธ์‡„๋˜๊ธฐ _์ „_ ์ดˆ ๋™์•ˆ์˜ ๋กœ๊ทธ ์ถœ๋ ฅ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด ์—ฐ์†์œผ๋กœ console.log ๋ฅผ ์•ฝ 4-5ํšŒ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ํ›„์—๋„ ๋งˆ์ง€๋ง‰ ๋กœ๊ทธ๋Š” ์ ˆ๋ฐ˜์œผ๋กœ ์ž˜๋ฆฝ๋‹ˆ๋‹ค(์˜ˆ: ํฐ ๊ฐœ์ฒด๋ฅผ ์ธ์‡„ํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ ์ ˆ๋ฐ˜๋งŒ ๋งˆ์ง€๋ง‰ ์ธ์‡„๋œ ๋กœ๊ทธ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Œ).

๋˜ํ•œ ์˜ˆ์ธกํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ํ•˜๋‚˜ ๋˜๋Š” ๋‘ ๊ฐœ์˜ console.log ๋กœ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์—ฐ์†์œผ๋กœ 3~5๊ฐœ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋กœ๊ทธ๊ฐ€ ํ…Œ์ŠคํŠธ ์ค‘์ธ ์ฝ”๋“œ์— ์žˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž์ฒด์— ์žˆ๋Š”์ง€๋„ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

jest๊ฐ€ ๋กœ๊ทธ๋ฅผ ์ธ์‡„ํ•œ ๋‹ค์Œ ์‹ค์ œ๋กœ ํ•ด๋‹น ๋กœ๊ทธ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•  ๋•Œ ์ „์ฒด ํ…Œ์ŠคํŠธ ์š”์•ฝ์„ ์ธ์‡„ํ•˜๊ธฐ ์ „์— ์ถœ๋ ฅ์„ ์ง€์šฐ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์ฝ˜์†”์—์„œ ๋กœ๊ทธ๋ฅผ ๋ณด๋ ค๋ฉด ๋กœ๊ทธ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์ธ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

console.log ๋Š” ํŠน์ • ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋งŒ ์‹คํ–‰ํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

yarn test <your-test-file-name>

์˜ˆ
yarn test FormValidator

์ฐธ๊ณ ๋กœ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์žฌํ˜„์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

script -qfc 'yarn repro' /dev/null > raw.log

zsh - bash์—์„œ script -qfce ๋ฅผ ์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ cat -vet raw.log ๋กœ๊ทธ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

^[[2K^[[1G^[[1myarn run v1.7.0^[[22m^M$
^[[2K^[[1G^[[2m$ jest --watch^[[22m^M$
^[[2J^[[3J^[[H^[[1m^[[2mDetermining test suites to run...^[[1m^[[22m^[[999D^[[K^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^[[0m^[[7m^[[1m^[[32m PASS ^[[39m^[[22m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A  foo^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A    ^[[32mM-bM-^\M-^S^[[39m ^[[2madds 5 (4ms)^[[22m^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 of 2 total^M$
^[[1mTests:       ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        1s^[[999D^[[K  ^[[2mconsole.log^[[22m ^[[2mtests2/other-tests.js:5^[[22m^M$
    JEST^M$
^M$
^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^[[0m^[[7m^[[1m^[[32m PASS ^[[39m^[[22m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 of 2 total^M$
^[[1mTests:       ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A  bar^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 of 2 total^M$
^[[1mTests:       ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A    ^[[32mM-bM-^\M-^S^[[39m ^[[2malways is true (15ms)^[[22m^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 of 2 total^M$
^[[1mTests:       ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 of 2 total^M$
^[[1mTests:       ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^[[999D^[[K^[[1mTest Suites: ^[[22m^[[1m^[[32m2 passed^[[39m^[[22m, 2 total^M$
^[[1mTests:       ^[[22m^[[1m^[[32m2 passed^[[39m^[[22m, 2 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        1.128s^M$
^[[2mRan all test suites^[[22m^[[2m related to changed files^[[22m^[[2m.^[[22m^M$
^M$
^[[1mWatch Usage^[[22m^M$
^[[2m M-bM-^@M-: Press ^[[22ma^[[2m to run all tests.^[[22m^M$
^[[2m M-bM-^@M-: Press ^[[22mf^[[2m to run only failed tests.^[[22m^M$
^[[2m M-bM-^@M-: Press^[[22m p ^[[2mto filter by a filename regex pattern.^[[22m^M$
^[[2m M-bM-^@M-: Press^[[22m t ^[[2mto filter by a test name regex pattern.^[[22m^M$
^[[2m M-bM-^@M-: Press^[[22m q ^[[2mto quit watch mode.^[[22m^M$
^[[2m M-bM-^@M-: Press ^[[22mEnter^[[2m to trigger a test run.^[[22m^M$

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํŠน์ • ์ง€์ ์—์„œ ์ œ์–ด ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป ๊ณ„์‚ฐ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 PASS  lib/example.spec.js
  foo
    โœ“ adds 5 (4ms)


 RUNS  tests2/other-tests.js

 PASS  tests2/other-tests.js2 total
  bar
    โœ“ always is true (15ms)

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        1.128s
Ran all test suites related to changed files.

Watch Usage
 โ€บ Press a to run all tests.
 โ€บ Press f to run only failed tests.
 โ€บ Press p to filter by a filename regex pattern.
 โ€บ Press t to filter by a test name regex pattern.
 โ€บ Press q to quit watch mode.
 โ€บ Press Enter to trigger a test run.

์ฝ˜์†” ๋ผ์ธ์ด ๋ˆ„๋ฝ๋˜์—ˆ๊ณ  ํŒจ์Šค๊ฐ€ ๋„ˆ๋ฌด ์•„๋ž˜์— ๋‘ ์ค„๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ "PASS"๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์˜ฌ๋ผ๊ฐˆ ๋•Œ ๊ณ ๋ ค๋˜์ง€ ์•Š์€ console.log์™€์˜ ์–ฝํž˜ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์‰ฌ์šด ๊ฒ€์ƒ‰ ๋ฐ ์กฐ์ž‘์„ ์œ„ํ•ด ์ด ์š”์•ฝ์„ ์š”์ ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค: https://gist.github.com/spion/bbb34c5abc1230a37ad5f4f01336b8df

ps ํ˜„์žฌ ๋งˆ์Šคํ„ฐ๋กœ ์ด๊ฒƒ์„ ์žฌํ˜„ํ•˜๋ ค๋ฉด ์•ฝ๊ฐ„์˜ ๊ฐ•์ œ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‹œ ๋ชจ๋“œ์— ๋“ค์–ด๊ฐˆ ๋•Œ ์ž ์‹œ ๋™์•ˆ "a"๋ฅผ ๋ˆ„๋ฅด๊ณ  ์žˆ์œผ์‹ญ์‹œ์˜ค. console.logs๋Š” ์–ด๋Š ์‹œ์ ์—์„œ ํ†ต์ œ ๋ถˆ๋Šฅ ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ๊ธฐ์น˜ ์•Š์€ ์žฅ์†Œ์™€ ์‹œ๊ฐ„์— ๋‚˜ํƒ€๋‚จ).

๋˜ํ•œ ๋‚˜๋Š” ์žŠ์–ด ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. WRT ํ„ฐ๋ฏธ๋„ ๋™์ž‘์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ์šฐ๋ถ„ํˆฌ ๋ฐ”์ด์˜ค๋‹‰์— ์žˆ์Šต๋‹ˆ๋‹ค.

% lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:    18.04
Codename:   bionic

๋‚˜๋„. @spion ์€ ๋‚ด๊ฐ€๋ณด๊ณ ์žˆ๋Š” ๊ฒƒ์„ ๋ชป ๋ฐ•์•˜์Šต๋‹ˆ๋‹ค. ๋Š๋ฆฐ ๋น„๋™๊ธฐ ์ฝ”๋“œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ˜์†” ์ถœ๋ ฅ์„ ๋ณธ ๋‹ค์Œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์š”์•ฝ์œผ๋กœ ๋ฎ์–ด์”๋‹ˆ๋‹ค.

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— [email protected] ๋กœ ๋˜๋Œ๋ ธ๊ณ  ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด [email protected] ์˜ ์ฝ˜์†” ์ถœ๋ ฅ ์œ„์— ์ž‘์„ฑ๋˜๋Š” ํ…Œ์ŠคํŠธ ์š”์•ฝ ์ถœ๋ ฅ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ - ์•ฝ๊ฐ„์˜ ์ง„์ „์ด ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ ํŒจ์น˜๋ฅผ ์ฐพ์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ Jest ๊ธฐ์ž์™€ ์ƒํƒœ ์ƒ์„ฑ๊ธฐ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

Jest๋Š” ํ”„๋กœ์„ธ์Šค stderr ๋ฐ stdout ์ŠคํŠธ๋ฆผ์˜ ์“ฐ๊ธฐ ๋ฐฉ๋ฒ•์„ ์ž์ฒด ์ž‘์„ฑ๊ธฐ๋กœ ์›์ˆญ์ด ํŒจ์น˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ž‘์„ฑ์ž๋Š” ์ง„ํ–‰ ์ค‘์ธ ํ…Œ์ŠคํŠธ ์ˆ˜, ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„, ๊ฒฝ๊ณผ ์‹œ๊ฐ„ ๋“ฑ๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์ด ํฌํ•จ๋œ jest-cli Status.js์˜ ์ถœ๋ ฅ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ŠคํŠธ๋ฆผ์— ์“ฐ๊ธฐ ๋ช…๋ น์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋ช…๋ น์€ ์ƒํƒœ์— ๋Œ€ํ•œ "์‚ญ์ œ" ๋ช…๋ น(ANSI ์ œ์–ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์Šน), ์›๋ž˜ ์“ฐ๊ธฐ ๋ฐ "์ƒํƒœ ๋‹ค์‹œ ์“ฐ๊ธฐ" ๋ช…๋ น์œผ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒํƒœ๊ฐ€ ํ•ญ์ƒ ํ™”๋ฉด ๋งจ ์•„๋ž˜์— ์žˆ๋Š” ๋ฐ˜๋ฉด ํ…์ŠคํŠธ๋Š” ํ™”๋ฉด ์œ„๋กœ ์Šคํฌ๋กค๋œ๋‹ค๋Š” ํ™˜์ƒ์ž…๋‹ˆ๋‹ค.

(๋ฌผ๋ก , ๊ทธ๊ฒƒ๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๋˜‘๋˜‘ํ•ฉ๋‹ˆ๋‹ค. ์“ฐ๊ธฐ๊ฐ€ ๋ฒ„ํผ๋ง๋˜๊ณ  ๋ฒ„ํผ๋ง๋œ ๋ฐ์ดํ„ฐ๋Š” ์ƒํƒœ์™€ ํ•จ๊ป˜ 100ms๋งˆ๋‹ค ํ•œ ๋ฒˆ๋งŒ ์‹ค์ œ๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ๋ณ‘๋ ฌ ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ( runInBand ๋ฅผ false๋กœ ์„ค์ •ํ•˜๋Š” ๊ฐ์‹œ ๋ชจ๋“œ์—์„œ ์‚ฌ์šฉ๋จ)๋Š” ๋‹ค๋ฅธ ์ž‘์—…์ž๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์ž๋Š” ์›๋ž˜ ํ”„๋กœ์„ธ์Šค์˜ stdio ์ŠคํŠธ๋ฆผ์„ "์ƒ์†"ํ•˜๋„๋ก ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํŒจ์น˜๋œ ๋ฒ„์ „์„ ์ƒ์†ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค! ์ด๋Ÿฌํ•œ ์“ฐ๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด

  1. ์ƒํƒœ ๋’ค์— ์ถ”๊ฐ€๋จ(์ƒํƒœ๊ฐ€ ์ง€์›Œ์ง€์ง€ ์•Š์Œ)
  2. ๋‹ค์Œ ์ƒํƒœ ์ง€์šฐ๊ธฐ์—์„œ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค(์ง€์šฐ๊ธฐ๊ฐ€ ์ฝ˜์†” ์ถœ๋ ฅ๊ณผ ์ด์ „ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ชจ๋‘ ์ง€์šธ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์œ„๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ์ƒํƒœ๋„ ๋ถ€๋ถ„์ ์œผ๋กœ ํ‘œ์‹œ๋จ).

ํŒจ์น˜๋œ ๋ฒ„์ „์ด ์ด๋Ÿฌํ•œ tty ์“ฐ๊ธฐ๋ฅผ ์ˆ˜์‹ ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ŠคํŠธ๋ฆผ์„ "์ƒ์†" ๋ชจ๋“œ์—์„œ "ํŒŒ์ดํ”„" ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ํ”„๋กœ์„ธ์Šค ์ถœ๋ ฅ์€ ๊ธฐ๋ณธ stdout/stderr๋กœ ์ง์ ‘ ์ด๋™ํ•˜๋Š” ๋Œ€์‹  ์ž์‹ ํ”„๋กœ์„ธ์Šค์—์„œ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ŠคํŠธ๋ฆผ์„ ์ˆ˜๋™์œผ๋กœ ํŒŒ์ดํ”„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

diff --git a/packages/jest-runner/src/index.js b/packages/jest-runner/src/index.js
index 2f4dd724..618a8cbf 100644
--- a/packages/jest-runner/src/index.js
+++ b/packages/jest-runner/src/index.js
@@ -97,11 +97,14 @@ class TestRunner {
     // $FlowFixMe: class object is augmented with worker when instantiating.
     const worker: WorkerInterface = new Worker(TEST_WORKER_PATH, {
       exposedMethods: ['worker'],
-      forkOptions: {stdio: 'inherit'},
+      forkOptions: {stdio: 'pipe'},
       maxRetries: 3,
       numWorkers: this._globalConfig.maxWorkers,
     });

+    worker.getStdout().pipe(process.stdout);
+    worker.getStderr().pipe(process.stderr);
+
     const mutex = throat(this._globalConfig.maxWorkers);

     // Send test suites to workers continuously instead of all at once to track

์ŠคํŠธ๋ฆผ์„ ์ˆ˜๋™์œผ๋กœ ํŒŒ์ดํ•‘ํ•˜๋ฉด ์›์ˆญ์ด ํŒจ์น˜ ์“ฐ๊ธฐ๊ฐ€ ๋…ธ๋“œ์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งŽ์€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ค‘๋‹จํ•˜์ง€๋งŒ ์ฃผ๋กœ ๋ˆ„๋ฝ๋œ ์ƒ‰์ƒ์œผ๋กœ ์ธํ•ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ–‰์œ„

diff --git a/packages/jest-worker/src/worker.js b/packages/jest-worker/src/worker.js
index 5eee64af..5e5126eb 100644
--- a/packages/jest-worker/src/worker.js
+++ b/packages/jest-worker/src/worker.js
@@ -94,6 +94,8 @@ export default class {
         {
           cwd: process.cwd(),
           env: Object.assign({}, process.env, {
+            // $FlowFixMe: Does not know about isTTY
+            FORCE_COLOR: process.stdout.isTTY,
             JEST_WORKER_ID: this._options.workerId,
           }),
           // Suppress --debug / --inspect flags while preserving others (like --harmony).

๊ทธ ์ˆ˜์น˜๋ฅผ ํฌ๊ฒŒ ๋‚ฎ์ถ”์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฝค ๋†’์Šต๋‹ˆ๋‹ค.

Test Suites: 51 failed, 232 passed, 283 total
Tests:       149 failed, 7 skipped, 2706 passed, 2862 total
Snapshots:   19 failed, 17 obsolete, 996 passed, 1015 total

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์“ฐ๊ธฐ ์ž‘์—…์ด ์ด์ œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ถœ๋ ฅ์ด ํฌ๊ฒŒ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋˜ํ•œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ถ€๋ชจ์—๊ฒŒ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ธ ํ›„ ์˜ค๋žœ ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„ ํŠน์ • ์ƒํ™ฉ์—์„œ ๋„ˆ๋ฌด ๋Šฆ๊ฒŒ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ํ”Œ๋Ÿฌ์‹œํ•˜๋Š” ๋…ธ๋“œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ์ณ์ฃผ์„ธ์š”, ์ด๊ฒƒ์€ ๋†๋‹ด์œผ๋กœ ์ƒ์‚ฐ์„ฑ์„ ์ •๋ง ํ•ด์นฉ๋‹ˆ๋‹ค

[email protected] ์œผ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์ฝ˜์†” ๋กœ๊ทธ ์ถœ๋ ฅ์ด ๋‹ค์‹œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ž‘๋™ํ•˜๋ ค๋ฉด --env ๋…ธ๋“œ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์„ธ์š”.

ํ˜„์žฌ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ˜์†” ๋กœ๊น…์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋™์ผํ•œ ๊ฒƒ์„ ์—ฐ์† 3-4๋ฒˆ ๋กœ๊น…ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Jest๋Š” ํŠน์ • ์ˆซ์ž๋งŒ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๋งค์šฐ ์งœ์ฆ๋‚ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? jest 23.4.1 ๋ฐ ๋…ธ๋“œ 9.11.1์„ ์‹คํ–‰ ์ค‘์ด๋ฉฐ ์ฝ˜์†” ๋กœ๊ทธ ์ถœ๋ ฅ์ด ๋‚˜ํƒ€๋‚  ๋•Œ๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

2๋…„ ๋™์•ˆ ์ฝ˜์†” ๋กœ๊ทธ๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋‚˜์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Jest ํŒ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์ด ๋ฏฟ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ ์ด์Šˆ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ๋‚˜์š”?

๋‚ด ๋ง์€, ๋ˆ„๊ฐ€ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๊ณ  ์‹ถ์–ดํ•˜๊ฒ ์Šต๋‹ˆ๊นŒ?

@jonogilmour๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ•œ ๋ฒˆ ๊ธฐ๋กํ•˜๋ฉด ํ‘œ์‹œ๋˜์ง€ ์•Š์ง€๋งŒ ๋‘ ๋ฒˆ ๊ธฐ๋กํ•˜๋ฉด ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

FWIW, --verbose=false ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๋‚ด package.json :

"scripts": {
...
    "test": "react-scripts test --env=jsdom --verbose=false",

๋‹ค๋ฅธ ๊ด€์ฐฐ:

  • --env=jsdom์„ ์ œ๊ฑฐํ•˜๋ฉด(๋‚ด ์‹ค์ œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์˜ต์…˜์ด ์•„๋‹˜) --verbose=false ์—†์ด๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • (๋ฐ˜์‘ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•˜์ง€ ์•Š๊ณ ) jest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด๋„ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์–ด์„ค์…˜์ด ์‹คํŒจํ•˜๊ณ  jest์—์„œ ํ›จ์”ฌ ๋” ๋งŽ์€ ์ถœ๋ ฅ์„ ์–ป์œผ๋ฉด ํ›จ์”ฌ ๋” ๋งŽ์€ ์ฝ˜์†” ๋กœ๊ทธ๋„ ๋ฎ์–ด์“ฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์•ˆ๋…• ๋‚จ์ž/์—ฌ์ž,
--watch ๋ชจ๋“œ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์œ ๋ช…ํ•œ jest ์ฝ˜์†” ๋กœ๊ทธ ๋ฌธ์ œ๋„ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ์ฑ…์€ --watch ๋Œ€์‹  --watchAll์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์š”์•ฝ์ด ๋” ๋ณด๊ธฐ ํ‰ํ•ด์กŒ์ง€๋งŒ ๋กœ๊ทธ๋Š” ์˜ˆ์ƒ๋Œ€๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

macOS ํ•˜์ด ์‹œ์—๋ผ
๋…ธ๋“œ v8.11.3
๋†๋‹ด: 23.6.0
ts-jest: 23.10.4

๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ beforeAll

  console.log = s => {
    process.stdout.write(s + "\n");
  };

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์‰˜์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

yarn test > test.log

์ €์—๊ฒŒ๋Š” mocha ๋กœ ์ „ํ™˜ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. DSL์ด ๋งค์šฐ ์œ ์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. JEST์˜ ์˜ˆ์ƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. https://www.npmjs.com/package/expect

jest ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  mocha $ ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ๋งŒํผ ์‰ฝ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ŠคํŒธ ์—ฌ๋ถ€, ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ์‰ฌ์šด ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ •๋ง ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. Jest๋Š” ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด์ง€ ๊ทธ ๋ฐ˜๋Œ€์˜ ๋ชฉ์ ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ๋‹ค์Œ์€ ์ง€๊ธˆ ์“ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

export const log = (s: any) => {
    console.log(s);
    console.log(s);
    console.log(s);
    process.stdout.write(s + "\n");
};

์ŠคํŒธ๋ฉ”์ผ์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

--verbose=false ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

--verbose=false ๋ฒ„์ „์ด 23.6.0 ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„ธ์ƒ์— ์ด๊ฑด ๊ณ ํ†ต์ด์•ผ :/ 2018๋…„ 11์›”

์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด์–ด์ฃผ์„ธ์š”

silent: false in jest.config.js ... ์ œ ๊ฒฝ์šฐ์—๋Š” ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์†”๋ฃจ์…˜๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋…ธ๋“œJS: v8.12.0
๋†๋‹ด: v23.4.1

๋‚˜๋Š” Jest๋ฅผ ๋ช‡ ๋‹ฌ ๋™์•ˆ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ ํ›Œ๋ฅญํ•˜๊ณ  ์ด ๋ฒ„๊ทธ๊ฐ€ _๋งค์šฐ ์งœ์ฆ๋‚˜๋Š”_ ๋ฐ˜๋ฉด์— ๋‚ด๊ฐ€ ํ•ญ์ƒ ์‚ฌ์šฉํ–ˆ๋˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋งค๋ฒˆ ์ฝ˜์†”์— ๊ธฐ๋ก๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •ํฌ ์–ด์„ค์…˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ์˜ ํ˜ธ์ถœ์„ ๋กœ๊ทธ์•„์›ƒํ•˜๋ ค๊ณ  ํ•  ๋•Œ:

expect('hello').toEqual(childFunc.mock.calls[0]) ์ถœ๋ ฅ:

screen shot 2018-11-27 at 10 26 44 am

์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์„ ๋งˆ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

--watch ํ”Œ๋ž˜๊ทธ๋กœ Jest๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
Jest ๋ฒ„์ „ 23.5.0
๋…ธ๋“œ ๋ฒ„์ „ 8.11.3

์ด๊ฒƒ์€ ํ›„๋“œ ์•„๋ž˜์—์„œ ์ง„ํ–‰๋˜๋Š” "๋„ˆ๋ฌด ๋งŽ์€ ๋งˆ๋ฒ•"๊ณผ ๋ฌด์–ธ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” console.log ์ถœ๋ ฅ์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์ด console.log ๋ฌธ์„ ๋ˆ„๋ฝํ•œ ๊ฒƒ๋ณด๋‹ค 1๋…„ ๋ฐ˜์˜ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๐Ÿ˜•

์œ„์˜ ๋‚ด์šฉ์— ๋™์˜ํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ์•„์ฃผ ๋†€๋ผ์šด ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์™„์ „ํžˆ ๋ถˆํ•„์š”ํ•œ ๋ฐฉ์‹์œผ๋กœ Jest๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด "ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•"์€ ๋งŽ์€ ๋…ผ๋ฆฌ๊ฐ€ log4js ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ Jest๋ฅผ ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ๋กœ ๊ตฌ๋ถ€๋ฆฌ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ข‹์Šต๋‹ˆ๋‹ค. ์Šฌํ”„๊ฒŒ๋„ ๋‚˜๋Š” ๊ฒฐ๊ตญ ๊ทธ๋“ค ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ console.log ์˜ ์‚ฌ๋ณธ 4๊ฐœ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๋Š” ๋งŽ์€ ์–‘์˜ ํด๋ผ์ด์–ธํŠธ ์ธก ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

expect ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์€ ํ…Œ์ŠคํŠธ ๋‚ด์—์„œ ๋กœ๊ทธ์ธํ•˜๋Š” ๊ฒฝ์šฐ ๊ดœ์ฐฎ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ(ํŠนํžˆ ํŽธ์ง‘๊ธฐ์—์„œ logjest ์™€ ๊ฐ™์€ ํ‚ค์›Œ๋“œ๋กœ ์Šค๋‹ˆํŽซ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—) ํ…Œ์ŠคํŠธ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ์‹ค์ œ ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค๊ณ  ๊ธฐ๋กํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

CI=true yarn run test ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์ „์— ๋งํ•ด์„œ ๋ฏธ์•ˆํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ œ๋ชฉ ์—†์ด๋„ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. "--verbose" ์˜ต์…˜์ด ์—†์œผ๋ฉด --verbose๊ฐ€ ์ผ์ข…์˜ ํ˜•์‹ ์ง€์ •์„ ์ˆ˜ํ–‰ํ•˜๊ณ  stdout ์ŠคํŠธ๋ฆผ์„ ๋Œ€์ฒดํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ €๋Š” 2๊ฐœ์›” ์ •๋„ ๋˜์—ˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ˆ„๊ตฐ๊ฐ€ ๊ทธ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด npm ๋ช…๋ น์—๋งŒ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค: npm run test:integration -- --watchAll --verbose --coverage --etc

๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ [email protected] ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์—๋Š” #6871์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

@jamesta696 ์•ˆ๋…•ํ•˜์„ธ์š”. ์—ฌ๊ธฐ ํ† ๋ก ์€ "๋ฌธ์ œ"์— ๋Œ€ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ ์— "์žฅ๋‚œ" ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ StackOverflow์— ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์งˆ๋ฌธ์„ ๊ฒŒ์‹œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹น์‹ ์„ ๋„์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ ๋ฌธ์ œ๋Š” ์ฃผ์š” ๋ฌธ์ œ๊ฐ€ ๋…ผ์˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ซํž™๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ์œผ๋กœ์„œ๋Š” ๋ฐ˜์‘๊ณผ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ์œ„ํ•œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ๋“œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ €๋Š” ๋†๋‹ด์˜ ์ผ์›์ด ์•„๋‹ˆ์ง€๋งŒ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋„๋ก ๋…ธ๋ ฅํ•ฉ์‹œ๋‹ค.

@SimenB ๋‚˜๋Š” jest๋ฅผ (๊ท€ํ•˜์˜ ์–ธ๊ธ‰๋œ ๋ฒ„์ „์œผ๋กœ) ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋‚ด ํ”„๋กœ์ ํŠธ์— ๋ช‡ ๊ฐ€์ง€ console.log ๋ฌธ์„ ๋ฐฐ์น˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” ์ˆ˜์ •๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  console.log ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ•˜๋ฉด ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ €๋Š” jest --watchAll ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@tobyhinloopen @SimenB ๋ฅผ ์–ธ๊ธ‰ํ•œ ์ง„ํ–‰ ์ƒํ™ฉ์˜ ์ฆ๊ฑฐ๋ฅผ ๋ณด๋‹ˆ ๋ฐ˜๊ฐ‘ ์Šต๋‹ˆ๋‹ค.

๋ฉ‹์ง€๋„ค์š” @tobyhinloopen!

๋˜ํ•œ [email protected] ๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๊ณ  --verbose=false ์—†์ด ๋ชจ๋“  ์ฝ˜์†” ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ [email protected] ๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๊ณ  --verbose=false ์—†์ด ๋ชจ๋“  ์ฝ˜์†” ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

+1. ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์ž˜ํ–ˆ์–ด์š”, Jest ์—ฌ๋Ÿฌ๋ถ„! ๐Ÿ˜„

๋‚˜๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด! ๋งˆ์น˜ ํฌ๋ฆฌ์Šค๋งˆ์Šค ๊ฐ™๋‹ค. ๐ŸŽ…

๐Ÿ˜ƒ

create-react-app ์—…๋ฐ์ดํŠธ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” jest ๋ฒ„์ „ 24.0.0 ์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ console.log ๋˜๋Š” console.error ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋“ค์ด ์กฐ๋กฑ๋ฐ›์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค

์ •๋ง ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. try/catch ๋ธ”๋ก์œผ๋กœ ๋ž˜ํ•‘ํ•ด๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

generator ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ™•์‹คํžˆ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ œ๊ฑฐํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ for ๋ฃจํ”„ ์™ธ๋ถ€์— ์žˆ์„ ๋•Œ ์˜ฌ๋ฐ”๋ฅธ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

image

Jest ๋ฒ„์ „์€ 24.0.0 , ๋…ธ๋“œ๋Š” 10.5

@tiborsaas console.log ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
changedGenerators ๋ฐ˜๋ณต์„ ๊ธฐ๋‹ค๋ฆฌ๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

await Promise.all(changedGenerators.map(async (generator) => {/* ... */}))

๋‹ต์žฅ์„ ๋ณด๋‚ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์˜ค๋ฅ˜๋กœ ์ธํ•ด console.log ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. forEach ์ฝœ๋ฐฑ์—์„œ ํ˜ธ์ถœํ•˜๋ฉด console.log ์™€ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์‹ค์ œ๋กœ ์ค„ ๋‹จ์œ„ ๋””๋ฒ„๊น…์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

const archives = await fs.readdir(archiveDir);

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋†๋‹ด ๋ฌธ์ œ๋Š” ๋กœ๊น…์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€ํ™”๋ฅผ ๋ฐฉํ•ดํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. (์ •ํ™•ํ•œ ์ฝ”๋“œ๋ฅผ ๋ชจ๋ฅธ ์ฑ„) ์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ๊ฑฐ๋ถ€๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ด์™€ ๊ฐ™์€ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ํฌํฌํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. )

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ forEach ์—์„œ expect ํ˜ธ์ถœ์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ฏธ๋ฆฌ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ Promise.all ์ ‘๊ทผ ๋ฐฉ์‹์€ ์•„๋ฌด ๊ฒƒ๋„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

forEach map ๋ฅผ ์‚ฌ์šฉํ•˜์…จ์Šต๋‹ˆ๊นŒ? ์š”์ ์€ Promise.all ์— ๋Œ€ํ•œ ์•ฝ์† ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@SimenB ๋„ค, ์••๋‹ˆ๋‹ค.

image

์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@tiborsaas Promise.all ๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค: await Promise.all(...) ์‚ฌ์šฉ

๊ทธ๊ฒƒ๋„ ๋˜‘๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ. :(

promise.all await new Promise((resolve) => setTimeout(resolve, 1000)) ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

์žฌ์ƒ์‚ฐ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? OP์—์„œ ๋ณด๊ณ ํ•œ ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์žˆ๋Š” ๋™์•ˆ ์ˆ˜์ •๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๋น„๋™๊ธฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์—ฌ์ „ํžˆ ๋กœ๊ทธ ๋ฌธ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ)

๋„ค, ์ฐธ์œผ๋กœ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

test('stuff', () => {
    setTimeout(() => console.log('hi', 500));
})

์ผ๋ฐ˜์ ์œผ๋กœ ์—ฌ์ „ํžˆ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์ธ์‡„๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Š” Promise.all([...], callback) ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” Promise.all([...]).then(callback) ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์ด ๊ทธ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค .all ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๋ฌด์‹œ๋˜๊ณ  ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ๋กœ๊ทธ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ). @tiborsaas

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

์˜ˆ, ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋กœ๊ทธ ๋ฌธ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@SimenB ์•„๋‹ˆ์š”, ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

> Promise.all([Promise.resolve(true)], () => console.log("hi")).then(console.log, console.error);
Promise {
  <pending>,
  domain: 
   Domain {
     domain: null,
     _events: { error: [Function: debugDomainError] },
     _eventsCount: 1,
     _maxListeners: undefined,
     members: [] } }
// output:
// [ true ]



์˜ˆ, ํ˜ผ๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. Thx @tobyhinloopen

const lol = await Promise.all(versions); ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊ทธ ๋ฌธ์ด ์†์‹ค๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋…ธ๋“œ๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋ฏ€๋กœ ์›๋ž˜ forEach ์˜ ๊ฒฝ์šฐ ๋กœ๊ทธ ๋ฌธ์ด ๊ณ„์† ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‚ฌ์šฉ์ž ์˜ค๋ฅ˜์ธ๋ฐ๋„ ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค.

ํ™๋ณด: # 7731

https://www.npmjs.com/package/debug ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊น…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Jest์™€ ํ•จ๊ป˜ ํ•˜๋ฉด ๋ ๊นŒ์š”?

์•„๋‹ˆ์š”, #6524๋ฅผ ํ•  ๋•Œ๊นŒ์ง€๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ์—์„œ debug ๋ฅผ ์กฐ๋กฑํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด console.log ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ฝ˜์†” ๋ฉ”์‹œ์ง€๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ์ถœ๋ ฅ๋  ๊ฒฝ์šฐ ์†์‹ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #7731 ํ•˜๋‹จ์˜ ์ฃผ์„์„ ์ฐธ์กฐํ•˜์„ธ์š”. ์ด๊ฒƒ์ด ์ผ๋ถ€ ์ด์œ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์— ๋ณด๊ณ ๋œ ๋ˆ„๋ฝ๋œ ์ฝ˜์†” ๋ฉ”์‹œ์ง€์˜ ์ „๋ถ€๋Š” ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

--verbose ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. --verbose๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์—๋Š” ๋ชจ๋“  ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹Œ ์ผ๋ถ€ ๋ฉ”์‹œ์ง€๊ฐ€ ์†์‹ค๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ v10.15.3 ๋ฐ jest v21.2.1์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ˜์†” ๋กœ๊ทธ๊ฐ€ Jest์— ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋งˆ์นจ๋‚ด ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๋Š” ๋ธ”๋กœ๊ทธ์˜ ์ตœ์‹  ๋ฐœํ‘œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๊ณ  ๋•Œ๋กœ๋Š” ์ฝ˜์†” ๋กœ๊ทธ๊ฐ€ ๋‹ค์‹œ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋Š” jest v24.8.0 ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ œ ์ž‘ํ’ˆ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค ๐Ÿคทโ€โ™‚๏ธ. ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ณต์ œ๋ฌผ์„ ๊ฒŒ์‹œํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ถœ๋ ฅ์„ ๊ธฐ๋กํ•˜์ง€ ๋ชปํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์กฐ์‚ฌ ํ›„ API ํ…Œ์ŠคํŠธ(์˜ˆ: supertest)์™€ ๊ด€๋ จ๋œ ๋กœ๊ทธ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋˜๋Š” :/

@thymikee ์ด๊ฒƒ์€ ์ผ๊ด€๋˜์ง€ ์•Š๊ฒŒ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์žฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์ •๋ง ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ:
ํ…Œ์ŠคํŠธ์—์„œ ๋‹จ์ผ ํŒŒ์ผ์„ ์„ ํƒํ•˜์—ฌ ๋‹ค์Œ ์‹คํ–‰( ์˜ต์…˜ p )

  • console.log('ํŒฌ์ธ ') (์ž‘๋™)
  • console.log(myObject) ๋ณ€๊ฒฝ(์ž‘๋™ํ•˜์ง€ ์•Š์Œ)
  • ๋งž๊ฒŒ ๋ณ€๊ฒฝ(์ž‘๋™ํ•˜์ง€ ์•Š์Œ)
  • console.log('pantz')๋กœ ๋ณ€๊ฒฝ(์ž‘๋™ํ•˜์ง€ ์•Š์Œ)
  • ๊ทธ๊ฒƒ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝ(์ž‘๋™ํ•˜์ง€ ์•Š์Œ)
  • ๋†๋‹ด์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค (์ž‘๋™ํ•˜์ง€ ์•Š์Œ)
  • ๋งž๊ฒŒ ๋ณ€๊ฒฝ (์ž‘๋™)

์ด์ œ ๋™์ผํ•œ ๋‹จ๊ณ„๋ฅผ ๋ณต์ œํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ฒฐ๊ณผ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

JEST ์ง์›์ด ๋””๋ฒ„๊น…์„ ๋„์šธ ์ˆ˜ ์žˆ๋„๋ก ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ƒ˜ํ”Œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์„ธ์š”. @ํฌ๋ ˆ์Šฌ๋ฆฌ

await ๋˜๋Š” ๋น„๋™๊ธฐ console.log ๊ฐ€ ๋Œ€๋ถ€๋ถ„ ๋ˆ„๋ฝ๋œ ์‚ฌ์šฉ์ž ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ๋„ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๋•Œ ์ด๊ฒƒ์„ ์žฌํ˜„ํ•˜๋Š” ์‹œ๊ฐ„์„ ์ฐพ๋„๋ก ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ ๋‚˜๋Š” ์•„๋ž˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‚ด ๋กœ๊ทธ๊ฐ€ ๊ฒฐ๊ณผ์— ์˜ํ•ด ๋จนํžˆ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. FAIL์ด ํ‘œ์‹œ๋˜๊ธฐ ์ „์— 2๊ฐœ์˜ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ 2๊ฐœ์˜ ๋กœ๊ทธ๋งŒ ์ œ๊ฑฐ๋œ๋‹ค๋Š” ์ ๋„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ์•„๋ž˜์— 10๊ฐœ์˜ ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด 8๊ฐœ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์‹œ์ž‘์ธ ๊ฒƒ ๊ฐ™์•„์š” :)

ezgif com-gif-maker

ํ•œํŽธ, ์ž‘๋™ํ•˜๋Š” ํฌ๊ด„์ ์ธ ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ winston ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ๊ณผ ์ฝ˜์†”์— ๋ชจ๋‘ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ˜์†” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๋”๋ผ๋„ ํŒŒ์ผ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

winston ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋””์— ๊ธฐ๋กํ•  ๊ฒƒ์ธ์ง€ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค์ค‘ ์ „์†ก์„ ์ง€์›ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const logger = winston.createLogger({
  level: "verbose",
  format: winston.format.json(),
  defaultMeta: {},
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: "combined.log" }),
  ],
});

logger.error(stuff)

์•„๋งˆ๋„ winston์˜ ๋กœ๊ฑฐ์— ๋Œ€ํ•ด ์ „์—ญ์ ์œผ๋กœ console.* ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋”๋Ÿฌ์šด ์ผ์„ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@kresli ๋‹น์‹ ์˜ ๋†๋‹ด์€ ์–ด๋–ค ๋ฒ„์ „์ธ๊ฐ€์š”? v23 ๋™์ž‘์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ jest v^24.6.0 ๋ฐ node v10.14.2 ์—์„œ ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ๋ฅผ ์•Œ๊ฒ ์–ด์š”?

@yaelz ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜์ง€๋งŒ ๋ฒ„๊ทธ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ์ด๋ ฅ์ด ์žˆ๋Š” ์™„๊ณ ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ธฐ์—ฌ์ž๋“ค์ด ์˜ˆ์ œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋น ๋ฅธ ์‘๋‹ต ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
ํ˜„์žฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ๋‚ด ์กฐ์ง์—์„œ ๋น„๊ณต๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค... ์•Œ๊ฒŒ ๋˜๋ฉด ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. :)

์ด๊ฒƒ์€ jest v^24.6.0 ๋ฐ node v10.14.2 ์—์„œ ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ๋ฅผ ์•Œ๊ฒ ์–ด์š”?

์ตœ๊ทผ์— ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๋ถ€ ์ข…์†์„ฑ์„ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•œ ๋‹ฌ ์ „์— ์ง๋ฉดํ–ˆ์ง€๋งŒ ์ตœ์‹  ๋ฒ„์ „์—์„œ๋Š” ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด ์ง€๊ธˆ ์‚ฌ์šฉ ์ค‘์ธ ๋ฒ„์ „์„ ๊ณต์œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

2019๋…„ 8์›” 5์ผ ์›”์š”์ผ ์˜คํ›„ 12:43 Norman Enmanuel [email protected]
์ผ๋‹ค:

๋น ๋ฅธ ์‘๋‹ต ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
ํ˜„์žฌ ์ €์žฅ์†Œ๊ฐ€ ๋‚ด ์กฐ์ง์—์„œ ๋น„๊ณต๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์— ๋„๋‹ฌํ•˜๋ฉด ๋‹น์‹ ์€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :)

์ตœ๊ทผ์— ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๋ถ€ ์ข…์†์„ฑ์„ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๋Š”๋ฐ ์•„๋ฌด๋Ÿฐ ์ข…์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
๋ฌธ์ œ, ๋‚˜๋Š” ํ•œ ๋‹ฌ ์ „์— ์ด๊ฒƒ์„ ์ง๋ฉดํ–ˆ์ง€๋งŒ ์ตœ์‹  ๋ฒ„์ „์—์„œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋ฏฟ๋‹ค...

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/facebook/jest/issues/3853?email_source=notifications&email_token=AB6F4PAE3CHUMEBP7IYXRPLQC7Y2DA5CNFSM4DPZ3JSKYY3PNVWWK3TUL52HS4DFVREXG43VMXHJKTDNMV
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AB6F4PFXDSRHBW5CMTT2DKDQC7Y2DANCNFSM4DPZ3JSA
.

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด ์ง€๊ธˆ ์‚ฌ์šฉ ์ค‘์ธ ๋ฒ„์ „์„ ๊ณต์œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

ํ™•์‹ ํ•˜๋Š”:

๋†๋‹ด

^24.8.0

๋…ธ๋“œ -v

v10.16.0

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ e2e, ํ†ตํ•ฉ, ๋‹จ์œ„ ๋ฐ ์ˆ˜๋ฝ์„ ๋ชจ๋‘ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ npm ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

"scripts": {
  "test": "NODE_ENV=test npm run test:unit && npm run test:integration:both",
  "test:unit": "NODE_ENV=test jest --config test/jest.config.unit.js --detectOpenHandles",
  "test:integration": "NODE_ENV=test MOCK=false jest --config test/jest.config.integration.js --runInBand --detectOpenHandles",
  "test:integration:mock": "NODE_ENV=test MOCK=true jest --config test/jest.config.integration.js --runInBand --detectOpenHandles",
  "test:integration:both": "NODE_ENV=test npm run test:integration:mock -- --coverage; npm run db:migration:test; npm run test:integration -- --coverage;",
  "test:report": "open docs/test/report/index.html",
  "test:report:coverage": "open docs/test/coverage/lcov-report/index.html"
}

์ด๊ฒƒ์€ jest.config์ž…๋‹ˆ๋‹ค.

"use strict";

module.exports = {
  "bail": true,
  "verbose": false,
  "collectCoverage": false,
  "expand": true,
  "testURL": "http://localhost:3000/",
  "coverageDirectory": "./docs/test/coverage",
  "testEnvironment": "node",
  "rootDir": "../",
  "setupFilesAfterEnv": [
    "./test/jest.setup.js"
  ],
  "jest.showCoverageOnLoad": true,
  "watchPathIgnorePatterns": ["node_modules"],
  "transform": {
    "^.+\\.js$": "babel-jest",
    '^.+\\.tsx?$': 'ts-jest',
  },
  "reporters": [
    "default",
    ["./node_modules/jest-html-reporter", {
      "pageTitle": "...",
      "outputPath": "./docs/test/report/index.html",
      "includeFailureMsg": true,
      "sort": "titleAsc",
      "dateFormat": "yyyy-mm-dd HH:MM:ss"
    }]
  ]
};

๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ ๋•Œ ์ด๊ฒƒ์„ ์žฌํ˜„ํ•˜๋Š” ์‹œ๊ฐ„์„ ์ฐพ๋„๋ก ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ ๋‚˜๋Š” ์•„๋ž˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‚ด ๋กœ๊ทธ๊ฐ€ ๊ฒฐ๊ณผ์— ์˜ํ•ด ๋จนํžˆ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. FAIL์ด ํ‘œ์‹œ๋˜๊ธฐ ์ „์— 2๊ฐœ์˜ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ 2๊ฐœ์˜ ๋กœ๊ทธ๋งŒ ์ œ๊ฑฐ๋œ๋‹ค๋Š” ์ ๋„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ์•„๋ž˜์— 10๊ฐœ์˜ ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด 8๊ฐœ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์‹œ์ž‘์ธ ๊ฒƒ ๊ฐ™์•„์š” :)

ezgif com-gif-maker

@kresli ์—ฌ๊ธฐ์— ์žˆ๋Š” ์ƒํƒœ ํ‘œ์‹œ์ค„๊ณผ ์‹œ๊ฐ„ ์ถœ๋ ฅ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ _RUN HARNESS test-harness/index.js_๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋งจ ๋์— ๋‚ด console.log ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  _RUN HARNESS..._ ํ–‰์ด _๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.๋งˆ๊ตฌ...._

์—…๋ฐ์ดํŠธ: ๋ฌด์‹œํ•˜์‹ญ์‹œ์˜ค. ๋‚ด ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

MacOS์˜ ๋…ธ๋“œ v12.16.1, jest 25.5.4, typescript 3.8.3์—์„œ ์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. --runInBand ์‚ฌ์šฉ, ์ž์„ธํ•œ ์ •๋ณด ๋น„ํ™œ์„ฑํ™”/ํ™œ์„ฑํ™”, --silent=true ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋„์›€์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰