Mocha: ๊ธ€๋กœ๋ฒŒ ์˜ตํŠธ ์•„์›ƒ

์— ๋งŒ๋“  2013๋…„ 08์›” 20์ผ  ยท  43์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mochajs/mocha

@isaacs ๋Š” Mocha ํ…Œ์ŠคํŠธ๊ฐ€ node ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์–ด๋ฆฌ์„์€ ๋ถˆ๋งŒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฐ€ ๋ณด์ปฌ ์†Œ์ˆ˜๋ฅผ ๋Œ€ํ‘œํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๊ทธ๋“ค์„ ํ์‡„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋งˆ๋„ ๊ฐ€์น˜๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ตฌ์ƒํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด describe , it ๋“ฑ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋Œ€์‹  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

var mochaBDD = require("mocha/bdd");
var describe = mochaBDD.describe;
var it = mochaBDD.it;

// ok, stupid boilerplate is over but at least I don't have to use a test runner, woohoo!

๋˜๋Š” ๊ทธ๋ƒฅ

require("mocha/bdd");

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์„ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๊ธ€๋กœ๋ฒŒ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

feature help wanted

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

+1 :
import { describe, before, it } from 'mocha';

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

require('mocha') ๋•Œ ์ „์—ญ ๊ณต๊ฐ„ ์ „์ฒด์— ์“ฐ๋ ˆ๊ธฐ๋ฅผ ๋ฒ„๋ฆฌ๋”๋ผ๋„ ํ˜„์žฌ ์ƒํ™ฉ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

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

var Mocha = require('mocha');
var mocha = new Mocha(options);
mocha.describe('blah blah', function....

์•„๋ฌด๋„ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด์ง€๋งŒ ์ ์–ด๋„ ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋” ๊นจ๋—ํ•œ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋งค๋ฒˆ ์„ค์ •ํ•ด์•ผํ•˜๋Š” _ton_์˜ ์ƒ์šฉ๊ตฌ๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ CLI-ish API๋กœ ๋ฒ”์œ„๋ฅผ ์ขํž ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ARGV์— ๋ฐฉ๊ธˆ ์ „๋‹ฌํ•œ lib / cli.js๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ˆ„๊ตฐ๊ฐ€ ์‚ฌ์šฉํ•  ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์ง€๋งŒ CLI ์—†์ด๋„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” ์•„๋ฌด๋„ ์‹ค์ œ๋กœ ์ผ๋ถ€ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๋„˜์–ด์„œ๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

@visionmedia ๊ฝค ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ require("mocha/bdd") ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์ œ์•ˆํ•œ ์ด์œ ๋Š” ๊ธฐ์กด์˜ Mocha ์ธก๋ฉด์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฌ์šธ ๊ฒƒ์ด์ง€๋งŒ ๋„ค, ์•„๋งˆ๋„ ๋‹น์‹ ์˜ ๊ฒƒ์ด ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„์š”, ์•„๋งˆ๋„ process.on ( 'uncaughtException') ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ๊นจ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์–ธ์  ๊ฐ€๋Š” ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Destructuring Assignment๋ฅผ ํ†ตํ•œ ์•ฝ๊ฐ„์˜ ๋ฏธ๋ž˜ JavaScript๊ฐ€ ๋จผ ๊ธธ์„๊ฐ€๋Š” ํ›Œ๋ฅญํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/1.7#Destructuring_assignment_ % 28Merge_into_own_page.2Fsection % 29

var [describe,it,beforeEach,afterEach] = new require("mocha")(options);

์ด๊ฒƒ์— ๋Œ€ํ•œ ๋…ธ๋“œ ์กฐํ™” ์ง€์›์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ž…๋‹ˆ๊นŒ?

node test/a-mocha-test.js

๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ ํ–ˆ์Šต๋‹ˆ๊นŒ?

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ

nodespec์—์„œ ์ง์ ‘์ด ์ž‘์—…์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๊ฒŒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ• /์‹œ๊ธฐ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ 2 ๋‹จ๊ณ„ ์ •์˜ / ์‹คํ–‰ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ƒ๊ฐ ํ•ด๋‚ธ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
1) ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฉ๋ฆฌํ•˜์—ฌ ์‹คํ–‰ํ•˜๋ ค๋Š” ๋ชจ๋“  ํŒŒ์ผ์˜ ๋งจ ์•„๋ž˜์— mocha.exec ()์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค.
2) core๊ฐ€ process.on ( 'exit')์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ถ”๊ฐ€ ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์—ฌ์ „ํžˆ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ๋•Œ
3) ๊ฐ ํŒŒ์ผ์— ํ•˜๋‚˜์˜ ์ตœ์ƒ์œ„ ๊ธฐ์ˆ  ๋ธ”๋ก ๋งŒ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์™„๋ฃŒ๋˜๋ฉด ์‹คํ–‰์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

(1) ์•„๋งˆ๋„ ๊ฐ€์žฅ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

var run = require('mocha/required');

describe('blah blah' , function() {
// ..
});

run();

