í ì¤í¸ ìëíë ìì¼ë¡ íì´ì¼ í ê³¼ì ììë¿ë§ ìëë¼ íì ììë ê´ë²ìíê² ì°ì ëë¤.
í ì¤í¸ë ì í´ì¼ íëê°?
í¨ì를 íë ë§ë¤ê³ ìë¤ê³ í´ ë´ ìë¤. ëë¶ë¶ 매ê°ë³ì-ê²°ê³¼ ê´ê³ë¥¼ ì¤ì¬ì¼ë¡ ì´ë»ê² ì½ë를 ìì±í ì§ êµ¬ìíì¤ ê²ëë¤.
ê°ë° ì¤ì ì½ì ì°½ ë±ì ì´ì©í´ ì¤ì ì¤í ê²°ê³¼ê° ê¸°ëíë ê²°ê³¼ì ê°ìì§ ê³ì ë¹êµíë©´ì ìíë 기ë¥ì´ ì 구íëê³ ìëì§ íì¸í ê²ëë¤.
ì¤ì ì¤í ê²°ê³¼ê° ê¸°ëíë ê²°ê³¼ì ë¤ë¥¼ ë, ì½ë를 ìì íê³ ë¤ì ì¤íí´ ê·¸ 결과를 기ëíë ê²°ê³¼ì ë¤ì ë¹êµí´ ë³¼ ê²ëë¤. ìíë 기ë¥ì ìì±í ëê¹ì§ ì´ ê³¼ì ì ê³ì ë°ë³µíê² ì£ .
ê·¸ë°ë° ì´ë ê² ìëì¼ë¡ ì½ë를 'ì¬ì¤íâíë ê±´ ìë¹í ë¶ìì í©ëë¤.
ì½ë를 ìëì¼ë¡ âì¬ì¤íâ íë©´ì í ì¤í¸ë¥¼ íë©´ 무ì¸ê°ë¥¼ ëì¹ê¸° ì½ìµëë¤.
구체ì ì¸ ì를 ë¤ì´ë´
ìë¤. íì¬ í¨ì f를 구ííê³ ìë¤ê³ ê°ì í´ë³´ê² ìµëë¤. ì½ë를 ìì±íê³ f(1)ì´ ì ëë¡ ëìíëì§ íì¸í©ëë¤. ì ëë¡ ëìíë¤ì. ê·¸ë°ë° f(2)를 í
ì¤í¸í´ ë³´ë ì ëë¡ ëìíì§ ììµëë¤. ì½ë를 ìì í í ë¤ì f(2)를 íì¸í´ ë´
ëë¤. ì ëë¡ ëìíë¤ì. ì¬ê¸°ì ëì¼ê¹ì? ìëëë¤. f(1)ì´ ì ëë¡ ëìíëì§ íì¸íì§ ììì¼ëê¹ì. ì´ë ê² í
ì¤í¸ë¥¼ ìëì¼ë¡ íë©´ ìë¬ê° ë°ìí ì¬ì§ë¥¼ ë¨ê¹ëë¤.
ì´ë° ì¼ì ì주 íí ë°ìí©ëë¤. ê°ë°ìë 무ì¸ê°ë¥¼ ë§ë¤ ë 머릿ìì ìë§ì ì ì¤ ì¼ì´ì¤ë¥¼ ìê°íë©° ì½ë를 ìì±íëë°, ì½ë를 ë³ê²½í´ì¼ í ëë§ë¤ 모ë ì ì¤ ì¼ì´ì¤ë¥¼ ì기íë©´ì ì½ë를 ìì íë ê²ì ê±°ì ë¶ê°ë¥í©ëë¤. íë를 ê³ ì¹ë©´ ë ë¤ë¥¸ 문ì ê° íì´ëì¤ë ì´ì ê° ë°ë¡ ì´ ë문ì ëë¤.
í ì¤í ìëíë í ì¤í¸ ì½ëê° ì¤ì ëìì ê´ì¬íë ì½ëì ë³ê°ë¡ ìì±ëìì ë ê°ë¥í©ëë¤. í ì¤í¸ ì½ë를 ì´ì©íë©´ í¨ì를 ë¤ìí ì¡°ê±´ìì ì¤íí´ ë³¼ ì ìëë°, ì´ë ì¤í ê²°ê³¼ì 기ë 결과를 ë¹êµí ì ììµëë¤.
Behavior Driven Development
Behavior Driven Development(BDD)ë¼ ë¶ë¦¬ë ë°©ë²ë¡ ì ëí´ ììë´ ìë¤.
BDDë í ì¤í¸(test), 문ì(documentation), ìì(example)를 íë° ëª¨ìëì ê°ë ì ëë¤.
ì¤ì ê°ë° ì¬ë¡ë¥¼ ì´ì©í´ BDDê° ë¬´ìì¸ì§ 차근차근 ì¤ëª í´ ë³´ëë¡ íê² ìµëë¤.
ê±°ëì ê³± í¨ìì ëª ì¸ì
x를 në² ê³±í´ì£¼ë í¨ì, pow(x, n)를 구ííê³ ìë¤ê³ ê°ì í´ ë´
ìë¤.(ë¨, nì ìì°ìì´ê³ , ì¡°ê±´ nâ¥0ì ë§ì¡±í´ì¼ í©ëë¤.)
ì¬ì¤ ìë°ì¤í¬ë¦½í¸ì ê±°ëì ê³± ì°ì°ì **ê° ììµëë¤. ê·¸ë¼ìë ë¶êµ¬íê³ í¨ì를 ì§ì 구ííë ì´ì ë, 구í ê³¼ì ì ì´ì ì ëë©´ì BDD를 ì§ì ì ì©í´ 보기 ìí´ìì
ëë¤. 기ë¥ì´ ê°ë¨í í¨ì를 구ííë©´ì BDD를 ì§ì ì ì©í´ ë³´ë©´ í° ë¬¸ì ì BDD를 ì ì©íë ê±´ ì¬ì¸ í
ëê¹ì.
본격ì ì¼ë¡ ì½ë를 ìì±í기 ì ì 먼ì í´ì¼ í ê²ì´ ììµëë¤. ì½ëê° ë¬´ì¨ ì¼ì íëì§ ììí í ì´ë¥¼ ìì°ì´ë¡ ííí´ì¼ í©ëë¤.
ì´ë, ë§ë¤ì´ì§ ì°ì¶ë¬¼ì BDDìì ëª ì¸ì(specification) ëë ì§§ê² ì¤ì¬ ì¤í(spec) ì´ë¼ê³ ë¶ë¦ ëë¤. ëª ì¸ìì ìëì ê°ì´ ì ì¤ ì¼ì´ì¤ì ëí ìì¸í ì¤ëª ê³¼ í ì¤í¸ê° ë´ê²¨ììµëë¤.
describe("pow", function() {
it("주ì´ì§ ì«ìì n ì ê³±", function() {
assert.equal(pow(2, 3), 8);
});
});
ì¤íì ì¸ ê°ì§ 주ì êµ¬ì± ììë¡ ì´ë£¨ì´ì§ëë¤.
describe("title", function() { ... })-
구ííê³ ì íë 기ë¥ì ëí ì¤ëª ì´ ë¤ì´ê°ëë¤. ì°ë¦¬ ìììì í¨ì
powê° ì´ë¤ ëìì íëì§ì ëí ì¤ëª ì´ ë¤ì´ê° ê²ëë¤.itë¸ë¡ì íë° ëª¨ì주ë ìí ë í©ëë¤. it("ì ì¤ ì¼ì´ì¤ ì¤ëª ", function() { ... })-
itì 첫 ë²ì§¸ ì¸ìì í¹ì ì ì¤ ì¼ì´ì¤ì ëí ì¤ëª ì´ ë¤ì´ê°ëë¤. ì´ ì¤ëª ì ë구ë ì½ì ì ìê³ ì´í´í ì ìë ìì°ì´ë¡ ì ì´ì¤ëë¤. ë ë²ì§¸ ì¸ìì ì ì¤ ì¼ì´ì¤ í ì¤í¸ í¨ìê° ë¤ì´ê°ëë¤. assert.equal(value1, value2)-
기ë¥ì ì ëë¡ êµ¬ííë¤ë©´
itë¸ë¡ ë´ì ì½ëassert.equal(value1, value2)ì´ ìë¬ ìì´ ì¤íë©ëë¤.í¨ì
assert.*ëpowê° ììí ëë¡ ëìíëì§ íì¸í´ì¤ëë¤. ì ììììassert.equalì´ ì¬ì©ëìëë°, ì´ í¨ìë ì¸ìë¼ë¦¬ ëë± ë¹êµíì ë ë¤ë¥´ë¤ê³ íë¨ëë©´ ìë¬ë¥¼ ë°íí©ëë¤. ììììpow(2, 3)ì ê²°ê´ê°ê³¼8ì ë¹êµíê² ì£ . ë¹êµë íì¸ì ì°ì´ë ë¤ë¥¸ í¨ìë¤ì ìëìì ë¤ì ìê°í´ ëë¦¬ê² ìµëë¤.
ëª
ì¸ìë ì¤í ê°ë¥í©ëë¤. ëª
ì¸ì를 ì¤ííë©´ it ë¸ë¡ ìì í
ì¤í¸ê° ì¤íë©ëë¤. ìì¸í ë´ì©ì ìëìì ë¤ì ì¤ëª
íê² ìµëë¤.
ê°ë° ìì
ì¤ì ê°ë°ì ì°©ìíë©´ ìëì ê°ì ììë¡ ê°ë°ì´ ì§íë©ëë¤.
- ëª ì¸ì ì´ìì ìì±í©ëë¤. ì´ìì 기본ì ì¸ í ì¤í¸ë ë¤ì´ê°ëë¤.
- ëª ì¸ì ì´ìì ë³´ê³ ì½ë를 ìì±í©ëë¤.
- ì½ëê° ìëíëì§ íì¸í기 ìí´ Mochaë¼ ë¶ë¦¬ë í ì¤í¸ íë ììí¬ë¥¼ ì¬ì©í´ ëª ì¸ì를 ì¤íí©ëë¤.(Mochaì ëí´ì ìëìì ë¤ë£° ìì ì ëë¤.) ì´ë, ì½ëê° ì못 ìì±ëìë¤ë©´ ìë¬ê° ì¶ë ¥ë©ëë¤. ê°ë°ìë í ì¤í¸ë¥¼ 모ë íµê³¼í´ ìë¬ê° ëë ì¶ë ¥ëì§ ìì ëê¹ì§ ì½ë를 ìì í©ëë¤.
- 모ë í ì¤í¸ë¥¼ íµê³¼íë ì½ë ì´ìì´ ìì±ëììµëë¤.
- ëª ì¸ìì ì§ê¸ê¹ì§ ê³ ë ¤íì§ ììë ì ì¤ì¼ì´ì¤ ëª ê°ì§ë¥¼ ì¶ê°í©ëë¤. í ì¤í¸ê° ì¤í¨í기 ììí ê²ëë¤.
- ì¸ ë²ì§¸ ë¨ê³ë¡ ëìê° í ì¤í¸ë¥¼ 모ë íµê³¼í ëê¹ì§ ì½ë를 ìì í©ëë¤.
- 기ë¥ì´ ìì±ë ëê¹ì§ 3~6ë¨ê³ë¥¼ ë°ë³µí©ëë¤.
ìì ê°ì ë°©ë²ì ë°ë³µì ì¸(iterative) ì±ê²©ì ì§ëëë¤. ëª ì¸ì를 ìì±íê³ ì¤íí í í ì¤í¸ë¥¼ 모ë íµê³¼í ëê¹ì§ ì½ë를 ìì±íê³ , ë ë¤ë¥¸ í ì¤í¸ë¥¼ ì¶ê°í´ ìì ê³¼ì ì ë°ë³µíëê¹ì. ì´ë ê² íë¤ ë³´ë©´ ì¢ ëìë ìì í ëìíë ì½ëì í ì¤í¸ ë ë¤ë¥¼ íë³´íê² ë©ëë¤.
ì´ì ì¤ì ì¬ë¡ì ì ê°ë° íë¡ì¸ì¤ë¥¼ ì ì©í´ ë³´ê² ìµëë¤.
í¨ì powì ì¤í ì´ìì ì´ë¯¸ ììì ìì±íì¼ë¯ë¡, 첫 ë²ì§¸ ë¨ê³ë ì´ë¯¸ ëë ìí©ì
ëë¤. ì½ë를 본격ì ì¼ë¡ ìì±í기 ì ì ì ì ìë°ì¤í¬ë¦½í¸ ë¼ì´ë¸ë¬ë¦¬ ëª ê°ì§ë¥¼ ì¬ì©í´ í
ì¤í¸ë¥¼ ì¤íí´ ë³´ê² ìµëë¤. ì§ê¸ ìíìì í
ì¤í¸ 모ëê° ì¤í¨í í
ë° ê·¸ë°ë°ë ì¤íí´ ë³´ë ì´ì ë í
ì¤í¸ê° ì¤ì ë¡ ëìê°ëì§ íì¸í기 ìí´ìì
ëë¤.
ì¤í ì¤íí기
본 íí 리ì¼ìì ì´ 3ê°ì ë¼ì´ë¸ë¬ë¦¬ë¥¼ ì¬ì©í´ í ì¤í¸ë¥¼ ì§íí´ë³´ê² ìµëë¤. ê° ë¼ì´ë¸ë¬ë¦¬ì ëí ì¤ëª ì ìëì ê°ìµëë¤.
- Mocha â íµì¬ í
ì¤í¸ íë ììí¬ë¡,
describe,itê³¼ ê°ì í ì¤í í¨ìì í ì¤í¸ ì¤í ê´ë ¨ 주ì í¨ì를 ì ê³µí©ëë¤. - Chai â ë¤ìí assertionì ì ê³µí´ ì£¼ë ë¼ì´ë¸ë¬ë¦¬ì
ëë¤. ì°ë¦¬ ìììì
assert.equalì ëë§ ì¬ì©í´ ë³¼ ìì ì ëë¤. - Sinon â í¨ìì ì 보를 ìºë´ë ë° ì¬ì©ëë ë¼ì´ë¸ë¬ë¦¬ë¡, ë´ì¥ í¨ì ë±ì 모방í©ëë¤. 본 ì±í°ìì ì¬ì©íì§ ìê³ , ë¤ë¥¸ ì±í°ìì ì¤ì ë¡ ì¬ì©í´ ë³¼ ìì ì ëë¤.
ì¸ ë¼ì´ë¸ë¬ë¦¬ 모ë, ë¸ë¼ì°ì ë ìë² ì¬ì´ë íê²½ì ê°ë¦¬ì§ ìê³ ì¬ì© ê°ë¥í©ëë¤. ì¬ê¸°ì ë¸ë¼ì°ì íê²½ì ê°ì íê³ ì¬ì©í´ ë³´ê² ìµëë¤.
ìë HTML íì´ì§ì powì ì¤í, ë¼ì´ë¸ë¬ë¦¬ 모ëê° ë¤ì´ììµëë¤.
<!DOCTYPE html>
<html>
<head>
<!-- ê²°ê³¼ ì¶ë ¥ì ì¬ì©ëë mocha css를 ë¶ë¬ìµëë¤. -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/mocha/3.2.0/mocha.css">
<!-- Mocha íë ììí¬ ì½ë를 ë¶ë¬ìµëë¤. -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/3.2.0/mocha.js"></script>
<script>
mocha.setup('bdd'); // 기본 ì
ì
</script>
<!-- chai를 ë¶ë¬ìµëë¤ -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/3.5.0/chai.js"></script>
<script>
// chaiì ë¤ìí ê¸°ë¥ ì¤, assert를 ì ìì ì ì¸í©ëë¤.
let assert = chai.assert;
</script>
</head>
<body>
<script>
function pow(x, n) {
/* ì½ë를 ì¬ê¸°ì ìì±í©ëë¤. ì§ê¸ì ë¹ì¹¸ì¼ë¡ ë¨ê²¨ëììµëë¤. */
}
</script>
<!-- í
ì¤í¸(describe, it...)ê° ìë ì¤í¬ë¦½í¸ë¥¼ ë¶ë¬ìµëë¤. -->
<script src="test.js"></script>
<!-- í
ì¤í¸ 결과를 idê° "mocha"ì¸ ììì ì¶ë ¥íëë¡ í©ëë¤.-->
<div id="mocha"></div>
<!-- í
ì¤í¸ë¥¼ ì¤íí©ëë¤! -->
<script>
mocha.run();
</script>
</body>
</html>
ì íì´ì§ë ë¤ì¯ ë¶ë¶ì¼ë¡ ëë ì ììµëë¤.
<head>â í ì¤í¸ì íìí ìëíí° ë¼ì´ë¸ë¬ë¦¬ì ì¤íì¼ì ë¶ë¬ì´<script>â í ì¤í¸í í¨ì(pow)ì ì½ëê° ë¤ì´ê°- í
ì¤í¸ â
describe("pow", ...)를 ì¸ë¶ ì¤í¬ë¦½í¸(test.js)ìì ë¶ë¬ì´ - HTML ìì
<div id="mocha">â Mocha ì¤í ê²°ê³¼ê° ì¶ë ¥ë¨ mocha.run()â í ì¤í¸ë¥¼ ì¤íìì¼ì£¼ë ëª ë ¹ì´
ê²°ê³¼:
ì§ê¸ì í¨ì pow 본문ì ìë¬´ë° ì½ëë ì기 ë문ì í
ì¤í¸ê° ì¤í¨í ìë°ì ììµëë¤. ì§ê¸ ìí©ìì pow(2,3)ê° 8ì´ ìë undefined를 ë°íí기 ë문ì ìë¬ê° ë°ìí©ëë¤.
ì°¸ê³ ë¡, karmaê°ì ê³ ìì¤ì í ì¤í¸ ë¬ë(test-runner)를 ì¬ì©íë©´ ë¤ìí ì¢ ë¥ì í ì¤í¸ë¥¼ ìëì¼ë¡ ì¤íí ì ììµëë¤.
ì½ë ì´ì
ì¤ë¡ì§ í ì¤í¸ íµê³¼ë§ì 목ì ì¼ë¡ ì½ë를 ê°ë¨íê² ìì±í´ë³´ê² ìµëë¤.
function pow(x, n) {
return 8; // ììì를 ì¨ë´¤ìµëë¤. :)
}
ì, ì´ì ì¤íì ì¤íí´ë ìë¬ê° ë°ìíì§ ììµëë¤!
ì¤í ê°ì í기
ì§ê¸ê¹ì§ ê¼¼ì를 ì¨ì ì½ë를 ìì±í기 ë문ì, pow(3,4)를 ì¤ííë©´ í린 결과를 ë´ë±ì ê²ëë¤. íì§ë§ í
ì¤í¸ë 모ë íµê³¼íì£ .
ì´ë ê² í ì¤í¸ë 모ë íµê³¼íì§ë§, í¨ìê° ì ìí ì íì§ ëª»íë ê²½ì°ë ì¤ë¬´ìì ë¹ë²íê² ë°ìí©ëë¤. ì¤íì´ ë¶ìì í´ì ê·¸ë° ê²ì´ë ë ë§ì ì ì¤ ì¼ì´ì¤ë¥¼ ì¶ê°í´ ë´ ìë¤.
pow(3, 4) = 81ì ë§ì¡±íëì§ íì¸íë í
ì¤í¸ë¥¼ ì¶ê°í´ ë³´ê² ìµëë¤.
ì¤íì í ì¤í¸ë¥¼ ì¶ê°íë ë°©ë²ì ìëì ê°ì´ ë ê°ì§ê° ììµëë¤.
-
기존
itë¸ë¡ìassert를 íë ë ì¶ê°í기describe("pow", function() { it("주ì´ì§ ì«ìì n ì ê³±", function() { assert.equal(pow(2, 3), 8); assert.equal(pow(3, 4), 81); }); }); -
í ì¤í¸ë¥¼ íë ë ì¶ê°í기(
itë¸ë¡ íë ë ì¶ê°í기)describe("pow", function() { it("2를 ì¸ ë² ê³±íë©´ 8ì ëë¤.", function() { assert.equal(pow(2, 3), 8); }); it("3ì ë¤ ë² ê³±íë©´ 81ì ëë¤.", function() { assert.equal(pow(3, 4), 81); }); });
assertìì ìë¬ê° ë°ìíë©´ it ë¸ë¡ì ì¦ì ì¢
ë£ë©ëë¤. ë°ë¼ì 기존 it ë¸ë¡ì assert를 íë ë ì¶ê°íë©´ 첫 ë²ì§¸ assertê° ì¤í¨íì ë ë ë²ì§¸ assertì 결과를 ì ì ììµëë¤. ë ë°©ë²ì 근본ì ì¸ ì°¨ì´ë ì¬ê¸°ì ììµëë¤.
ë ë²ì§¸ ë°©ë²ì²ë¼ it ë¸ë¡ì íë ë ì¶ê°í´ í
ì¤í¸ë¥¼ ë¶ë¦¬í´ì ìì±íë©´ ë ë§ì ì 보를 ì»ì ì ì기 ë문ì ë ë²ì§¸ ë°©ë²ì ì¶ì²í´ ë립ëë¤.
ì¬ê¸°ì ëíì¬ í ì¤í¸ë¥¼ ì¶ê°í ë ë¤ì ê·ì¹ë ë°ë¥´ë ê² ì¢ìµëë¤.
í ì¤í¸ íëìì í ê°ì§ë§ íì¸í기
í ì¤í¸ íëìì ì°ê´ì´ ìë ì¬í ë ê°ë¥¼ ì ê²íê³ ìë¤ë©´, ì´ ëì ë¶ë¦¬íë ê² ì¢ìµëë¤.
ì´ì ë ë²ì§¸ ë°©ë²ì ì¬ì©í´ í ì¤í¸ë¥¼ ì§ì ì¶ê°í´ë´ ìë¤.
ê²°ê³¼:
ë ë²ì§¸ í
ì¤í¸ê° ì¤í¨íë¤ì. assertìì í¨ì 리í´ê°ì´ 81ì´ ë ê²ì´ë¼ 기ëíê³ ììëë°, í¨ìë íì 8ì ë°ííê³ ì기 ë문ì ë¹ì°í í
ì¤í¸ë¥¼ íµê³¼í ì ììµëë¤.
ì½ë ê°ì í기
ë ë²ì§¸ í ì¤í¸ë íµê³¼í ì ìê² ì½ë를 ê°ì í´ ë´ ìë¤. ì´ë²ì ê¼¼ì를 ì°ì§ ë§ê³ ì¤ì ì°ë¦¬ê° 구ííê³ ì íë 기ë¥ì ìê°íë©´ì ì½ë를 ìì±í©ìë¤.
function pow(x, n) {
let result = 1;
for (let i = 0; i < n; i++) {
result *= x;
}
return result;
}
í¨ìê° ì ëë¡ ìëíëì§ íì¸í기 ìí´ ë ë§ì ê°ì í
ì¤í¸í´ ë´
ìë¤. ìëì¼ë¡ ì¬ë¬ ê°ì it ë¸ë¡ì ë§ëë ëì for문ì ì¬ì©í´ ìëì¼ë¡ it ë¸ë¡ì ë§ë¤ì´ë³´ê² ìµëë¤.
describe("pow", function() {
function makeTest(x) {
let expected = x * x * x;
it(`${x}ì/를 ì¸ ë² ê³±íë©´ ${expected}ì
ëë¤.`, function() {
assert.equal(pow(x, 3), expected);
});
}
for (let x = 1; x <= 5; x++) {
makeTest(x);
}
});
ê²°ê³¼:
ì¤ì²© describe
í
ì¤í¸ë¥¼ ëª ê° ë ì¶ê°í´ ë³´ê² ìµëë¤. ìë ìììì í¬í¼ í¨ì makeTestì forë¬¸ì´ ì¤ì²© describe ìì í¨ê» 묶ì¬ìë¤ë ê²ì ëì¬ê²¨ë³´ì기 ë°ëëë¤. makeTestë ì¤ì§ for문ììë§ ì¬ì©ëê³ , ë¤ë¥¸ ë°ì ì¬ì©ëì§ ì기 ë문ì ì´ë ê² ë¬¶ì´ëììµëë¤. ìë ì¤íìì makeTestì for문ì í¨ê» ì´ì°ë¬ì ¸ powê° ì ëë¡ ëìíëì§ íì¸í´ì£¼ë ìí ì í©ëë¤.
ì´ë ê² ì¤ì²© describe를 ì°ë©´ 그룹ì ë§ë¤ ì ììµëë¤.
describe("pow", function() {
describe("x를 ì¸ ë² ê³±í©ëë¤.", function() {
function makeTest(x) {
let expected = x * x * x;
it(`${x}ì/를 ì¸ ë² ê³±íë©´ ${expected}ì
ëë¤.`, function() {
assert.equal(pow(x, 3), expected);
});
}
for (let x = 1; x <= 5; x++) {
makeTest(x);
}
});
// describeì itì ì¬ì©í´ ì´ ìëì ë ë§ì í
ì¤í¸ë¥¼ ì¶ê°í ì ììµëë¤.
});
ì¤ì²© describeë ìë¡ì´ í
ì¤í¸ 'íì 그룹(subgroup)'ì ì ìí ë ì¬ì©ë©ëë¤. ì´ë ê² ìë¡ ì ìë í
ì¤í¸ íì 그룹ì í
ì¤í¸ ê²°ê³¼ ë³´ê³ ìì ë¤ì¬ì°ê¸° ë ìíë¡ ì¶ë ¥ë©ëë¤.
ë§ì½ì 미ëì ìì²´ í¬í¼ í¨ì를 ê°ì§ itê³¼ describe를 ìµìì ë 벨ì ì¶ê°íë¤ë©´, ì´ë¤ í¬í¼ í¨ììì makeTestì ì ê·¼í ì ììê²ëë¤.
before/afterì beforeEach/afterEachí¨ì beforeë (ì ì²´) í
ì¤í¸ê° ì¤íë기 ì ì ì¤íëê³ , í¨ì afterë (ì ì²´) í
ì¤í¸ê° ì¤íë íì ì¤íë©ëë¤. í¨ì beforeEachë 매 itì´ ì¤íë기 ì ì ì¤íëê³ , í¨ì afterEachë 매 itì´ ì¤íë íì ì¤íë©ëë¤.
ìì:
describe("test", function() {
before(() => alert("í
ì¤í¸ë¥¼ ììí©ëë¤ - í
ì¤í¸ê° ììë기 ì "));
after(() => alert("í
ì¤í¸ë¥¼ ì¢
ë£í©ëë¤ - í
ì¤í¸ê° ì¢
ë£ë í"));
beforeEach(() => alert("ë¨ì¼ í
ì¤í¸ë¥¼ ììí©ëë¤ - ê° í
ì¤í¸ ìì ì "));
afterEach(() => alert("ë¨ì¼ í
ì¤í¸ë¥¼ ì¢
ë£í©ëë¤ - ê° í
ì¤í¸ ì¢
ë£ í"));
it('test 1', () => alert(1));
it('test 2', () => alert(2));
});
ì¤í ììë ë¤ìê³¼ ê°ìµëë¤.
í
ì¤í¸ë¥¼ ììí©ëë¤ - í
ì¤í¸ê° ììë기 ì (before)
ë¨ì¼ í
ì¤í¸ë¥¼ ììí©ëë¤ - ê° í
ì¤í¸ ìì ì (beforeEach)
1
ë¨ì¼ í
ì¤í¸ë¥¼ ì¢
ë£í©ëë¤ - ê° í
ì¤í¸ ì¢
ë£ í (afterEach)
ë¨ì¼ í
ì¤í¸ë¥¼ ììí©ëë¤ - ê° í
ì¤í¸ ìì ì (beforeEach)
2
ë¨ì¼ í
ì¤í¸ë¥¼ ì¢
ë£í©ëë¤ - ê° í
ì¤í¸ ì¢
ë£ í (afterEach)
í
ì¤í¸ë¥¼ ì¢
ë£í©ëë¤ - í
ì¤í¸ê° ì¢
ë£ë í (after)
beforeEach/afterEachì before/afterë ëê° ì´ê¸°í ì©ëë¡ ì¬ì©ë©ëë¤. ì¹´ì´í° ë³ì를 0ì¼ë¡ ë§ë¤ê±°ë í
ì¤í¸ê° ë°ë ë(ëë í
ì¤í¸ ê·¸ë£¹ì´ ë°ë ë)ë§ë¤ í´ì¤ì¼ íë ìì
ì´ ìì¼ë©´ ì´ë¤ì ì´ì©í ì ììµëë¤.
ì¤í íì¥í기
첫 ë²ì§¸ ë°ë³µ(iteration)ìì í¨ì powì 기본ì ì¸ ê¸°ë¥ì 구íí´ë³´ììµëë¤. ê·¸ë°ë° ìì§ ì´íì¸ì ë§ìë©° ìì¶í긴 ì´ë¦
ëë¤. ë ë¤ë¥¸ ë°ë³µì ëë©´ì 기ë¥ì ê°ì í´ ë´
ìë¤.
ìì ì ìíë¯ì´ í¨ì pow(x, n)ì 매ê°ë³ì nì ìì ì ìì´ì´ì¼ í©ëë¤.
ìë°ì¤í¬ë¦½í¸ìì ìí ê´ë ¨ ì°ì°ì ìííë¤ ìë¬ê° ë°ìíë©´ NaNì ë°íí©ëë¤. í¨ì powë nì´ ì¡°ê±´ì ë§ì§ ìì¼ë©´ NaNì ë°íí´ì¼ í©ëë¤.
nì´ ì¡°ê±´ì ë§ì§ ìì ë í¨ìê° NaNì ë°ííëì§ ìëì§ë¥¼ ê²ì¬í´ì£¼ë í
ì¤í¸ë¥¼ ì¶ê°í´ë³´ê² ìµëë¤.
describe("pow", function() {
// ...
it("nì´ ììì¼ ë ê²°ê³¼ë NaNì
ëë¤.", function() {
assert.isNaN(pow(2, -1));
});
it("nì´ ì ìê° ìë ë ê²°ê³¼ë NaNì
ëë¤.", function() {
assert.isNaN(pow(2, 1.5));
});
});
ì¤íì ì¤ííë©´ ë¤ìê³¼ ê°ì ê²°ê³¼ê° ì¶ë ¥ë©ëë¤.
기존ì nì´ ììì´ê±°ë ì ìê° ìë ê²½ì°ë¥¼ ìê°íì§ ìê³ êµ¬íí기 ë문ì, ìë¡ê² ì¶ê°í í
ì¤í¸ë ì¤í¨í ìë°ì ììµëë¤. BDDì íµì¬ì ì¬ê¸°ì ììµëë¤. ì¤í¨í ìë°ì ìë í
ì¤í¸ë¥¼ ì¶ê°íê³ , í
ì¤í¸ë¥¼ íµê³¼í ì ìê²(ìë¬ê° ë°ìíì§ ìê²) ì½ë를 ê°ì íë ê²ì´ì£ .
ììì ì¬ì©í assert.isNaNì NaNì¸ì§ ìëì§ë¥¼ íì¸í´ì¤ëë¤.
Chaië ì´ ì¸ìë ë¤ìí assertionì ì§ìí©ëë¤.
assert.equal(value1, value2)âvalue1ê³¼value2ì ëë±ì±ì íì¸í©ëë¤(value1 == value2).assert.strictEqual(value1, value2)âvalue1ê³¼value2ì ì¼ì¹ì±ì íì¸í©ëë¤(value1 === value2).assert.notEqual,assert.notStrictEqualâ ë¹ ëë±ì±, ë¹ ì¼ì¹ì±ì íì¸í©ëë¤.assert.isTrue(value)âvalueê°trueì¸ì§ íì¸í©ëë¤(value === true).assert.isFalse(value)âvalueê°falseì¸ì§ íì¸í©ëë¤(value === false).- ì´ ì¸ì ë¤ìí assertionì docsìì íì¸í ì ììµëë¤.
ìë¡ê² ì¶ê°í í
ì¤í¸ë¥¼ íµê³¼í ì ìëë¡ powì ì½ë를 ëª ì¤ ì¶ê°í´ë³´ê² ìµëë¤.
function pow(x, n) {
if (n < 0) return NaN;
if (Math.round(n) != n) return NaN;
let result = 1;
for (let i = 0; i < n; i++) {
result *= x;
}
return result;
}
ì´ì ìë¬ ìì´ í ì¤í¸ë¥¼ 모ë íµê³¼íë¤ì.
ìì½
BDDìì ì¤íì 먼ì ìì±íê³ ë íì 구íì ììí©ëë¤. 구íì´ ì¢ ë£ë ìì ìë ì¤íê³¼ ì½ë ë ë¤ë¥¼ íë³´í ì ììµëë¤.
ì¤íì ì©ëë ì¸ ê°ì§ì ëë¤.
- í ì¤í¸ â í¨ìê° ìëíë ëìì ì ëë¡ ìííê³ ìëì§ ë³´ì¥í¨
- 문ì â í¨ìê° ì´ë¤ ëìì ìííê³ ìëì§ ì¤ëª
í´ì¤.
describeìitì ì¤ëª ì´ ë¤ì´ê° - ìì â ì¤ì ëìíë ìì를 ì´ì©í´ í¨ì를 ì´ë»ê² ì¬ì©í ì ìëì§ ìë ¤ì¤
ì¤íì´ ì기 ë문ì ê°ë°ìë ìì íê² í¨ì를 ê°ì íê±°ë ë³ê²½í ì ììµëë¤. í¨ì를 ì²ìë¶í° ë¤ì ìì±í´ì¼ íë ê²½ì°ê° ì겨ë ì¤íì´ ìì¼ë©´ 기존 ì½ëì ëì¼íê² ëìíë¤ë ê²ì ë³´ì¥í ì ììµëë¤.
ì½ëê° ë°ëì´ë 기존ì 구íë 기ë¥ì ìí¥ì ì£¼ì§ ìê² íë ê±´ ëê·ëª¨ íë¡ì í¸ìì ë§¤ì° ì¤ìí©ëë¤. íë¡ì í¸ ê·ëª¨ê° 커ì§ë©´ í¨ì íë를 ì´ê³³ì ê³³ìì ì¬ì©íëë°, ìëì¼ë¡ ë³ê²½ë í¨ìê° ì´ í¨ì를 ì¬ì©íë 모ë ê³³ìì ì ëë¡ ëìíëì§ íì¸íë ê±´ ë¶ê°ë¥í기 ë문ì ëë¤.
í ì¤í¸ë¥¼ íì§ ìê³ ì½ë를 ìì±í´ìë¤ë©´ ê°ë°ìë¤ì ë ì¤ í ê°ëì ê¸¸ë¡ ë¹ ì ¸ë²ë¦¬ê³ ë§ëë¤.
- ì무 ëì± ìì´ ì½ë를 ë³ê²½í©ëë¤. ë¶ìì©ì ìê°íì§ ìê³ í¨ì를 ìì í기 ë문ì ì´ëì ê° ë²ê·¸ê° ë°ìíê³ ë§ëë¤.
- ìì ì´ë ê°ì ì 기í¼íê² ë©ëë¤. ë²ê·¸ì ëê°ê° ê°í¹í기 ë문ì´ì£ . ì½ëê° êµ¬ìì´ ëì´ë ê·¸ ë구ë ì½ë를 ê±´ëë¦¬ë ¤ íì§ ììµëë¤. ì¢ì§ ìì ìí©ì´ì£ .
í ì¤í ìëíë ì´ë° 문ì 를 í¼íê² ëìì¤ëë¤!
í ì¤í ìëí를 ìííê³ ìë íë¡ì í¸ë¼ë©´ ì´ë° 문ì 를 ê±±ì íì§ ììë ë©ëë¤. ì½ëì ë³íê° ìì´ë ì¤íì ì¤íí´ í ì¤í¸ë¥¼ ì§ííë©´ ëª ì´ ë§ì ìë¬ ë°ì ì¬ë¶ë¥¼ íì¸í ì ììµëë¤.
ì¥ì ì´ íë ë ììµëë¤. ì í ì¤í¸ ë ì½ëë ë ëì ìí¤í ì²ë¥¼ ë§ëëë¤.
ìì ê³¼ ê°ì ì´ ì¬ì°ëê¹ ë¹ì°í ì¢ì ìí¤í ì²ë¥¼ ë§ë¤ ì ìë¤ê³ ìê°í ì ììµëë¤. íì§ë§ ë ë¤ë¥¸ ì´ì ê° ììµëë¤.
í ì¤í¸ë¥¼ ìì±íë ¤ë©´ í¨ìê° ì´ë¤ ëìì íëì§, ì ë ¥ê°ì 무ìì´ê³ ì¶ë ¥ê°ì 무ìì¸ì§ ì ìíê³ ë íì 구íì ììí©ëë¤. ì½ëë ì ìë ì¬íì ë·ë°ì¹¨ í ì ìê² ìì±í´ì¼ íì£ . 구íì ììíë ìê°ë¶í° ì´ë¯¸ ì¢ì ìí¤í ì²ê° ë³´ì¥ë©ëë¤.
ì¬ì¤, ë§¤ë² ì´ë° ì 차를 ë°ë¼ 구ííë¤ë ê² ì½ì§ë§ì ììµëë¤. í¨ìê° ì´ë»ê² ëìí´ì¼ íëì§ íì ì´ ìì§ ìë ìí©ìì ì½ë를 ìì±í기ë ì ì ì¤íì ìì±í´ì¼ íë¯ë¡ ìµìíì§ ìì ì ììµëë¤. ê·¸ë ì§ë§ í ì¤í¸ë¥¼ ìì±íë©´ ì¼ë°ì ì¼ë¡ ê°ë° ìëê° ë¹¨ë¼ì§ê³ ì´ì ë³´ë¤ ì½ë를 ë ìì ì ì¼ë¡ ìì±í ì ììµëë¤.
íí ë¦¬ì¼ íë°ë¶ì ê³¼ì ìì í ì¤í¸ 기ë°ì ë¤ìí ê³¼ì 를 ë§ëë³¼ ì ììµëë¤. ì¬ê¸°ì ì¬ì©ë ììë³´ë¤ ë ì¤ì©ì ì¸ ìì를 ê³§ ë§ëë³´ëë¡ í©ìë¤.
ëª ì¸ì를 ë§ë¤ ëë ì´ë ì ëì ìë°ì¤í¬ë¦½í¸ ì§ìì´ íìíë°, ì°ë¦¬ë ì´ì ë§ ìë°ì¤í¬ë¦½í¸ íìµì ììí ìí©ì ëë¤. ì§ê¸ ë¹ì¥ì ëª ì¸ì를 ìì±í íìê° ìì§ë§, ì´ë² ì±í°ìì ë³µì¡í ëª ì¸ì를 ì½ì ì ìë ë¥ë ¥ì í¨ìí기 ë문ì ë· ì±í°ìì ì¬ë¬ë¶ë¤ë ì¶©ë¶í ëª ì¸ì를 ìì±í ì ììê²ì´ë¼ 믿ìµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.