تست Ø®ÙØ¯Ú©Ø§Ø± در ÙØ¸ÛÙÙ ÙØ§Û Ø¨Ø¹Ø¯Û Ø§Ø³ØªÙØ§Ø¯Ù Ø®ÙØ§Ùد Ø´Ø¯Ø Ù ÙÙ ÚÙÛÙ Ø¨Ù Ø·ÙØ± گسترد٠در پرÙÚÙ ÙØ§Û ÙØ§ÙØ¹Û Ø§Ø³ØªÙØ§Ø¯Ù Ù Û Ø´ÙØ¯.
ÚØ±Ø§ ب٠تست ÙÛØ§Ø² دارÛÙ Ø
ÙÙØªÛ ÛÚ© ØªØ§Ø¨Ø¹Û Ø±Ø§ Ù Û ÙÙÛØ³ÛÙ Ø Ù Ø¹Ù ÙÙØ§Ù Ù Û ØªÙØ§ÙÛÙ ØªØµÙØ± Ú©ÙÛÙ Ú©Ù ÚÙ Ú©Ø§Ø±Û Ø¨Ø§ÛØ¯ Ø§ÙØ¬Ø§Ù Ø¯ÙØ¯: Ú©Ø¯Ø§Ù Ù¾Ø§Ø±Ø§Ù ØªØ±ÙØ§ ÚÙ ÙØªØ§ÛØ¬Û Ø±Ø§ Ø§Ø±Ø§Ø¦Ù Ù Û Ø¯ÙÙØ¯.
در Ø·ÙÙ ØªÙØ³Ø¹ÙØ Ù ÛØªÙاÙÛÙ ØªØ§Ø¨Ø¹Û Ø±Ø§ اجرا Ú©Ø±Ø¯Ù Ù Ø®Ø±ÙØ¬Û آ٠را با ÚÛØ²Û Ú©Ù Ø§ÙØªØ¸Ø§Ø± دارÛ٠تابع ب٠٠ا Ø¨Ø¯ÙØ¯ Ø¨Ø±Ø±Ø³Û Ú©ÙÛÙ . ب٠عÙÙØ§Ù Ù Ø«Ø§ÙØ ٠ا Ù Û ØªÙØ§ÙÛ٠اÛ٠کار را در Ú©ÙØ³ÙÙ Ø§ÙØ¬Ø§Ù دÙÛÙ .
اگر ÚÛØ²Û اشتبا٠باشد â کد را تصØÛØ Ù Û Ú©ÙÛÙ Ø Ø¯ÙØ¨Ø§Ø±Ù از اÙ٠اجرا Ù Û Ú©ÙÛÙ Ø ÙØªÛج٠را Ø¨Ø±Ø±Ø³Û Ù Û Ú©ÙÛÙ â ٠ب٠ÙÙ ÛÙ ØªØ±ØªÛØ¨ تا ز٠اÙÛ Ú©Ù Ú©Ø¯ ٠ا کار Ú©ÙØ¯Ø اÛ٠کار ÙØ§ را Ø§ÙØ¬Ø§Ù Ù Û Ø¯ÙÛÙ .
ا٠ا ÚÙÛÙ âre-runsâ(Ø§Ø¬Ø±Ø§Û Ù Ø¬Ø¯Ø¯) Ø¨Ù ØµÙØ±Øª Ø¯Ø³ØªÛ ÙØ§Ùص Ù Û Ø¨Ø§Ø´Ø¯.
ÙÙگا٠تست ÛÚ© کد با Ø§Ø¬Ø±Ø§Û Ù Ø¬Ø¯Ø¯(re-run) Ø¨Ù ØµÙØ±Øª Ø¯Ø³ØªÛØ Ø¨Ù Ø±Ø§ØØªÛ Ù Û ØªÙØ§ÙÛÙ ÚÛØ²Û را از ÙÙÙ Ø¨ÛØ§ÙدازÛÙ .
ب٠عÙÙØ§Ù Ù
Ø«Ø§ÙØ Ù
ا ÛÚ© تابع f Ø§ÛØ¬Ø§Ø¯ Ù
Û Ú©ÙÛÙ
. Ú©Ø¯Û Ù
ÛÙÙÛØ³ÛÙ
٠تست Ù
Û Ú©ÙÛÙ
: f(1) کار Ù
Û Ú©ÙØ¯Ø اÙ
ا f(2) کار ÙÙ
Û Ú©ÙØ¯. Ù
ا کد را Ø§ØµÙØ§Ø Ù
Û Ú©ÙÛÙ
٠اکÙÙÙ f(2) کار Ù
Û Ú©ÙØ¯. Ø¢ÛØ§ Ø§ÙØ§Ù تست Ù
ا کاÙ
Ù Ø¨Ù ÙØ¸Ø± Ù
Û Ø±Ø³Ø¯Ø Ø§Ù
ا ÙØ±Ø§Ù
ÙØ´ کردÛÙ
f(1) را Ø¯ÙØ¨Ø§Ø±Ù تست Ú©ÙÛÙ
Ø Ú©Ù Ù
Ù
ک٠است Ø¨Ù Ø§Ø±ÙØ± Ø¨Ø±Ø®ÙØ±Ø¯ Ú©ÙÛÙ
.
اÛÙ Ø®ÛÙÛ Ù Ø¹Ù ÙÙ(عادÛ) است. ÙÙØªÛ ÚÛØ²Û را ØªÙØ³Ø¹Ù Ù ÛâØ¯ÙÛÙ Ø Ú©ÛØ³ ÙØ§Û Ø§ØØªÙ اÙÛ Ø²ÛØ§Ø¯Û را در ذÙÙ Ø®ÙØ¯ ÙÚ¯Ù Ù ÛØ¯Ø§Ø±ÛÙ Ø Ø§Ù Ø§ Ø¨Ù Ø³Ø®ØªÛ Ù Û ØªÙØ§Ù Ø§ÙØªØ¸Ø§Ø± داشت Ú©Ù ÛÚ© Ø¨Ø±ÙØ§Ù Ù ÙÙÛØ³ پس از ÙØ± تغÛÛØ±Ø Ù٠٠آÙÙØ§ را Ø¨Ù ØµÙØ±Øª Ø¯Ø³ØªÛ Ø¨Ø±Ø±Ø³Û Ú©ÙØ¯. Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ Ø§ØµÙØ§Ø ÛÚ© ÚÛØ² ٠خراب کرد٠ÛÚ© ÚÛØ² دÛگر Ø¢Ø³Ø§Ù Ù Û Ø´ÙØ¯.
تست Ø®ÙØ¯Ú©Ø§Ø± ب٠اÛ٠٠عÙÛ Ø§Ø³Øª ک٠تست ÙØ§ Ø¹ÙØ§Ù٠بر Ú©Ø¯Ø Ø¨Ù Ø·ÙØ± جداگاÙÙ ÙÙØ´ØªÙ Ù Û Ø´ÙÙØ¯. Ø¢ÙÙØ§ تابع ÙØ§Û ٠ا را Ø¨Ù Ø±ÙØ´ ÙØ§Û ٠ختÙ٠اجرا Ù Û Ú©ÙÙØ¯ Ù ÙØªØ§Ûج ب٠دست آ٠د٠را با Ø¢ÙÚÙ Ø§ÙØªØ¸Ø§Ø± Ù Û Ø±ÙØ¯ Ù ÙØ§ÛØ³Ù Ù Û Ú©ÙÙØ¯.
ØªÙØ³Ø¹Ù Ø±ÙØªØ§Ø± Ù ØÙر (behavior driven development) (BDD)
Ø¨ÛØ§ÛÛØ¯ با تکÙÛÚ©Û Ø¨Ù ÙØ§Ù Behavior Driven Development ÛØ§ Ø¨Ù Ø·ÙØ± Ø®ÙØ§ØµÙ (BDD) Ø´Ø±ÙØ¹ Ú©ÙÛÙ .
اÛÙ BDD Ø³Ù ÙØ³Ù ت دارد: تست ÙØ§Ø Ù Ø³ØªÙØ¯Ø§Øª(داکÛÙÙ ÙØª ÙØ§) Ù Ù Ø«Ø§Ù ÙØ§.
Ø¨Ø±Ø§Û Ø¯Ø±Ú© Ø¨ÙØªØ± BDDØ ÛÚ© Ù ÙØ±Ø¯ ع٠ÙÛ Ø§Ø² ØªÙØ³Ø¹Ù را Ø¨Ø±Ø±Ø³Û Ø®ÙØ§ÙÛ٠کرد.
ØªÙØ³Ø¹Ù Û âpowâ: ØªÙØ¶ÛØ:
ÙØ±Ø¶ Ú©ÙÛØ¯ Ù
ÛâØ®ÙØ§ÙÛÙ
ÛÚ© تابع pow(x, n) بسازÛÙ
Ú©Ù x را Ø¨Ù ØªÙØ§Ù ÛÚ© عدد صØÛØ n Ø¨Ø±Ø³Ø§ÙØ¯. Ù
ا ÙØ±Ø¶ Ù
Û Ú©ÙÛÙ
Ú©Ù nâ¥0.
اÛ٠تکÙÛÙ ÙÙØ· ÛÚ© Ù
ثا٠است: Ø§Ù¾Ø±Ø§ØªÙØ± ** در Ø¬Ø§ÙØ§ اسکرÛپت ÙØ¬Ùد دارد Ú©Ù Ù
Û ØªÙØ§Ùد اÛ٠کار را Ø§ÙØ¬Ø§Ù
Ø¯ÙØ¯Ø اÙ
ا در اÛÙØ¬Ø§ Ù
ا رÙÛ Ø¬Ø±ÛØ§Ù ØªÙØ³Ø¹Ù تÙ
رکز Ù
Û Ú©ÙÛÙ
Ú©Ù Ù
Û ØªÙØ§Ùد Ø¨Ø±Ø§Û Ú©Ø§Ø±ÙØ§Û Ù¾ÛÚÛØ¯Ù تر ÙÛØ² اعÙ
Ø§Ù Ø´ÙØ¯.
ÙØ¨Ù از Ø§ÛØ¬Ø§Ø¯ کد powØ Ù
ÛâØªÙØ§ÙÛÙ
ØªØµÙØ± Ú©ÙÛÙ
ک٠تابع Ø¨Ø§ÛØ¯ ÚÙ Ú©Ø§Ø±Û Ø§ÙØ¬Ø§Ù
Ø¯ÙØ¯ Ù ÚÚ¯ÙÙ٠آ٠را ØªÙØµÛÙ Ú©ÙÛÙ
.
ÚÙÛÙ ØªÙØµÛÙÛ ÛÚ© specification(٠شخصات) ÛØ§ Ø¨Ù Ø·ÙØ± Ø®ÙØ§ØµÙØ ÛÚ© spec ÙØ§Ù ÛØ¯Ù Ù ÛâØ´ÙØ¯ Ù ØØ§ÙÛ ØªÙØ¶ÛØØ§ØªÛ در Ù ÙØ±Ø¯ Ú©ÛØ³(Ù ÙØ±Ø¯) ÙØ§Û Ù٠را٠با تست ÙØ§ÛÛ Ø¨Ø±Ø§Û Ø¢ÙÙØ§ Ø§Ø³ØªØ Ù Ø§ÙÙØ¯ اÛÙ:
describe("pow", function() {
it("Ø¨Ù ØªÙØ§Ù n اÙ
Ø§ÙØ²Ø§ÛØ´ Ù
Û ÛØ§Ø¨Ø¯", function() {
assert.equal(pow(2, 3), 8);
});
});
ÛÚ© spec Ø¯Ø§Ø±Ø§Û Ø³Ù Ø¨ÙÙÚ© اصÙÛ Ø§Ø³Øª Ú©Ù Ù Û ØªÙØ§ÙÛØ¯ در Ø¨Ø§ÙØ§ Ù Ø´Ø§ÙØ¯Ù Ú©ÙÛØ¯:
describe("Ù ÙØ¶Ùع", function() { ... })-
Ú٠ع٠ÙÚ©Ø±Ø¯Û Ø±Ø§ ØªÙØ¶ÛØ Ù Û Ø¯ÙÛÙ Ø Ø¯Ø± اÛÙ Ú©ÛØ³Ø ٠ا تابع
powرا ØªÙØµÛÙ Ù Û Ú©ÙÛÙ . Ø¨Ø±Ø§Û Ú¯Ø±ÙÙ Ø¨ÙØ¯Û âکارگراÙ(workers)â â Ø¨ÙÙÚ© ÙØ§ÛitØ§Ø³ØªÙØ§Ø¯Ù Ù Û Ø´ÙØ¯. it("ØªÙØ¶ÛØØ§Øª Ú©ÛØ³ Ù ÙØ±Ø¯ ÙØ¸Ø±", function() { ... })-
در عÙÙØ§Ù
it٠ا Ø¨Ù Ø±ÙØ´Û ÙØ§Ø¨Ù Ø®ÙØ§ÙØ¯Ù Ø¨Ø±Ø§Û Ø§ÙØ³Ø§Ù Ú©ÛØ³ Ù ÙØ±Ø¯ ÙØ¸Ø± را ØªÙØµÛÙ Ù Û Ú©ÙÛÙ Ø Ù Ø¢Ø±Ú¯Ù٠ا٠دÙÙ ØªØ§Ø¨Ø¹Û Ø§Ø³Øª ک٠آ٠را تست Ù Û Ú©ÙØ¯. assert.equal(value1, value2)-
کد داخ٠بÙÙÚ©
itØ Ø¯Ø± ØµÙØ±ØªÛ Ú©Ù Ù¾ÛØ§Ø¯Ù Ø³Ø§Ø²Û Ø¢Ù ØµØÛØ Ø¨Ø§Ø´Ø¯Ø Ø¨Ø§ÛØ¯ بدÙ٠خطا(Ø§Ø±ÙØ±) اجرا Ø´ÙØ¯.ØªÙØ§Ø¨Ø¹
*.assertØ¨Ø±Ø§Û Ø¨Ø±Ø±Ø³Û Ø§ÛÙÚ©Ù Ø¢ÛØ§powÙÙ Ø§ÙØ·Ùر Ú©Ù Ø§ÙØªØ¸Ø§Ø± Ù Û Ø±ÙØ¯ کار Ù Û Ú©ÙØ¯ ÛØ§ ÙÙ Ø§Ø³ØªÙØ§Ø¯Ù Ù Û Ø´ÙØ¯. در اÛÙØ¬Ø§ ٠ا از ÛÚ©Û Ø§Ø² Ø¢ÙÙØ§ Ø§Ø³ØªÙØ§Ø¯Ù Ù Û Ú©ÙÛÙ âassert.equalØ Ø¢Ø±Ú¯ÙÙ Ø§Ù ÙØ§ را با ÙÙ Ù ÙØ§ÛØ³Ù Ù Û Ú©ÙØ¯ ٠در ØµÙØ±ØªÛ ک٠برابر ÙØ¨Ø§Ø´ÙØ¯Ø Ø®Ø·Ø§ Ù Û Ø¯ÙØ¯. در اÛÙØ¬Ø§ Ø¨Ø±Ø±Ø³Û Ù ÛâÚ©ÙØ¯ Ú©Ù ÙØªÛجÙpow(2, 3)برابر8باشد. اÙÙØ§Ø¹ دÛÚ¯Ø±Û Ø§Ø² Ù ÙØ§ÛØ³Ù Ù Ø¨Ø±Ø±Ø³Û ÙØ¬Ùد دارد ک٠بعدا٠اضاÙÙ Ø®ÙØ§ÙÛ٠کرد.
در Ø§Ø¨ÙØ¬Ø§ specification را Ù
Û ØªÙØ§Ù اجرا کرد ٠تست Ù
شخص شد٠در بÙÙÚ© it را اجرا Ù
Û Ú©ÙØ¯. Ø¨Ø¹Ø¯Ø§Ù Ø®ÙØ§ÙÛÙ
Ø¯ÛØ¯.
Ø¬Ø±ÛØ§Ù ØªÙØ³Ø¹Ù(The development flow)
Ø¬Ø±ÛØ§Ù ØªÙØ³Ø¹Ù ٠ع٠ÙÙØ§Ù ب٠اÛÙ ØµÙØ±Øª است:
- ÛÚ© spec اÙÙÛ٠با تست ÙØ§ÛÛ Ø¨Ø±Ø§Û Ø¨ÙÛØ§Ø¯Û(اساسÛ) ترÛ٠ع٠Ùکرد ÙÙØ´ØªÙ شد٠است.
- ÛÚ© Ù¾ÛØ§Ø¯Ù Ø³Ø§Ø²Û Ø§ÙÙÛÙ Ø§ÛØ¬Ø§Ø¯ Ù Û Ø´ÙØ¯.
- Ø¨Ø±Ø§Û Ø¨Ø±Ø±Ø³Û Ø§ÛÙÚ©Ù Ø¢ÛØ§ کار Ù Û Ú©ÙØ¯ ÛØ§ ÙÙØ ÙØ±ÛÙ ÙØ±Ú© تست [Mocha] (https://mochajs.org/) (Ø¬Ø²Ø¦ÛØ§Øª Ø¨ÛØ´ØªØ± Ø¨Ù Ø²ÙØ¯Û) را اجرا Ù Û Ú©ÙÛÙ Ú©Ù spec را اجرا Ù Û Ú©ÙØ¯. تا ز٠اÙÛ Ú©Ù Ø¹Ù Ùکرد Ú©Ø§Ù Ù ÙØ¨Ø§Ø´Ø¯Ø Ø®Ø·Ø§ÙØ§ ÙÙ Ø§ÛØ´ Ø¯Ø§Ø¯Ù Ù Û Ø´ÙÙØ¯. ٠ا Ø§ØµÙØ§ØØ§Øª را Ø§ÙØ¬Ø§Ù Ù Û Ø¯ÙÛ٠تا ز٠اÙÛ Ú©Ù ÙÙ Ù ÚÛØ² درست کار Ø¨Ú©ÙØ¯
- اکÙÙ٠٠ا ÛÚ© Ù¾ÛØ§Ø¯Ù Ø³Ø§Ø²Û Ø§ÙÙÛ٠با تست دارÛÙ .
- Ú©ÛØ³ ÙØ§Û Ø¨ÛØ´ØªØ±Û را ب٠spec اضاÙÙ Ù Û Ú©ÙÛÙ Ú©Ù Ø§ØØªÙ Ø§ÙØ§Ù ÙÙÙØ² ØªÙØ³Ø· Ù¾ÛØ§Ø¯Ù Ø³Ø§Ø²Û ÙØ§ Ù¾Ø´ØªÛØ¨Ø§ÙÛ ÙØ´Ø¯Ù Ø§ÙØ¯. تست ÙØ§ ب٠٠شک٠بر Ù ÛØ®ÙØ±ÙØ¯.
- ب٠ش٠ار٠3 Ø¨Ø±Ú¯Ø±Ø¯ÛØ¯ Ù Ù¾ÛØ§Ø¯Ù Ø³Ø§Ø²Û ÙØ§ را Ø¢Ù¾Ø¯ÛØª Ú©ÙÛØ¯ تا ÙÙØªÛ ک٠تست ÙØ§ خطاÛÛ ÙØ¯ÙÙØ¯.
- ٠راØÙ 3-6 را تکرار Ú©ÙÛØ¯ تا ع٠Ùکرد ÙØ§ Ø¢Ù Ø§Ø¯Ù Ø´ÙØ¯.
Ø¨ÙØ§Ø¨Ø±Ø§ÛÙØ ØªÙØ³Ø¹Ù تکرار Ø´ÙÙØ¯Ù Ù Û Ø¨Ø§Ø´Ø¯. ٠ا spec را Ù ÛâÙÙÛØ³ÛÙ Ø Ø¢Ù Ø±Ø§ Ù¾ÛØ§Ø¯ÙâØ³Ø§Ø²Û Ù ÛâÚ©ÙÛÙ Ø Ù Ø·Ù Ø¦Ù Ù ÛâØ´ÙÛ٠ک٠تستâÙØ§ ÙØ¨ÙÙ Ø´Ø¯ÙØ¯Ø سپس تستâÙØ§Û Ø¨ÛØ´ØªØ±Û Ù ÛâÙÙÛØ³ÛÙ Ø Ù Ø·Ù Ø¦Ù Ù ÛâØ´ÙÛ٠ک٠کار Ù ÛâÚ©ÙÙØ¯ Ù ÙÙ ÛÙØ·Ùر ادا٠٠٠ÛâØ¯ÙÛÙ . در ÙÙØ§Ûت ٠ا ÛÚ© Ù¾ÛØ§Ø¯Ù Ø³Ø§Ø²Û Ù ÙÙ٠٠تست ÙØ§ÛÛ Ø¨Ø±Ø§Û Ø¢Ù Ø¯Ø§Ø±ÛÙ .
Ø¨ÛØ§ÛÛØ¯ اÛÙ Ø¬Ø±ÛØ§Ù ØªÙØ³Ø¹Ù را در ٠ثا٠ع٠ÙÛ Ø®ÙØ¯ ببÛÙÛÙ .
Ù
رØÙ٠اÙ٠در ØØ§Ù ØØ§Ø¶Ø± کاÙ
٠شد٠است: Ù
ا ÛÚ© spec اÙÙÛÙ Ø¨Ø±Ø§Û pow دارÛÙ
. اکÙÙÙØ ÙØ¨Ù از Ù¾ÛØ§Ø¯Ù Ø³Ø§Ø²ÛØ Ø¨ÛØ§ÛÛØ¯ از ÚÙØ¯ کتابخاÙÙ Ø¬Ø§ÙØ§ اسکرÛپت Ø¨Ø±Ø§Û Ø§Ø¬Ø±Ø§Û ØªØ³Øª ÙØ§ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
تا ببÛÙÛÙ
ک٠آÙÙØ§ کار Ù
Û Ú©ÙÙØ¯ (ÙÙ
٠تست ÙØ§ رد Ø´Ø¯ÙØ¯).
٠شخصات(spec) در ع٠Ù
در Ø¯ÙØ±Ù Ø¢Ù ÙØ²Ø´Û Ù Ø§Ø Ø§Ø² کتابخاÙÙ ÙØ§Û Ø¬Ø§ÙØ§ اسکرÛپت Ø²ÛØ± Ø¨Ø±Ø§Û ØªØ³Øª(Ø¢Ø²Ù Ø§ÛØ´) Ø§Ø³ØªÙØ§Ø¯Ù Ø®ÙØ§ÙÛ٠کرد:
- Mocha â ÙØ±ÛÙ
ÙØ±Ú© اصÙÛ: ØªÙØ§Ø¨Ø¹ ØªØ³ØªÛ Ø±Ø§ÛØ¬ از جÙ
ÙÙ
specÙit٠تابع اصÙÛ Ú©Ù ØªØ³Øª ÙØ§ را اجرا Ù ÛâÚ©ÙØ¯ را ارائ٠٠ÛâÚ©ÙØ¯. - Chai â کتابخاÙÙ Ø§Û Ø¨Ø§ ØªÙØ§Ø¨Ø¹ ÙØ±Ø§Ùا٠ک٠اÛ٠اجاز٠را Ù
Û Ø¯ÙØ¯ تا از Ø¨Ø³ÛØ§Ø±Û از ØªÙØ§Ø¨Ø¹ Ù
ختÙÙ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
Ø Ø¯Ø± ØØ§Ù ØØ§Ø¶Ø± ÙÙØ· بÙ
assert.equalÙÛØ§Ø² دارÛÙ . - Sinon â کتابخاÙÙ Ø§Û Ø¨Ø±Ø§Û Ø¬Ø§Ø³ÙØ³Û از ØªÙØ§Ø¨Ø¹Ø شبÛÙ Ø³Ø§Ø²Û ØªÙØ§Ø¨Ø¹(built-in) ÛØ§ ÙÙ Ø§Ù ØªÙØ§Ø¨Ø¹ داخÙÛ Ù Ø¯Ûگر Ù ÙØ§Ø±Ø¯Ø بعدا٠ب٠آ٠ÙÛØ§Ø² Ø®ÙØ§ÙÛ٠داشت.
اÛ٠کتابخاÙÙ ÙØ§ ÙÙ Ø¨Ø±Ø§Û ØªØ³Øª Ø¯Ø§Ø®Ù Ù Ø±ÙØ±Ú¯Ø± Ù ÙÙ Ø¨Ø±Ø§Û ØªØ³Øª س٠ت Ø³Ø±ÙØ± Ù ÙØ§Ø³Ø¨ ÙØ³ØªÙد. در اÛÙØ¬Ø§ ٠ا ÙÙØ¹ Ù Ø±ÙØ±Ú¯Ø± را در ÙØ¸Ø± Ø®ÙØ§ÙÛÙ Ú¯Ø±ÙØª.
ØµÙØÙ Ú©Ø§Ù
Ù HTML با اÛÙ ÙØ±ÛÙ
ÙØ±Ú© ÙØ§ Ù pow spec:
<!DOCTYPE html>
<html>
<head>
<!-- add mocha css, to show results -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/mocha/3.2.0/mocha.css">
<!-- add mocha framework code -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/3.2.0/mocha.js"></script>
<script>
mocha.setup('bdd'); // minimal setup
</script>
<!-- add chai -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/3.5.0/chai.js"></script>
<script>
// chai has a lot of stuff, let's make assert global
let assert = chai.assert;
</script>
</head>
<body>
<script>
function pow(x, n) {
/* function code is to be written, empty now */
}
</script>
<!-- the script with tests (describe, it...) -->
<script src="test.js"></script>
<!-- the element with id="mocha" will contain test results -->
<div id="mocha"></div>
<!-- run tests! -->
<script>
mocha.run();
</script>
</body>
</html>
ØµÙØÙ Ø±Ø§ Ù Û ØªÙØ§Ù Ø¨Ù Ù¾ÙØ¬ بخش ØªÙØ³Û٠کرد:
- ÙØ³Ù
ت
<head>â Ø¨Ø±Ø§Û اضاÙ٠کرد٠کتاب خاÙÙ ÙØ§Û Ø®Ø§Ø±Ø¬Û Ù Ø§Ø³ØªØ§ÛÙ ÙØ§Û Ø¨Ø±Ø§Û ØªØ³Øª. - ÙØ³Ù
ت
<script>با ØªÙØ§Ø¨Ø¹Û Ø¨Ø±Ø§Û ØªØ³Øª, ک٠در ٠ثا٠٠ا --با کدpow. - ÙØ³Ù
ت تست ÙØ§ â Ø¯Ø± Ù
ثا٠Ù
ا, اسکرÛÙ¾ خارجÛ
test.jsک٠تابعdescribe("pow", ...)را دارد(٠اÙÙØ¯ Ù Ø«Ø§Ù Ø¨Ø§ÙØ§ÛÛ). - اÙÙ
ا٠html Ù
ÙØ§Ø¨Ù:
<div id="mocha">Ø¨Ø±Ø§Û ÙÙ Ø§ÛØ´ ÙØªÛجÙ, Mocha از اÛ٠تگ Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛÚ©ÙØ¯. - با کاÙ
ÙØ¯(Ø¯Ø³ØªÙØ±)
mocha.run()تست ٠ا Ø´Ø±ÙØ¹ Ù ÛØ´Ùد.
ÙØªÛجÙ:
در ØØ§Ù ØØ§Ø¶Ø±Ø تست ÙØ§Ù
ÙÙ٠است Ù ÛÚ© خطا ÙØ¬Ùد دارد. ٠اÛ٠خطا Ù
ÙØ·ÙÛ Ø§Ø³Øª Ø²ÛØ±Ø§: Ú©Ø¯Û Ø¯Ø§Ø®Ù ØªØ§Ø¨Ø¹ pow ÙÙÙØ´ØªÙ اÛÙ
٠خاÙÛ Ù
Û Ø¨Ø§Ø´Ø¯Ø Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ pow(2, 3) Ø¨Ù Ø¬Ø§Û 8 undefined را برÙ
Û Ú¯Ø±Ø¯Ø§ÙØ¯.
Ø¨Ø±Ø§Û Ø¢ÛÙØ¯ÙØ Ø¨ÛØ§ÛÛØ¯ ØªÙØ¬Ù داشت٠باشÛ٠ک٠تست Ú©Ú©ÙØ¯Ù ÙØ§Û Ø³Ø·Ø Ø¨Ø§ÙØ§Û Ø¨ÛØ´ØªØ±Û ٠اÙÙØ¯ karma ٠دÛÚ¯Ø±Ø§Ù ÙØ¬Ùد Ø¯Ø§Ø±ÙØ¯ Ú©Ù Ø§Ø¬Ø±Ø§Û Ø®ÙØ¯Ú©Ø§Ø± Ø¨Ø³ÛØ§Ø±Û از تستâÙØ§Û ٠ختÙ٠را Ø±Ø§ØØª Ú©Ø±Ø¯Ù Ø§ÙØ¯.
Ù¾ÛØ§Ø¯Ù Ø³Ø§Ø²Û Ø§ÙÙÛÙ(Initial implementation)
Ø¨ÛØ§ÛÛØ¯ ÛÚ© Ù¾ÛØ§Ø¯ÙâØ³Ø§Ø²Û Ø³Ø§Ø¯Ù Ø§Ø² pow Ø¨Ø±Ø§Û Ú¯Ø°Ø±Ø§ÙØ¯Ù تستâÙØ§ Ø§ÛØ¬Ø§Ø¯ Ú©ÙÛÙ
:
function pow() {
return 8; // :) we cheat!
}
Ø¨Ø³ÛØ§Ø± عاÙÛ! Ø§ÙØ§Ù کار Ù ÛÚ©ÙØ¯.
Ø¨ÙØ¨Ùد ٠شخصات(spec)
Ú©Ø§Ø±Û Ú©Ù Ù
ا Ø§ÙØ§Ù Ø§ÙØ¬Ø§Ù
دادÛÙ
ÙØ·Ø¹Ø§ ÛÚ© تÙÙØ¨ است. اÛ٠تابع کار ÙÙ
Û Ú©ÙØ¯: ØªÙØ§Ø´ Ø¨Ø±Ø§Û Ù
ØØ§Ø³Ø¨Ù pow(3, 4) ÙØªÛØ¬Ù ÙØ§Ø¯Ø±Ø³ØªÛ Ù
Û Ø¯ÙØ¯Ø اÙ
ا تست ÙØ§ با Ù
ÙÙÙÛØª Ø§ÙØ¬Ø§Ù
Ù
Û Ø´ÙÙØ¯.
â¦Ø§Ù ا اÛÙ ÙØ¶Ø¹Ûت Ú©Ø§Ù ÙØ§Ù Ø¹Ø§Ø¯Û Ø§Ø³Øª. در Ø¹Ù Ù Ø§ØªÙØ§Ù Ù Û Ø§ÙØªØ¯ ٠تست ÙØ§ ÙØ¨ÙÙ Ù Û Ø´ÙÙØ¯Ø ا٠ا ع٠Ùکرد تابع Ú©Ø§Ù ÙØ§ Ø§Ø´ØªØ¨Ø§Ù Ù Û Ø¨Ø§Ø´Ø¯. spec(٠شخصات) ٠ا ÙØ§Ùص است ٠٠ا Ø¨Ø§ÛØ¯ Ú©ÛØ³ ÙØ§Û Ø¨ÛØ´ØªØ±Û را ب٠آ٠اضاÙÙ Ú©ÙÛÙ .
Ø¨ÛØ§ÛÛØ¯ ÛÚ© تست دÛگر اضاÙÙ Ú©ÙÛÙ
تا pow(3, 4) = 81 را Ø¨Ø±Ø±Ø³Û Ú©ÙØ¯.
٠ا Ù Û ØªÙØ§ÙÛÙ ÛÚ©Û Ø§Ø² Ø¯Ù Ø±ÙØ´ را Ø¨Ø±Ø§Û Ø³Ø§Ø²Ù Ø§ÙØ¯ÙÛ ØªØ³Øª در اÛÙØ¬Ø§ Ø§ÙØªØ®Ø§Ø¨ Ú©ÙÛÙ :
-
ÙÙØ¹ اÙÙ â ÛÚ©
assertدÛگر ب٠Ù٠اÙitاضاÙÙ Ú©ÙÛØ¯:describe("pow", function() { it("Ø¨Ù ØªÙØ§Ù n Ø§Ù Ø§ÙØ²Ø§ÛØ´ Ù Û ÛØ§Ø¨Ø¯", function() { assert.equal(pow(2, 3), 8); assert.equal(pow(3, 4), 81); }); }); -
ÙÙØ¹ دÙÙ â Ø¯Ù تا تست درست Ú©ÙÛÙ :
describe("pow", function() { it("Ø¯Ù Ø¨Ù ØªÙØ§Ù 3 Ù ÛØ´Ùد 8", function() { assert.equal(pow(2, 3), 8); }); it("Ø³Ù Ø¨Ù ØªÙØ§Ù 4 Ù ÛØ´Ùد 81", function() { assert.equal(pow(3, 4), 81); }); });
ØªÙØ§Ùت اصÙÛ Ø§Û٠است Ú©Ù ÙÙØªÛ assert باعث Ø§ÛØ¬Ø§Ø¯ ÛÚ© خطا Ù
ÛØ´ÙØ¯Ø Ø¨ÙÙÚ© it Ø¨ÙØ§ÙاصÙÙ Ù¾Ø§ÛØ§Ù Ù
ÛâÛØ§Ø¨Ø¯. Ø¨ÙØ§Ø¨Ø±Ø§ÛÙØ در ÙÙØ¹ اÙÙØ اگر assert اÙÙ ÙØ§Ù
ÙÙÙ Ø¨Ø§Ø´Ø¯Ø ÙØ±Ú¯Ø² ÙØªÛج٠assert دÙÙ
را ÙØ®ÙاÙÛÙ
Ø¯ÛØ¯.
جدا کرد٠تستâÙØ§ از ÙÙ Ø¨Ø±Ø§Û Ø¯Ø±ÛØ§Ùت Ø§Ø·ÙØ§Ø¹Ø§Øª Ø¨ÛØ´ØªØ± در Ù ÙØ±Ø¯ Ø¢ÙÚÙ Ú©Ù Ø§ØªÙØ§Ù Ù ÛâØ§ÙØªØ¯ Ù ÙÛØ¯ Ù Û Ø¨Ø§Ø´Ø¯Ø Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ ÙÙØ¹ دÙÙ Ø¨ÙØªØ± است.
Ù Ø¹ÙØ§Ù٠بر Ø¢ÙØ ÛÚ© ÙØ§ÙÙ٠دÛÚ¯Ø±Û ÙØ¬Ùد دارد Ú©Ù Ø±Ø¹Ø§ÛØª Ú©Ø±Ø¯Ù Ø¢Ù Ø¨ÙØªØ± است.
ÛÚ© تست تÙÙØ§ ÛÚ© ÚÛØ² را Ø¨Ø±Ø±Ø³Û Ù Û Ú©ÙØ¯.
اگر ب٠تست Ùگا٠کÙÛÙ Ù Ø¯Ù ØØ§Ùت ÚÚ© کردÙ(بررسÛ) ٠ستÙ٠از Ù٠در آ٠ببÛÙÛÙ Ø Ø¨ÙØªØ± است آ٠را ب٠د٠دست٠ساد٠تر ØªÙØ³ÛÙ Ú©ÙÛÙ .
پس Ø¨ÛØ§ÛÛØ¯ با ÙÙØ¹ دÙ٠ادا٠٠دÙÛÙ .
Ù ÙØªÛجÙ:
ÙÙ
Ø§ÙØ·Ùر Ú©Ù Ù
ÛâØªÙØ§ÙستÛÙ
Ø§ÙØªØ¸Ø§Ø± داشت٠باشÛÙ
Ø Ø¢Ø²Ù
Ø§ÛØ´ دÙÙ
رد شد. Ù
Ø·Ù
Ø¦ÙØ§ÙØ ØªØ§Ø¨Ø¹ Ù
ا ÙÙ
ÛØ´Ù 8 را برÙ
Û Ú¯Ø±Ø¯Ø§ÙØ¯Ø در ØØ§ÙÛ Ú©Ù assert Ø§ÙØªØ¸Ø§Ø± 81 را دارد.
Ø¨ÙØ¨Ùد Ù¾ÛØ§Ø¯Ù سازÛ(Improving the implementation)
Ø¨ÛØ§ÛÛØ¯ ÛÚ© ÚÛØ² ÙØ§ÙØ¹Û ØªØ±Û Ø¨ÙÙÛØ³Û٠تا تست ÙØ§ ÙØ¨ÙÙ Ø´ÙÙØ¯:
function pow(x, n) {
let result = 1;
for (let i = 0; i < n; i++) {
result *= x;
}
return result;
}
Ø¨Ø±Ø§Û Ø§Ø·Ù
ÛÙØ§Ù از اÛÙک٠تابع Ø¨Ù Ø®ÙØ¨Û کار Ù
Û Ú©ÙØ¯ ÛØ§ ÙÙØ Ø¨ÛØ§ÛÛØ¯ آ٠را Ø¨Ø±Ø§Û Ù
ÙØ§Ø¯Ûر Ø¨ÛØ´ØªØ±Û تست Ú©ÙÛÙ
. Ø¨Ù Ø¬Ø§Û ÙÙØ´ØªÙ بÙÙÚ©âÙØ§Û it Ø¨Ù ØµÙØ±Øª Ø¯Ø³ØªÛØ Ù
ÛâØªÙØ§ÙÛÙ
Ø¢ÙâÙØ§ را در assert تÙÙÛØ¯ Ú©ÙÛÙ
:
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);
}
});
ÙØªÛØ¬Ù Ø¨Ù ØµÙØ±Øª Ø²ÛØ± Ù Û Ø¨Ø§Ø´Ø¯:
ØªÙØµÛÙ ØªÙØ¯Ø±ØªÙ (Nested describe)
Ù
ا ØØªÛ تست ÙØ§Û Ø¨ÛØ´ØªØ±Û را اضاÙÙ Ù
Û Ú©ÙÛÙ
. اÙ
ا ÙØ¨Ù از Ø¢ÙØ اجاز٠دÙÛØ¯ ØªÙØ¬Ù داشت٠باشÛÙ
ک٠تابع Ú©Ù
Ú©Û makeTest Ù for Ø¨Ø§ÛØ¯ با ÙÙ
در ÛÚ© گرÙÙ Ø¨Ø§Ø´ÙØ¯. Ù
ا در تستâÙØ§Û دÛگر ب٠makeTest ÙÛØ§Ø² ÙØ¯Ø§Ø±ÛÙ
Ø Ø¨ÙÚ©Ù ÙÙØ· در for Ù
ÙØ±Ø¯ ÙÛØ§Ø² است: ÙØ¸ÛÙÙ Ù
شترک Ø¢ÙÙØ§ اÛ٠است Ú©Ù Ø¨Ø±Ø±Ø³Û Ú©ÙÙØ¯ Ú©Ù pow ÚÚ¯ÙÙÙ Ø¨Ù ØªÙØ§Ù Ø¯Ø§Ø¯Ù Ø´Ø¯Ù Ø§ÙØ²Ø§ÛØ´ Ù
Û ÛØ§Ø¨Ø¯.
گرÙÙâØ¨ÙØ¯Û با assert ØªÙØ¯Ø±ØªÙ Ø§ÙØ¬Ø§Ù
Ù
ÛâØ´ÙØ¯:
describe("pow", function() {
describe("x Ø¨Ù ØªÙØ§Ù سÙ", function() {
function makeTest(x) {
let expected = x * x * x;
it(`${x} in the power 3 is ${expected}`, function() {
assert.equal(pow(x, 3), expected);
});
}
for (let x = 1; x <= 5; x++) {
makeTest(x);
}
});
// ... را Ù
Û ØªÙØ§Ù اضاÙ٠کرد it Ù ÙÙ
descibe تستâÙØ§Û Ø¨ÛØ´ØªØ±Û در اÛÙØ¬Ø§ ÙÙØ´ØªÙ Ù
ÛØ´ÙÙØ¯Ø ÙÙ
});
describe ØªÙØ¯Ø±ØªÙØ âØ²ÛØ±Ú¯Ø±ÙÙ(subgroup)â Ø¬Ø¯ÛØ¯Û Ø§Ø² تستâÙØ§ را تعرÛÙ Ù
ÛâÚ©ÙØ¯. در Ø®Ø±ÙØ¬Û ÙÛØ² Ù
Û ØªÙØ§ÙÛÙ
ØªÙØ±ÙØªÚ¯Û Ø¹ÙÙØ§Ù تست (title) را ببÛÙÛÙ
:
در Ø¢ÛÙØ¯Ù Ù
ÛâØªÙØ§ÙÛÙ
it Ù describe Ø¨ÛØ´ØªØ±Û در Ø³Ø·Ø ÙØ§Û Ø¨Ø§ÙØ§ ØªØ±Û Ø¨Ø§ ØªÙØ§Ø¨Ø¹ Ú©Ù
Ú©Û Ø®ÙØ¯ اضاÙÙ Ú©ÙÛÙ
Ø Ø¢ÙÙØ§ makeTest را ÙØ®ÙاÙÙØ¯ Ø¯ÛØ¯.
before/after Ù beforeEach/afterEachÙ
ا Ù
ÛâØªÙØ§ÙÛÙ
ØªÙØ§Ø¨Ø¹ before/after را بÙÙÛØ³ÛÙ
Ú©Ù ÙØ¨Ù/بعد از Ø§Ø¬Ø±Ø§Û ØªØ³Øª ÙØ§ اجرا Ù
ÛâØ´ÙÙØ¯ Ù ÙÙ
ÚÙÛÙ ØªÙØ§Ø¨Ø¹ beforeEach/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 Ø¨Ø±Ø§Û Ø§ÙØ¬Ø§Ù
Ù
ÙØ¯Ø§Ø±Ø¯ÙÛ(initialize) اÙÙÛÙØ ØµÙØ± کرد٠شÙ
Ø§Ø±ÙØ¯Ù ÙØ§ ÛØ§ Ø§ÙØ¬Ø§Ù
کار ÙØ§Û دÛÚ¯Ø±Û Ø¨Û٠تست ÙØ§ (ÛØ§ گرÙÙ ÙØ§Û تست) Ø§Ø³ØªÙØ§Ø¯Ù Ù
Û Ø´ÙØ¯.
گسترش spec
عÙ
Ùکرد اصÙÛ pow کاÙ
٠است. اÙÙÛ٠تکرار ØªÙØ³Ø¹Ù Ø§ÙØ¬Ø§Ù
شد٠است. ÙÙØª Ø¬Ø´Ù Ú¯Ø±ÙØªÙ Ù ÙÙØ´Ûد٠شاÙ
پاÛ٠تÙ
اÙ
شد â Ø¨ÛاÛÛØ¯ اداÙ
٠دÙÛÙ
٠آ٠را Ø¨ÙØ¨Ùد ببخشÛÙ
.
ÙÙ
Ø§ÙØ·Ùر Ú©Ù Ú¯ÙØªÙ Ø´Ø¯Ø ØªØ§Ø¨Ø¹ pow(x, n) Ø¨Ø±Ø§Û Ú©Ø§Ø± با Ù
ÙØ§Ø¯Ûر صØÛØ Ù
ثبت n است.
Ø¨Ø±Ø§Û ÙÙ
Ø§ÛØ´ ÛÚ© Ø®Ø·Ø§Û Ø±ÛØ§Ø¶ÛØ ØªÙØ§Ø¨Ø¹ Ø¬Ø§ÙØ§ اسکرÛپت Ù
عÙ
ÙÙØ§Ù NaN را برÙ
ÛâگرداÙÙØ¯. Ø¨ÛØ§ÛÛØ¯ ÙÙ
Û٠کار را Ø¨Ø±Ø§Û Ù
ÙØ§Ø¯Ûر ÙØ§Ù
عتبر n Ø§ÙØ¬Ø§Ù
دÙÛÙ
.
Ø¨ÛØ§ÛÛØ¯ ابتدا Ø±ÙØªØ§Ø± را ب٠spec(!) اضاÙÙ Ú©ÙÛÙ :
describe("pow", function() {
// ...
it("Ø¨Ø±Ø§Û n ÙØ§Û Ù
ÙÙÛ Ø¹Ø¨Ø§Ø±Øª NaN", function() {
assert.isNaN(pow(2, -1));
});
it("Ø¨Ø±Ø§Û Ù
ÙØ§Ø¯Ûر ØºÛØ± Ø¹Ø¯Ø¯Û Ø¹Ø¨Ø§Ø±Øª NaN", function() {
assert.isNaN(pow(2, 1.5));
});
});
Ù ÙØªÛج٠با تست Ø¬Ø¯ÛØ¯ Ø¨Ù ØµÙØ±Øª Ø²ÛØ± Ù Û Ø¨Ø§Ø´Ø¯:
تست ÙØ§Û Ø¬Ø¯ÛØ¯ اضاÙ٠شد٠با شکست Ù ÙØ§Ø¬Ù Ù Û Ø´ÙÙØ¯Ø Ø²ÛØ±Ø§ Ù¾ÛØ§Ø¯Ù Ø³Ø§Ø²Û Ù Ø§ از Ø¢ÙÙØ§ Ù¾Ø´ØªÛØ¨Ø§ÙÛ ÙÙ Û Ú©ÙØ¯. BDD اÛÙÚ¯ÙÙÙ Ø§ÙØ¬Ø§Ù Ù Û Ø´ÙØ¯: ابتدا تست ÙØ§Û شکست Ø®ÙØ±Ø¯Ù را Ù Û ÙÙÛØ³Û٠٠سپس Ø¨Ø±Ø§Û Ø¢ÙÙØ§ Ù¾ÛØ§Ø¯Ù Ø³Ø§Ø²Û Ù Û Ú©ÙÛÙ .
ÙØ·Ùا٠ب٠assert.isNaN ØªÙØ¬Ù Ú©ÙÛØ¯: NaN Ø¨ÙØ¯Ù را Ø¨Ø±Ø±Ø³Û Ù
ÛÚ©ÙØ¯.
assert دÛÚ¯Ø±Û ÙÛØ² در chai ÙØ¬Ùد Ø¯Ø§Ø±Ø¯Ø Ø¨Ù Ø¹ÙÙØ§Ù ٠ثاÙ:
assert.equal(value1, value2)â Ø¨Ø±Ø§Ø¨Ø±Û را Ø¨Ø±Ø±Ø³Û Ù Û Ú©ÙØ¯value1 == value2.assert.strictEqual(value1, value2)â Ø¨Ø±Ø§Ø¨Ø±Û دÙÛ٠را Ø¨Ø±Ø±Ø³Û Ù Û Ú©ÙØ¯value1 === value2.assert.notEqual,assert.notStrictEqualâ Ø¨Ø±Ø±Ø³Û Ù Ø¹Ú©ÙØ³ Ù ÙØ§Ø±Ø¯ Ø¨Ø§ÙØ§.assert.isTrue(value)â Ø§Û٠را Ø¨Ø±Ø±Ø³Û Ù Û Ú©ÙØ¯value === trueassert.isFalse(value)â Ø§Û٠را Ø¨Ø±Ø±Ø³Û Ù Û Ú©ÙØ¯value === false- ⦠ÙÛØ³Øª کا٠٠را Ù Û ØªÙØ§ÙÛØ¯ در Ù Ø³ØªÙØ¯Ø§Øª Ù Ø´Ø§ÙØ¯Ù Ú©ÙÛØ¯.
Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ Ø¨Ø§ÛØ¯ ÚÙØ¯ خط ب٠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 ابتدا spec(٠شخصات) ٠سپس Ù¾ÛØ§Ø¯Ù Ø³Ø§Ø²Û Ø§ÙØ¬Ø§Ù Ù Û Ø´ÙØ¯. در Ù¾Ø§ÛØ§Ù ÙÛØ² ٠ا ÙÙ spec Ù Ù٠کد ÙØ§ را دارÛÙ .
٠شخصات(spec) را Ù Û ØªÙØ§Ù Ø¨Ù Ø³Ù Ø±ÙØ´ Ø§Ø³ØªÙØ§Ø¯Ù کرد:
- Ø¨Ù ØµÙØ±Øª Tests â ØªØ³Øª ÙØ§ تض٠ÛÙ Ù Û Ú©ÙÙØ¯ ک٠کد Ø¨Ù Ø¯Ø±Ø³ØªÛ Ú©Ø§Ø± Ù Û Ú©ÙØ¯.
- Ø¨Ù ØµÙØ±Øª Docs â Ø¹ÙاÙÛÙ
describeÙitÙØ´Ø§Ù Ù Û Ø¯ÙØ¯ ک٠تابع ÚÙ Ú©Ø§Ø±Û Ø§ÙØ¬Ø§Ù Ù Û Ø¯ÙØ¯. - Ø¨Ù ØµÙØ±Øª Examples â ØªØ³Øª ÙØ§ در ÙØ§Ùع ÙÙ ÙÙÙ ÙØ§Û Ú©Ø§Ø±Û ÙØ³ØªÙد Ú©Ù ÙØ´Ø§Ù Ù Û Ø¯ÙÙØ¯ ÚÚ¯ÙÙÙ Ù Û ØªÙØ§Ù از ÛÚ© تابع Ø§Ø³ØªÙØ§Ø¯Ù کرد.
با اÛÙ spec ÙØ§, Ù ÛâØªÙØ§ÙÛ٠با Ø®ÛØ§Ù Ø±Ø§ØØª ع٠Ùکرد تابع را Ø¨ÙØ¨Ùد بخشÛÙ Ø ØªØºÛÛØ± دÙÛÙ Ø ØØªÛ از ابتدا بازÙÙÛØ³Û Ú©ÙÛ٠٠٠ط٠ئ٠شÙÛÙ Ú©Ù ÙÙ ÚÙØ§Ù درست کار Ù ÛâÚ©ÙØ¯.
اÛ٠ب٠ÙÛÚ٠در پرÙÚÙ ÙØ§Û بزرگ ز٠اÙÛ Ú©Ù ÛÚ© تابع در Ø¨Ø³ÛØ§Ø±Û از Ù Ú©Ø§Ù ÙØ§ Ø§Ø³ØªÙØ§Ø¯Ù Ù Û Ø´ÙØ¯ Ù Ù٠است. ÙÙØªÛ ÚÙÛÙ ØªØ§Ø¨Ø¹Û Ø±Ø§ تغÛÛØ± Ù ÛâØ¯ÙÛÙ Ø Ø±Ø§ÙÛ Ø¨Ø±Ø§Û Ø¨Ø±Ø±Ø³Û Ø¯Ø³ØªÛ ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯ Ú©Ù Ø¢ÛØ§ ÙØ± ٠کاÙÛ Ú©Ù Ø§Ø² Ø¢Ù Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâÚ©ÙØ¯ ÙÙÙØ² درست کار Ù ÛâÚ©ÙØ¯ ÛØ§ Ø®ÛØ±.
بدÙ٠تست, Ù Ø±Ø¯Ù Ø¯Ù Ø±Ø§Ù Ø¯Ø§Ø±ÙØ¯:
- Ø¨Ø±Ø§Û Ø§ÙØ¬Ø§Ù تغÛÛØ± Ú©Ù Ù ÙÙ ÙÛØ³Øª Ú©Ù Ú٠باشد, کاربرا٠٠ا با Ø§Ø´Ú©Ø§Ù Ù ÙØ§Ø¬Ù Ù Û Ø´ÙÙØ¯Ø Ø²ÛØ±Ø§ ٠ا Ø§ØØªÙ Ø§ÙØ§Ù ÚÛØ²Û را Ø¨Ù ØµÙØ±Øª Ø¯Ø³ØªÛ Ø¨Ø±Ø±Ø³Û ÙÙ Û Ú©ÙÛÙ .
- ÛØ§Ø اگر ٠جازات Ø¨Ù ÙØ¬Ùد Ø¢Ù Ø¯Ù Ø§Ø±ÙØ± ÛØ§ خطا سخت Ø¨Ø§Ø´Ø¯Ø ÙÙ Ø§Ù Ø·ÙØ± ک٠تست ÙØ§ ÙØ¬Ùد ÙØ¯Ø§Ø±ÙØ¯Ø Ù Ø±Ø¯Ù Ø§Ø² تغÛÛØ± ÚÙÛ٠تابع ÙØ§ÛÛ Ù Û ØªØ±Ø³ÙØ¯Ø در ÙØªÛج٠کد ٠ا ÙØ¯ÛÙ Û Ù Û Ø´ÙØ¯(Ø²ÛØ±Ø§ Ù ÛØªØ±Ø³Ùد ک٠کد را ØªÙØ³Ø¹Ù دÙÙØ¯ Ù Ø§Ø±ÙØ±Û رخ Ø¨Ø¯ÙØ¯) Ù ÙÛØ¬ کس ٠اÛÙ ÙÛØ³Øª ک٠کد را ØªÙØ³Ø¹Ù Ø¯ÙØ¯ ٠اÛÙ Ø¨Ø±Ø§Û ØªÙØ³Ø¹Ù Ø®ÙØ¨ ÙÛØ³Øª.
تست Ø®ÙØ¯Ú©Ø§Ø± Ø¨Ø±Ø§Û Ø¬ÙÙÚ¯ÛØ±Û از اÛÙ Ù Ø´Ú©ÙØ§Øª Ú©Ù Ú© Ù Û Ú©ÙØ¯!
اگر پرÙÚ٠با تست ÙØ§ Ù¾ÙØ´Ø´ Ø¯Ø§Ø¯Ù Ø´ÙØ¯Ø ÚÙÛÙ Ù Ø´Ú©ÙÛ Ø¨Ù ÙØ¬Ùد ÙÙ Û Ø¢ÛØ¯, Ø²ÛØ±Ø§ پس از ÙØ± تغÛÛØ±ÛØ Ù ÛâØªÙØ§ÙÛ٠تستâÙØ§ÛÛ Ø±Ø§ اجرا Ú©ÙÛ٠٠در عرض ÚÙØ¯ ثاÙÛ٠تعداد Ø²ÛØ§Ø¯Û Ø¨Ø±Ø±Ø³Û Ø±Ø§ Ù Ø´Ø§ÙØ¯Ù Ú©ÙÛÙ .
Ø¹ÙØ§Ù٠بر اÛÙØ ÛÚ© کد Ø®ÙØ¨ تست Ø´Ø¯Ù Ù Ø¹Ù Ø§Ø±Û Ø¨ÙØªØ±Û دارد.
Ø¨Ù Ø·ÙØ± Ø·Ø¨ÛØ¹Û, Ø§ØµÙØ§Ø Ù Ø¨ÙØ¨Ùد کد ÙØ§Û تست Ø´Ø¯Ù Ø¨Ù ØµÙØ±Øª Ø®ÙØ¯Ú©Ø§Ø± آسا٠تر است. ا٠ا دÙÛ٠دÛÚ¯Ø±Û ÙÛØ² ÙØ¬Ùد دارد.
Ø¨Ø±Ø§Û ÙÙØ´ØªÙ تستâÙØ§Ø کد Ø¨Ø§ÛØ¯ ب٠گÙÙÙâØ§Û Ø³Ø§Ø²Ù Ø§ÙØ¯ÙÛ Ø´ÙØ¯ Ú©Ù ÙØ± تابع Ø¯Ø§Ø±Ø§Û ÛÚ© ÙØ¸ÛÙÙ ÙØ§Ø¶ØØ ÙØ±ÙØ¯Û Ù Ø®Ø±ÙØ¬Û Ú©Ø§Ù ÙØ§Ù تعرÛ٠شد٠باشد. اÛÙ ÛØ¹ÙÛ ÛÚ© Ù Ø¹Ù Ø§Ø±Û Ø®ÙØ¨ از ابتدا.
در Ø²ÙØ¯Ú¯Û ÙØ§ÙعÛ, گاÙÛ Ø§ÙÙØ§Øª Ø¢ÙÙØ¯Ø±Ùا Ù٠آسا٠ÙÛØ³Øª. گاÙÛ Ø§ÙÙØ§Øª ÙÙØ´ØªÙ ÛÚ© ٠شخصات(spec) ÙØ¨Ù از کد ÙØ§ÙØ¹Û Ø¯Ø´ÙØ§Ø± Ø§Ø³ØªØ Ø²ÛØ±Ø§ ÙÙÙØ² ٠شخص ÙÛØ³Øª Ú©Ù ÚÚ¯ÙÙÙ Ø¨Ø§ÛØ¯ Ø±ÙØªØ§Ø± Ú©ÙØ¯. ا٠ا Ø¨Ù Ø·ÙØ± Ú©ÙÛ ØªØ³Øª, ØªÙØ³Ø¹Ù را Ø³Ø±ÛØ¹ØªØ± Ù Ù¾Ø§ÛØ¯Ø§Ø±ØªØ± Ù Û Ú©ÙØ¯.
بعدا٠در اÛÙ Ø¯ÙØ±Ù Ø¢Ù ÙØ²Ø´ÛØ Ø¨Ø§ Ø¨Ø³ÛØ§Ø±Û از ت٠رÛÙ ÙØ§ Ù٠را٠با تست ÙØ§Û ÙÛکس شدÙ(baked-in) Ø±ÙØ¨Ø±Ù Ø®ÙØ§ÙÛØ¯ شد. Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ ÙÙ ÙÙÙ ÙØ§Û Ú©Ø§Ø±Ø¨Ø±Ø¯Û Ø¨ÛØ´ØªØ±Û Ø®ÙØ§ÙÛØ¯ Ø¯ÛØ¯.
ÙÙØ´ØªÙ تست ÙØ§ Ø¨Ù Ø¯Ø§ÙØ´ Ø®ÙØ¨ Ø¬Ø§ÙØ§ اسکرÛپت ÙÛØ§Ø² دارد. ا٠ا ٠ا ØªØ§Ø²Ù Ø´Ø±ÙØ¹ Ø¨Ù ÛØ§Ø¯Ú¯ÛØ±Û Ø¢Ù Ú©Ø±Ø¯Ù Ø§ÛÙ . Ø¨ÙØ§Ø¨Ø±Ø§ÛÙØ Ø¨Ø±Ø§Û ØÙ کرد٠ÙÙ Ù ÚÛØ²Ø از Ù٠اکÙÙÙ ÙÛØ§Ø²Û ب٠ÙÙØ´ØªÙ تست ÙØ¯Ø§Ø±ÛØ¯Ø Ø§Ù Ø§ Ø¨Ø§ÛØ¯ Ø¨ØªÙØ§ÙÛØ¯ Ø¢ÙÙØ§ را Ø¨Ø®ÙØ§ÙÛØ¯Ø ØØªÛ اگر Ú©Ù Û Ù¾ÛÚÛØ¯Ù تر از اÛÙ ÙØµÙ Ø¨Ø§Ø´ÙØ¯.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)