์ด๊ฒƒ์€ mocha ๋ž˜ํผ์—†์ด ์‹คํ–‰ํ•ด์•ผ ํ•  ๋•Œ node ./node_modules/.bin/_mocha test/a-mocha-test.js ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋งŽ์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ํ˜„์žฌ ๋ชจ์นด๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹๊ณผ ๋” ์ด์ƒ ๋งž์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๋Š” 1 ๋…„ ๋„˜๊ฒŒ ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์œผ๋ฏ€๋กœ ์ง€๊ธˆ์€ ๋‹ซ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ์ด๊ฒƒ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์ž์œ ๋กญ๊ฒŒ ์˜๊ฒฌ์„ ๋งํ•˜๊ฑฐ๋‚˜ ํ’€ ์š”์ฒญ์„ ์ œ์•ˆํ•˜๋ฉด ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค :)

๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์— ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. node test.js ๋ชจ์นด ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์ €์™€ Mapbox์˜ ๋™๋ฃŒ๋“ค์ด ๋ชจ์นด์—์„œ ํ…Œ์ดํ”„ ๋ฐ ํƒญ๊ณผ ๊ฐ™์€ ํ•˜๋„ค์Šค๋กœ ์ด๋™ํ•˜๋Š” ์ฃผ๋œ ์ด์œ  ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ๋ชจ์นด๋ฅผ ๊ณ ์ˆ˜ํ•˜๊ณ  ์‹ถ์ง€๋งŒ "๋…ธ๋“œ ๋Šฅ๋ ฅ"์ด๋ผ๋Š” ์ฃผ์žฅ์ด ๋‹ค์†Œ ์„ค๋“๋ ฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : "node-ability"์ธ์ˆ˜๋Š” @tmcw here์— ์˜ํ•ด ์ •๊ตํ™” ๋˜์—ˆ์Šต๋‹ˆ๋‹ค .

๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด require ๊ฐ€๋Šฅ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ์ฃผ์š” ์ฐจ๋‹จ ์š”์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด๋ฏธ ์ž‘๋™ํ•˜๋„๋ก ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

var describe = require('mocha').describe;
var before = require('mocha').before;
var it = require('mocha').it;

ES6์—์„œ๋Š” ๋” ์ข‹์•„์ง‘๋‹ˆ๋‹ค.

import { describe, before, it } from 'mocha';

๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด mocha ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•  ๋•Œ๋งŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค .

์˜ค, ํ•ด๋ช… ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. :) mocha ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ๋•Œ ์ด๋ฏธ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๋ฉด, ๋…ธ๋“œ์—์„œ๋„ ๋˜‘๊ฐ™์ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ!

์ด์ œ ๋…ธ๋“œ์— beforeExit ํ›„ํฌ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ƒ๋‹นํžˆ ๊ฐ€๋Šฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

var { describe, it } = require('mocha/auto')

๋„ค. TJ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด, ๋ฌธ์ œ๋Š” ๋ชจ๋“  ๊ฒƒ์„ "๋…ธ๋“œ ๊ฐ€๋Šฅ"์œผ๋กœ ๋งŒ๋“ค๋”๋ผ๋„ ์œ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋„ˆ๋ฌด ๋งŽ์€ ์ƒ์šฉ๊ตฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜๋‚˜...

@glenjamin beforeExit ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ๋ณด๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์ด ๋„ˆ๋ฌด ๋งŽ์€ "๋งˆ์ˆ "์ด๋ผ๊ณ  ๋ถˆํ‰ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

3cdd4a04c48193cceac6af7db72af06d380014a9์— ๊ฐœ๋… ์ฆ๋ช…์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์•ฝ๊ฐ„์˜ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์‰ฝ๊ฒŒ ์ผ๋ฐ˜ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” Growl, mocha.opts ๋˜๋Š” ์ข…๋ฃŒ ์ฝ”๋“œ์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๊ธฐํƒ€ process ๊ด€๋ จ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ง€์›์ด ์—†์Šต๋‹ˆ๋‹ค. bin/_mocha ์—์„œ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์—ฌ๊ธฐ์—์„œ ๋‹ค์‹œ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๋Š” ๋…ผ์Ÿ์„์ง€์ง€ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด :

$ node test/my-test.js --reporter=dot

๋ˆ„๊ตฌ๋“ ์ง€ ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

bin/_mocha ์ผ๋ถ€ ํ•ญ๋ชฉ์„ ์ผ์ข…์˜ CLI๋กœ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์€ ์ƒ๊ด€์—†์ด ๊ฝค ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์ด๊ฒƒ์ด ์ •๋ง๋กœ ์œ ์šฉํ•œ ์ถ”๊ฐ€์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ ์ค‘ ์‹ค์งˆ์ ์ธ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

node test/test.js
./node_modules/.bin/mocha test/test.js
PATH=./node_modules/.bin:$PATH mocha test/test.js
npm test -- test/test.js

node ๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ์นด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋‹จ์ˆœํžˆ ๋ชจ์นด๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๊ณ  ๋ณ€๋ช…์„ ์ฐพ๊ณ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด๋ผ๋Š” ๋Š๋‚Œ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค! ๋ชจ์นด๊ฐ€ ๋ชจ๋“  ์‚ฌ๋žŒ์„์œ„ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. jspm ๋ฐ SystemJS๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰์ค‘์ธ ํ…Œ์ŠคํŠธ์—์„œ import Mocha๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

import { describe, before, it } from 'mocha';

๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@glenjamin ๊ทธ๋ƒฅ ์ผ์–ด๋‚  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Mocha์—๋Š” ํ•ต์‹ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ API๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ข‹์€ ๋ถ€์ž‘์šฉ์€ ๋…ธ๋“œ ๊ฐ€๋Šฅ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ์€ ๋ธŒ๋ผ์šฐ์ €, CLI ๋˜๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒƒ์ด ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Mocha.app, ๋ˆ„๊ตฌ? :)

์ด ๊ธฐ๋Šฅ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค!

+1 :
import { describe, before, it } from 'mocha';

ํ˜„์žฌ const {describe, it} = require('mocha') ์ด ์žˆ์ง€๋งŒ ์ „์—ญ์ด ์ด๋ฏธ ์กด์žฌํ•˜๋ฏ€๋กœ ํ•„์š” ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ์ง€์›์ด ์—ผ๋ ค๋œ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ const {describe, it} = window.mocha ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ฐจ์ด ๋ฅผ ์œ„ํ•ด ์ด๊ฒƒ์„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์Œ, const {describe, it} = window ๋„ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ mocha์˜ ์•„ํ‚คํ…์ฒ˜์— ๋งค์šฐ ๊ธฐ๋ณธ์ด์–ด์„œ mocha ๋Š” ๋ฒˆ๋“ค๋กœ ๋ฌถ์ผ ๋•Œ

๋‚˜๋Š” mocha๊ฐ€ ๋‹จ์ผ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์ด์™ธ์˜ ์ „์—ญ์„ ์ •์˜ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์œผ๋ฉฐ ์•„๋งˆ๋„ ๋ธŒ๋ผ์šฐ์ €์— ๋Œ€ํ•ด์„œ๋งŒ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mocha ์‹คํ–‰ ํŒŒ์ผ์€ ๊ณ„์† ์ „์—ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ฒฐ์ฝ” ๋ณ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์‹œ๋„ ํ•  ์ˆ˜์žˆ๋Š” (๊ทธ๋ฆฌ๊ณ ํ•ด์•ผ ํ• ) ๊ฒƒ์€ ๊ธ€๋กœ๋ฒŒ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๊ณ  node ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ mocha ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” ๋Šฅ๋ ฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด์ด ๋ฌธ์ œ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆํƒ€๊น๊ฒŒ๋„ ํ…์‚ฌ์Šค ํฌ๊ธฐ์˜ ๊ผฌ๊ธฐ ๊ณต์€ ์•„๋ฌด๋„ ํ’€์ง€ ๋ชปํ–ˆ๋˜ ์‹œ๊ฐ„์ด๋‚˜ ์—๋„ˆ์ง€๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.์ด ๋ฌธ์ œ์˜ ๋‚˜์ด๊ฐ€๋˜๋ฉด ๋ถ„๋ช…ํ•ด์ง‘๋‹ˆ๋‹ค ...

mocha ์‹คํ–‰ ํŒŒ์ผ์€ ๊ณ„์† ์ „์—ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ฒฐ์ฝ” ๋ณ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ์นด๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด์ง€๋งŒ์ด ๋‹จ์ผ ๋””์ž์ธ ์„ ํƒ์ด ๋ฌธ์ œ์˜ ์›์ธ์ด๋ผ๊ณ  ๋‹จ์–ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ ๊ทธ๋ ‡๊ฒŒ!

๋‚˜๋Š” ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด๊ณ  ์ง€๋‚œ๋ฒˆ์— ๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชปํ–ˆ๋Š”์ง€ ์•Œ์•„ ๋‚ด๊ณ  ์ „์—ญ์„ ํ•ดํ‚นํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๊ณ  node test/someFile.js ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ƒ๊ฐํ–ˆ๋‹ค.

  • ๊ธ€๋กœ๋ฒŒ ํšŒํ”ผ

    • semver ์ „๊ณต์—์„œ๋„ ์šฐ๋ฆฌ๋Š” ๊ธ€๋กœ๋ฒŒ์„ ์‚ฌ์šฉํ•˜๋Š” Mocha ์‚ฌ์šฉ์˜ ์••๋„์  ๋‹ค์ˆ˜๋ฅผ ๊นฐ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํŒ€์€ ๋ชจ๋‘ ํ•˜๋ฃจ ์ผ๊ณผ๋ฅผ ๊ทธ๋งŒ๋‘๊ณ , ๋‹ค์‹œ๋Š” ์ž ์„ ์ž์ง€ ์•Š๊ณ , ๋‚˜๋จธ์ง€ ์ปค๋ฆฌ์–ด๋ฅผ ์—ฌ๊ธฐ์— ๋ณด๋‚ด๊ณ , ์ˆ˜๋ฐ˜๋˜๋Š” ์ƒ์ƒํ•  ์ˆ˜์—†๋Š” ์ง€์› ์š”์ฒญ์„ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜์žˆ๋Š” ์ธ๋ ฅ์ด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด๊ฒƒ์€ ์˜์›ํžˆ ํ”Œ๋ž˜๊ทธ ๋’ค์—์žˆ์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

    • ํ˜„์žฌ BDD ๋ฐ TDD ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค require("mocha").it ๋“ฑ์œผ๋กœ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค (๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์—†์Œ). (์ฐธ๊ณ  : ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ํƒํ•  ๋•Œ ์ด๊ฒƒ์ด ๊นจ์ง€์ง€ ์•Š๋Š” ์ด์œ ๋Š” Mocha๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ํƒํ•˜๋”๋ผ๋„ BDD ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. # 2207)์ด ๋ฌธ์ œ์—์„œ ๋ฒ—์–ด๋‚˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

    • ์‚ฌ์šฉ์ž ์ •์˜ (ํƒ€์‚ฌ) ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ ์Šคํ‚ค๋งˆ์™€ ํ•จ๊ป˜ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค ( global ๋ฅผ ํ•˜๋“œ ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹  ๋‚ด ๋ณด๋‚ธ ์ปจํ…์ŠคํŠธ ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•œ).

    • ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ Mocha ( require("mocha") ๋‚ด๋ณด๋‚ด๊ธฐ)์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

    • BDD ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•ญ์ƒ ์„ค์ •๋˜์–ด์žˆ๋Š” ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด Mocha ์—์„œ BDD ๋ฐ TDD ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ณ„์† ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ๋„ ๊นŒ๋‹ค๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

    • require("mocha/tddInterface").test ๋˜๋Š” require("mocha/interface/bdd").it ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ํ•œ Mocha์˜ UI๋ฅผ TDD๋กœ ์„ค์ •ํ•˜๊ณ  BDD ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€๋กœํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค ( "mocha/lib/interfaces/<interface name>" ์™€ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋ผ์ด๋ธŒ ๊ตฌํ˜„).

    • semver-major๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ export-BDD-and-TDD-on-Mocha-on-Mocha-if-possible ๋™์ž‘์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์š”์ฒญํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒƒ๋ณด๋‹ค ์ž์‹ ์ดํ•˜๋Š” ์ผ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์•Œ๊ณ  ์–ด์จŒ๋“  ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ๋–จ์–ด ๋œจ๋ฆด ๋•Œ ๋ถˆํ‰ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธ€๋กœ๋ฒŒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์กด์žฌํ•ฉ๋‹ˆ๋‹ค).

  • ๋…ธ๋“œ ๋Šฅ๋ ฅ, ์ฆ‰ ์‹คํ–‰ ํ•  ์ˆ˜์žˆ๋Š” node test/someFile.js ๋Œ€์‹  mocha test/someFile.js

    • ์ „ ์„ธ๊ณ„์— ๋น„ํ•ด ๋œ ํŽธ์žฌํ•˜์ง€๋งŒ var Mocha = require("mocha"); var mocha = new Mocha() ๋“ฑ (์˜ˆ : "ํ”„๋กœ ๊ทธ๋ž˜ ๋งคํ‹ฑ ์ธํ„ฐํŽ˜์ด์Šค")์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ๊นฐ ์—ฌ์œ ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๊ณ  Mocha "๋…ธ๋“œ ๊ฐ€๋Šฅ ๋ฐฉ์‹"์‹คํ–‰์„ ํ”ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด (์šฐ๋ฆฌ์—๊ฒŒ ๋” ์‰ฌ์šฐ์ง€๋งŒ ์‚ฌ์šฉ์ž์˜ ์˜ตํŠธ ์ธ์ด ํ•„์š”ํ•จ) ๋‹ค๋ฅธ ๊ฐ€์ ธ ์˜ค๊ธฐ (์˜ˆ : require("mocha/nodeable").it ํ†ตํ•ด ๋…ธ๋“œ ๊ธฐ๋Šฅ์— ์•ก์„ธ์Šคํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. .describe ๋“ฑ). ๋Œ€์‹ ์— ํŽธ์Šน์˜ ํŠน๋ณ„ํ•œ ์ˆ˜์ž… require("mocha") ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ์™€์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ˆ˜์ถœ์—์„œ ๋ฉ€๋ฆฌ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค (ํ”ผ ์ „์—ญ ์„น์…˜์—์„œ ์„ค๋ช…ํ•˜๊ณ  ์ •๋‹นํ™”) ๋‚ด ์š•๋ง์— ๋”ฑ ๋งž๋Š” Mocha ๊ฐ์ฒด๋ฅผ require("mocha") ๋‚ด๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.

    • node test/someFile.js ํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด someFile.js ๊ฐ€ Mocha์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜์žˆ๋Š” ๊ฒƒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Mocha๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•ด์•ผํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ชจ๋‘ ์„ค์ •๋˜๋ฉด Mocha๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, require("mocha/nodeable") ๋Š” Mocha๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚ด ๋ณด๋‚ธ ๋‹ค์Œ ... ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ์‹คํ–‰ ๋œ ํ›„ Mocha๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

    • ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ process.on("beforeExit" ์—์„œ Mocha๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ process.nextTick ๋˜๋Š” setImmediate ๋˜๋Š” setTimeout(..., 0 /* or some small number */) ์—์„œ Mocha๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • --delay ํ•˜๊ณ  run() ๋น„๋™๊ธฐ ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ํ…Œ์ŠคํŠธ๋Š” ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰์‹œ๊ธฐ๋ฅผ ์•Œ๊ธฐ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ run() ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. --delay (์•„๋ž˜ ์ฐธ์กฐ ๋˜๋Š” require("mocha/nodeable/delayed") ) ์—ฌ๋ถ€๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋„ ์•„๋‹™๋‹ˆ๋‹ค. run() ๋Š” ํ˜„์žฌ ์„ค๊ณ„๋œ๋Œ€๋กœ ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์—์„œ๋งŒ ํ˜ธ์ถœ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋””์ž์ธ์€ ์ด๋ฏธ ์ž‘์—…ํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์–ด์จŒ๋“  ๋ชจ๋“  ํ…Œ์ŠคํŠธ ํŒŒ์ผ์—์„œ run() ๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ "๋…ธ๋“œ ๊ฐ€๋Šฅ"ํ…Œ์ŠคํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๊ณ ์ณ๋ผ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ... ์–ด๋–ป๊ฒŒํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

    • node ๋Œ€์‹  mocha ๋ฅผ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋ ค๋ฉด (์ฆ‰, node ๊ฐ•์ œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ) require d๋Š” CLI๊ฐ€ ์‚ฌ์šฉ ์ค‘์ผ ๋•Œ ๊ฐ์ง€ํ•ด์•ผํ•˜๋ฉฐ Mocha๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ API๊ฐ€ ์‚ฌ์šฉ์ค‘์ธ์‹œ๊ธฐ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. CLI๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“ˆ์ด ํ™•์ธํ•  ์ „์—ญ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์ด๋Ÿฌํ•œ ๋ชจ๋“ˆ์ด CLI๊ฐ€ Node๊ฐ€ ์‹คํ–‰ ํ•œ ํŒŒ์ผ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • Node๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ mocha.opts ์‚ฌ์šฉํ•  ๋•Œ Mocha ํ”Œ๋ž˜๊ทธ ์ „๋‹ฌ์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ ๊ฐ€๋Šฅ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด Mocha์˜ ๊ธฐ๋ณธ๊ฐ’ ์ด์™ธ์˜ ๋™์ž‘์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ง€์›ํ•˜๋ ค๋ฉด CLI ์กฐ๊ฐ์„ ๋” ๋ชจ๋“ˆํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ–‰๋™.

  • ์ด ๋‘ ๊ฐ€์ง€ ์•„์ด๋””์–ด์˜ ์ œ์•ฝ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค) .

    • ๊ธ€๋กœ๋ฒŒ ํšŒํ”ผ

    • ์ธํ„ฐํŽ˜์ด์Šค์— global ๊ฐœ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋Œ€์‹  "์„ ํƒ๋œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ์ฒด"๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. (์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ํŽธ์ง‘ ๋จ :์ด ์ž‘์—…์€ lib/mocha.js ๋ฐ browser-entry.js ๋ชจ๋‘์—์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ œ์•ˆ์˜ ๋ชจ๋“  ๊ธ€๋กœ๋ฒŒ ๊ด€๋ จ ๋ถ€๋ถ„์ด ๋…ธ๋“œ์™€ ๋ธŒ๋ผ์šฐ์ € ๋ชจ๋‘์—์„œ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. )

    • ๊ทธ๋Ÿฐ ๋‹ค์Œ ์„ ํƒํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ์ฒด์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ global ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

    • localInterface ์˜ต์…˜ (CLI์˜ --local-interface )์€ Mocha๊ฐ€ ์„ ํƒํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ์ฒด์—์„œ global ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

    • DEBATABLE : ์ฒ˜์Œ์—๋Š” require("mocha").it ์™€์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด Mocha๋Š” ์„ ํƒํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ์ฒด์˜ TDD / BDD ํ•จ์ˆ˜๋„ Mocha ๋กœ ๋ณต์‚ฌํ•˜์ง€๋งŒ ๋‚˜์ค‘์— ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.



      • (์ฐธ๊ณ  : BDD๊ฐ€ ์„ ํƒ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์„ค์ •๋˜๋Š” ๊ฒƒ์„ ์ค‘์ง€ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ณต์‚ฌ ํ•  ์ˆ˜์žˆ๋Š” ๋”๋ฏธ ์„ ํƒ๋œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ์ฒด์— BDD๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์—์„œ ๋” ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ–‰๋™์€ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ์ง€์›ํ•˜๋Š” ๋™์•ˆ ์ˆ˜์ • / ๊ฐœ์„ ํ• ์ˆ˜๋ก ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.)



    • require("mocha/interface") ๋Š” ์„ ํƒํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ์ฒด๋ฅผ ๋‚ด ๋ณด๋ƒ…๋‹ˆ๋‹ค.

    • require("mocha/interface/<specific interface>") ๋Š” ์ดํ›„์— ๋‚ด๋ณด๋‚ผ ์ƒˆ๋กœ ์„ ํƒ๋œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ์ฒด๋กœ ์ง€์ •๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

    • ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ํŽธ์ง‘ ๋จ : require("mocha/interface") ๋Š” ๋˜ํ•œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์—†์ด ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €์˜ mocha ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์†์„ฑ์ด๋ฉ๋‹ˆ๋‹ค. mocha.interface .

    • ๋…ธ๋“œ ๋Šฅ๋ ฅ

    • require("mocha/nodeable/<specific interface>") ๋ชจ์นด ํ…Œ์ŠคํŠธ ํŒŒ์ผ ํ›„ ์‹คํ–‰ํ•  ๋ชจ์นด ์„ค์ • ์ธ์Šคํ„ด์Šคํ™” (์•„๋งˆ๋„ ์‚ฌ์šฉํ•˜์—ฌ setTimeout ์•Š๋Š” delay ์‚ฌ์šฉํ•˜๊ณ , ๋‹ค์‹œ ์ƒ๊ธฐ ์ฐธ์กฐ. delay ) ๋ฐ require("mocha/interface/<specific interface>") ์™€ ๊ฐ™์ด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์„ ํƒํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ์ฒด๋ฅผ ๋‚ด ๋ณด๋ƒ…๋‹ˆ๋‹ค.

    • CLI ์˜ต์…˜ ๋˜๋Š” mocha.opts ๊ฐ€ ์ง€์›๋˜๋Š” ๊ฒฝ์šฐ require("mocha/nodeable") ๋Š” Mocha๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ดํ›„์— ์‹คํ–‰๋˜๋„๋ก Mocha๋ฅผ ์„ค์ • (์œ„ ์ฐธ์กฐ)ํ•˜๊ณ  CLI์™€ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์„ค์ • ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ require("mocha/interface") ์ฒ˜๋Ÿผ ์„ ํƒ๋œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด.

    • ๋…ธ๋“œ ๊ฐ€๋Šฅ ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋„ mocha -able์ด๋˜๋„๋กํ•˜๋ ค๋ฉด mocha/nodeable & mocha/nodeable/<specific interface> ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. mocha/interface ๋ฐ mocha/interface/<specific interface>

์ƒ๊ฐ?

์‚ฌ์‹ค, ๋” ๊นŠ์ด ์ƒ๊ฐํ•ด ๋ณด๋ฉด mocha <test file> ๋Œ€์‹  node <test file> ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทผ๊ฑฐ์— ๋”ฐ๋ผ์ด ํ‹ฐ์ผ“์„ ์ข…๋ฃŒ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

  • ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ œ๊ณตํ•˜๋Š” ์–ด๋–ค ์ด์ ๋„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

    • ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์•„์ด๋””์–ด๋Š” mocha.opts ์—์žˆ๋Š” glob์— ๊ด€๊ณ„์—†์ด ๋‹จ์ผ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ๋งŒ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ… : test ์Šคํฌ๋ฆฝํŠธ์— package.json ๋Œ€์‹  glob์„ ๋„ฃ์œผ์‹ญ์‹œ์˜ค. npm test ๋Š” ๋ชจ๋‘๋ฅผ ์‹คํ–‰ํ•˜๊ณ  mocha ( node_modules/.bin/mocha , npx mocha )๋Š” ์ง€์ •๋œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. (์‹คํ–‰๋˜๋Š” ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ˆ˜์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์œ„ํ•ด ์‹คํ–‰ํ•ด์•ผํ•˜๋Š” ํŒŒ์ผ ๋˜๋Š” glob์€ ์—ฌ์ „ํžˆ mocha.opts ์— ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.)

    • ๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ์•„์ด๋””์–ด๋Š” mocha.opts ์™„์ „ํžˆ ์šฐํšŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ mocha --opts /dev/null (๋˜๋Š” Windows mocha --opts nul )๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ mocha.opts ์ฒ˜๋ฆฌ๋ฅผ ๊ฑด๋„ˆ ๋›ฐ๋„๋ก CLI ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

  • Mocha ์™ธ๋ถ€์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "mocha/nodeable" ๋Œ€์‹  Mocha์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ƒ ํŒจํ‚ค์ง€ "nodeable-mocha" ๋„ฃ์œผ์‹ญ์‹œ์˜ค.

    • ์• ์ดˆ์— ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ชจ์นด ์™ธ๋ถ€์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์™ธ๋ถ€๋ณด๋‹ค ํ•ต์‹ฌ์—์„œ ๋‹ฌ์„ฑํ•˜๊ธฐ ์‰ฌ์šด ์ค‘์š”ํ•œ ์ด์ ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ์–ธ์ œ๋“ ์ง€ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ํšŒํ”ผ ์ „์—ญ ํ‹ฐ์ผ“์„ ๋‹ค์‹œ ์—ด๋„๋ก ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์žฅ์ ์€ ๊ด€๋ จ์ด ์—†์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ( describe , it ๋“ฑ์˜ ์ „์—ญ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ช‡ ๊ฐœ์ž…๋‹ˆ๊นŒ?) ์›์น™์ ์œผ๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค (ํ•ด๋‹น ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ๋” ํด ์ˆ˜ ์žˆ์Œ). 0๋ณด๋‹ค ์ ์€ ์ˆ˜)-์ด๋ก ์ ์œผ๋กœ ๊ธ€๋กœ๋ฒŒ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๋ฌผ๊ฑด์„ ๋ฒ„๋ฆฌ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์ผ์ž…๋‹ˆ๋‹ค.

    • ๋˜ํ•œ ๋‚ด ๊ณ„ํš์€ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ํ•˜๋“œ ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹  ๋‚ด ๋ณด๋‚ธ "์ปจํ…์ŠคํŠธ"๊ฐ์ฒด (ํ˜„์žฌ Mocha๊ฐ€ ํ•ญ์ƒ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•จ)๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑ๋œ ํƒ€์‚ฌ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋™์ผํ•œ ๋™์ž‘์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์ž์‹ ์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฉํ•ด ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด์„œ๋Š” ๋ณด์žฅ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์˜ฌ๋ฐ”๋ฅธ ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‚ด ๊ณ„ํš์€ ํ˜„์žฌ ๋™์ž‘์—์„œ ๋งŽ์€ ๊ด€๋ จ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ์ •๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค (์˜ˆ : ํƒ€์‚ฌ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ™•์žฅํ•˜์ง€๋งŒ BDD ๋ฐ TDD ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ˆ˜ ์ผ€์ด์Šค ๋Œ€์‹  Mocha์˜ ์ผ๊ด€์„ฑ).
  • Mocha ์™ธ๋ถ€์—์„œ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ Mocha์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ API๋ฅผ ์‚ฌ์šฉ ํ•˜๊ณ ์ด๋ฅผ ๋ชฝํ‚ค ํŒจ์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์•ž์„œ ์–ธ๊ธ‰ ํ•œ ์ผ๋ถ€ ๋ถˆ์ผ์น˜ ๋ฐ ์—ฃ์ง€ ์ผ€์ด์Šค๋„ ๋‚จ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ Mocha๊ฐ€ mocha ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€๋งŒ global ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๋Š” ํ”Œ๋ž˜๊ทธ ๋’ค์— ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

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

๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ์˜คํžˆ๋ ค Mocha๊ฐ€ mocha๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๊ธ€๋กœ๋ฒŒ์„ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๋Š” ํ”Œ๋ž˜๊ทธ ๋’ค์— ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ.

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

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

(๋˜ํ•œ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ผ์ข…์˜ ์†Œ๋ฅด ํƒ€ ์‹œ๋„๋ฅผ Mocha ๊ฐœ์ฒด์— ๋ณต์‚ฌ๋˜๋ฏ€๋กœ require("mocha").it ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฒ„์ „์€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ์œ ์ง€ ๊ด€๋ฆฌ๋Š” ์ด์ƒํ•˜๊ณ  ์ผ๊ด€์„ฑ ์ด ์—†์œผ๋ฉฐ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šฐ ๋ฉฐ ์‹ค์ œ๋กœ ์ „์—ญ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์˜ค์—ผ์‹œํ‚ค๋Š” ๊ฒƒ์„ ํ”ผํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ธฐ๋Šฅ์„ ์ „ํ˜€ ์œ ์ง€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ชจํ˜ธํ•œ ๋ฒ„์ „์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ˆ˜์ • ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.)

์ด๊ฒƒ์€ Mocha ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด node <test file> ๋ฅผ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ๊ณผ๋Š” ๋Œ€์กฐ์ ์œผ๋กœ IMO์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์•„๋Š” ํ•œ ์–ด๋–ค ์ด์ ๋„ ์—†์œผ๋ฉฐ Mocha ๋‚ด๋ถ€ ๋˜๋Š” ์™ธ๋ถ€์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋˜‘๊ฐ™์ด ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฟก ๋นต๋€จ
์™œ const {describe, it} = require('mocha') ๊ฐ€ ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๊นŒ? ๋ฐฉ๊ธˆ ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค ...

$ node -v
v8.4.0

@zapphyre ์—ฌ์ „ํžˆ node ์•„๋‹Œ mocha ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

node ์—ฌ๋Ÿฌ ์†Œ์Šค ํŒŒ์ผ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ mocha ๊ณ ์ฐฉ๋ฉ๋‹ˆ๋‹ค. ์ž์ฒด ์‹คํ–‰ ํŒŒ์ผ์ด์—†๋Š” ํ…Œ์ŠคํŠธ ์‹คํ–‰๊ธฐ / ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์ด์Šˆ ์ œ๋ชฉ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ด์œ  : ๋‹ค๋ฅธ JS ๋Ÿฐํƒ€์ž„ (์˜ˆ : low.js )์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  mocha ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•  ๋•Œ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ง์€, ๋‹น์‹ ์€ ์ด๋ฏธ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”Œ๋žซํผ์—๋Š” "mocha"๋ฅผ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ mocha.run() ์‚ฌ์šฉํ•˜์—ฌ ์ „์—ญ mocha ๊ฐœ์ฒด์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” JS ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ I

  • mocha๋ฅผ๋กœ๋“œํ•˜๊ณ  ์ „์—ญ mocha ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • mocha.setup({ui: 'bdd'});
  • SystemJS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋กœ๋“œ
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‹คํ–‰
      mocha.checkLeaks();
      mocha.globals([]);
      mocha.run();

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ๋‹ค์•ผ. ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด SystemJS ๋Œ€์‹  require ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ node.js์—์„œ ๋™์ผํ•œ ์ž‘์—…์„ ์‹œ๋„ํ•˜๋ฉด (mocha 5.2.0 ์‚ฌ์šฉ)

> mocha.run();
TypeError: Cannot read property 'search' of undefined
    at Mocha.mocha.run (/home/mha/one/node_modules/mocha/mocha.js:149:54)

ํŽธ์ง‘ : ๋‚˜๋Š” ๋‹จ์ง€ ๊ทธ๊ฒƒ์„๋กœ๋“œํ•˜๋Š” ๋Œ€์‹  https://github.com/mochajs/mocha/wiki/Using-Mocha-programmatically ๋ฐ mocha.addFile ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์„ค๋ช… / ๊ทธ๊ฒƒ์„ ๊ฐ€์ ธ ์˜ค๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ƒˆ๋กœ์šด (ํ˜„์žฌ 20 ์‹œ๊ฐ„ ์ „) Wiki ํŽ˜์ด์ง€ https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically ์žˆ์ง€๋งŒ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ ํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ด์œ  : ๋‹ค๋ฅธ JS ๋Ÿฐํƒ€์ž„ (์˜ˆ : low.js )์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  mocha ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•  ๋•Œ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋Œ€์ฒด ๋Ÿฐํƒ€์ž„์— ๋…ธ๋“œ์™€ ๊ฐ™์€ ์‹คํ–‰ ํŒŒ์ผ์ด์žˆ๋Š” ๊ฒฝ์šฐ (์ €๋Š” low.js๊ฐ€ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?) alternative-executable ./node_modules/.bin/_mocha ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ž์ฒด ์‹คํ–‰ ํŒŒ์ผ์ด์—†๋Š” ํ…Œ์ŠคํŠธ ์‹คํ–‰๊ธฐ / ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

https://github.com/tapjs/node-tap/#tutti -i-gusti-sono-gusti

์ด์ œ https://github.com/mochajs/mocha/issues/3006 ์ด ํ•ด๊ฒฐ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ €์— ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋‹ค์Œ์ด ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค.

<script type="module">
  import './node_modules/mocha/mocha.js'
  console.log(mocha)
</script>

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

<script type="module">
  import { mocha } from './node_modules/mocha/mocha.js'
  console.log(mocha)
</script>

(https://github.com/mochajs/mocha/issues/956#issuecomment-167453800์—์„œ ์š”์ฒญ)

๋ถ„๊ธฐ๋ฅผ ๋กค์—…๊ณผ ๋ณ‘ํ•ฉํ•˜๊ณ  ํŠธ๋žœ์Šค ํŒŒ์ผ๋Ÿฌ๋ฅผ ์„ค์ •ํ•˜๋ฉด์ด ์ž‘์—…์ด ๋” ์‰ฌ์›Œ ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. esm ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ธ€๋กœ๋ฒŒ ๋ˆ„์ถœ์„ ์ถ”๊ฐ€ํ•˜๋Š” esm ๋ฒˆ๋“ค๊ณผ ๋ ˆ๊ฑฐ์‹œ ๋ฒˆ๋“ค์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์ถ”๊ฐ€ ๋œ ์ฝ”๋“œ ๊ฒฝ๋กœ์™€ ๋ฒˆ๋“ค ๋งŒ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ๋งŽ์€์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผํ•˜๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ €์™€ ๋…ธ๋“œ์—์„œ ๋ชจ๋‘ ์†์ƒ๋˜๊ฑฐ๋‚˜ ์ฝ”๋”ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ „์—ญ ๋ณ€์ˆ˜์™€ ํƒ€์ดํ•‘์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ์นด ๋ ˆ๊ฑฐ์‹œ๊ฐ€๋ฉ๋‹ˆ๋‹ค.

Btw๊ฐ€ ์ „์—ญ์—†์ด @types/mocha ์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค : https://github.com/whitecolor/mocha-types

๊ทธ๋“ค์ด (๊ธ€๋กœ๋ฒŒ) ๊ณง ๊ณต์‹์ ์œผ๋กœ ์ œ๊ฑฐ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

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