js тест. JavaScript мэдлэгийн тест - Үндсэн ойлголт

Нэгэн удаа миний нэг найз JavaScript-ийг хөрвүүлэгчгүй тул ямар нэгэн ноцтой аж ахуйн нэгжийн бүтээгдэхүүн бичихэд хэрхэн ашиглаж болох талаар эргэлзэж байгаагаа илэрхийлсэн. Үнэн хэрэгтээ өндөр чанартай кодыг бий болгоход шийдвэрлэх үүрэг нь програмчлалын хэлний хөрвүүлэгчтэй байх нь чухал биш, харин програм хангамжийн системийг бий болгох зөв сонгосон, сайн тохируулсан техникийн процесс юм.

Энэ процесс нь програмистад зориулсан чанар, үр ашгийг хянах багц хэрэгслийг багтаасан байх ёстой. Ийм хэрэгслүүд нь: нэгж ба интеграцийн туршилт, тасралтгүй интеграци (Үргэлжилсэн интеграци, CI), янз бүрийн хэмжигдэхүүнүүдийг цуглуулах, дүн шинжилгээ хийх (жишээлбэл, nDepend дахь маш урт аргууд), JsLint, FxCop гэх мэт шаардлагад нийцэж байгаа эсэхийг шалгах.

Энэ нийтлэлд би JavaScript дээр өөрийн бүтээгдэхүүний автомат нэгж, интеграцийн туршилтыг хэрхэн зөв хийхийг танд хэлэхийг хүсч байна. Үнэн хэрэгтээ JavaScript нь энэ тал дээр Java эсвэл C#-ээс ялгаагүй юм.

Agile, TDD болон BDD

Ирээдүйд кодыг өөрчлөх үед регрессийн алдааны эрсдлийг бууруулахын тулд гүйцэтгэсэн функцэд зориулсан автомат нэгж, нэгтгэх тестийг бий болгохыг зөвлөж байна. JavaScript-ийн хувьд эдгээр тестүүд нь систем ажиллаж байгаа эсэхийг баталгаажуулах алхмуудыг автоматжуулах замаар өөр өөр хөтөч дээр ажиллаж байгаа эсэхийг шалгахад илүү хялбар болгодог. Нэмж дурдахад, бүтээгдэхүүний хаагдсан алдаа бүрт нэгж эсвэл нэгтгэх тест бичих нь сайн үйлчилгээ үзүүлэх болно.

Мөн нэгж тест бичих замаар логикийг кодлож эхлэх шаардлагатай програмчлалын техникүүд байдаг: Тестээр суурилсан хөгжил (TDD) болон зан төлөвт тулгуурласан хөгжил (BDD). Тэдгээрийг Agile процесст ихэвчлэн ашигладаг. Тэдний онцлог шинж чанарыг илүү нарийвчлан авч үзье.

Туршилтанд суурилсан хөгжил

Туршилтад суурилсан хөгжүүлэлт нь дараах дөрвөн алхмыг давтдаг давталттай кодчилол юм.

1-р алхам. Логикийн шинэ хэсгийг нэмэхийн өмнө тухайн логикийг шалгахын тулд нэгжийн тест үүсгэнэ үү;

Алхам 2. Туршилтыг ажиллуулж, эсэхийг шалгаарай Үгүйдамжуулалт;

Алхам 3. Шалгалтад тэнцэх хамгийн энгийн кодыг бичнэ үү;

Алхам 4. Чанарын шаардлагын дагуу кодыг засварлаж, кодын давхардлыг арилгах, шалгалтад тэнцсэн эсэхийг шалгана уу.

Нэгжийн тест нь тусгаарлагдсан орчинд зарим бүрэлдэхүүн хэсгийн (модуль) ажиллагааг шалгах код юм. Интеграцийн тест нь тест хийдэг код юм хамтарсан ажилолон бүрэлдэхүүн хэсэг. Туршилтын давхар нь модулийг бусад модулиудаас хамааралтай үед тусгаарлагдсан орчинд туршихад ашигладаг.

Туршилтын хосууд

Нэгжийн туршилтанд ашигласан туслах объектуудыг ангилалд хуваах нь Жерард Мезаросын xUnit Test Patterns номоос эхтэй. Эдгээр ангиллыг хамтад нь "туршилтын давхар" (туршилтын давхар) гэж нэрлэдэг. Дублерууд нь дараахь төрлүүдтэй.

  • хуурамч;
  • Дамми.

Stub гаралтын утгуудурьдчилан тогтоосон байдаг. Энэ нь хамааралтай бүрэлдэхүүн хэсгийн интерфейсийг дуурайхад хэрэглэгддэг.

Хуурамчтуслах объект юм зан байдалүүнийг урьдчилан тогтоосон. Энэ нь хамааралтай бүрэлдэхүүн хэсгийн интерфейсийг дуурайж, туршилтын явцад үүнийг зөв ашиглаж байгаа эсэхийг шалгахад ашиглагддаг.

Тагнуулнь туршилтын явцад дамжуулсан арга, параметрүүдийг шалгах туслах объект юм.

Хуурамчнь хамааралтай бүрэлдэхүүн хэсгийн интерфейсийг хялбаршуулсан хэлбэрээр хэрэгжүүлдэг туслах объект юм. Жишээлбэл, нэгжийн туршилтын зорилгоор та бүтээгдэхүүний үйлдвэрлэлийн хувилбарт ашигладаг харилцааны мэдээллийн сангийн оронд санах ойн мэдээллийн сантай байж болно.

Дамминь аргын гарын үсэг эсвэл бусад гэрээнд заах, дамжуулах шаардлагатай боловч бодит утгыг хэзээ ч ашигладаггүй туслах объект юм.

Stub болон Mock хоёрын ялгаа нь тестийн үр дүнг хэрхэн баталгаажуулах явдал юм. Stub-ийн хувьд объектын төлөвийг туршилтын төгсгөлд шалгана. Mock-ийн хувьд тест нь тухайн объектыг бүртгэлийн явцад тайлбарласны дагуу яг ашиглаж байгаа эсэхийг шалгадаг. Дэлгэрэнгүй мэдээллийг Мартин Фаулерын Mocks Aren "t Stubs" тэмдэглэлээс олж болно, би энд зөвхөн жишээ хэлье.

Stub Хуурамч
"туршилтын холболт санал асуулга эхлэх ёстой": функц () ( this.client.url = "/my/url"; sinon.stub(ajax, "санал асуулга").returns(()); this.client.connect(); sinon.assert.calledWith(ajax.poll, "/my/url"); ) "туршилтын холболт санал асуулга эхлэх ёстой": функц () ( this.client.url = "/my/url"; var mock = sinon.mock(ajax) mock.expects("санал асуулга") .withArgs("/my/url" ").returns(()); this.client.connect(); mock.verify(); )

Зан төлөвт тулгуурласан хөгжил

Хөгжлийн давталтын хандлага програм хангамжфункциональ шаардлагуудыг хэрэгжүүлэх замаар - энэ бол үр дүнд төвлөрсөн туршилтанд суурилсан хөгжлийн аль хэдийн танил болсон хэв маяг юм. BDD процесст дараах гурван алхмыг дараалан хэрэгжүүлнэ.

1-р алхам. Туршилтын хэлбэрээр хэрэгжсэн модулийн функциональ шаардлагыг тодорхойлох;

Алхам 2. Модулийн кодчилол;

Алхам 3. Туршилтын үр дүнг шалгах замаар үйлчлүүлэгч эсвэл бизнесийн шинжээчийн () бүх хүсэл биелж байгаа эсэхийг шалгах.

BDD хэв маягаар тест бичихдээ Mock объектуудыг ашиглах нь маш тохиромжтой, учир нь тэдгээр нь бүрэлдэхүүн хэсгийн функциональ шаардлагыг бүрэн тусгасан байдаг. Тиймээс BDD үйл явц дахь тестүүд нь даалгаврын албан ёсны төлөөлөл болж чаддаг ( хэрэглэгчийн түүх) хувьд Скрум, энэ нь бэлэн бүтээгдэхүүний техникийн тодорхойлолт, баримт бичгийг бичихэд цаг хэмнэх боломжийг олгодог.

JavaScript нэгжийн тестийн хүрээ ямар байх ёстой вэ?

JavaScript-ийн иж бүрэн нэгж ба интеграцийн туршилтын хэрэгсэл нь дараах бүрэлдэхүүн хэсгүүдээс бүрдэх ёстой.

  • Баталгаажуулах сан (туршилт бүрийн төгсгөлд бүрэлдэхүүн хэсгийн төлөв байдлыг шалгах аргуудын багц);
  • Хуурамч номын сан (хуурамч объект болон бусад "дутуу судалгаа" үүсгэх хэрэгсэл);
  • Туршилтын гүйгч (хэрэгсэл автоматаар эхлэх iOS болон Android хөтчүүдийг оруулаад ихэнх хөтчүүдийн дэмжлэгтэй тестүүд);
  • Тасралтгүй интеграцийн түгээмэл системүүдтэй холбох блок (Тасралтгүй интеграци).

JavaScript нэгжийн туршилтын стратеги

Өнөөдөр JavaScript кодын нэгжийг шалгах гурван стратеги байдаг (дэлгэрэнгүй мэдээллийг Кристиан Йохансений "Тест-драйв JavaScript хөгжүүлэлт" номын гуравдугаар бүлгээс үзнэ үү):

  • хөтөч доторхтуршилт;
  • толгойгүйтуршилт;
  • Замдаа туршилт хийж байна JsTestDriver.

Хөтөч доторх тест нь хөгжүүлэгч өөрөө шаардлагатай хөтчүүдэд нээдэг HTML хуудаснаас бүх нэгж болон интеграцийн тестүүдийг ажиллуулдаг. Энэ арга нь энгийн бөгөөд ойлгомжтой юм. Гэсэн хэдий ч түүний сул тал нь ийм туршилтыг тасралтгүй интеграцид оруулах боломжийг заагаагүй явдал юм. Мөн HTML хуудсыг арав ба түүнээс дээш хөтөч дээр гараар нээх, "F5" дээр байнга дарах нь хөгжүүлэгчийн хувьд уйтгартай байдаг.

Толгойгүй тест гэдэг нь бүх JavaScript кодыг Java, Ruby, JavaScript, C++ гэх мэт хэл дээр бичиж болох эмулятор дээр туршиж үздэг гэсэн үг юм. Одоогийн байдлаар хамгийн алдартай эмулятор бол PhantomJS юм вэб багц, -аас эхлүүлсэн тушаалын мөр. Эмуляторын давуу талуудын дунд үүнийг тасралтгүй интеграцид хялбархан ашиглах боломжтой, мөн командын мөрөөс бүх тестийг автоматжуулах боломжийг олгодог гэдгийг тэмдэглэж болно. Гэсэн хэдий ч энэ арга нь мэдэгдэхүйц сул талтай - кодыг жинхэнэ хөтөч дээр туршиж үзээгүй тул эмулятор дээр хуулбарлагдаагүй хөтчийн алдаа дутагдах эрсдэлтэй. JsTestDriver гарч ирэхээс өмнө та In-Browser тестийг толгойгүй тесттэй хослуулан харж байсан, учир нь тэдгээр нь бие биенээ маш сайн нөхдөг.

Туршилт нь програм хангамж хөгжүүлэх мөчлөгийн салшгүй хэсэг юм. Эхлэх хөгжүүлэлтийн багууд ихэнхдээ түүний үүргийг дутуу үнэлж, програмын гүйцэтгэлийг хуучин хэв маягаар шалгадаг - "энэ нь ажилладаг, энэ нь зүгээр". Эрт орой хэзээ нэгэн цагт энэ стратеги бүтэлгүйтэж, алдаа хянагч нь тоо томшгүй олон даалгаврын армийг дарж эхэлдэг. Ийм урхинд орохгүйн тулд би JavaScript кодыг турших нюансуудыг нэг удаа шийдэхийг зөвлөж байна.

JavaScript бол бялуу байхаа больсон!

Өнөөдөр JavaScript бол зүгээр нэг зүйлийг амтлах хэл биш гэдгийг би танд тайлбарлах шаардлагагүй гэж бодож байна. Гадаад төрхпрограмууд. Гэхдээ би ямар ч байсан тайлбарлаж, бага зэрэг оршил бичье, учир нь би илүү их мөнгө авах болно илүү мөнгө! 🙂 Тиймээс JavaScript-г тоглоом шоглоом хийх эсвэл цэс хийхэд ашигладаг байсан үе үүрд өнгөрчээ. Одоо энэ нь үйлчлүүлэгч болон серверийн аль алинд нь адилхан сайн ажилладаг бие даасан хэл юм. JavaScript-ийн үүрэг ихээхэн нэмэгдсэн бөгөөд энэ нь код бичихдээ бусад програмчлалын хэл дээр батлагдсан практикийг ашиглахаас ичиж болохгүй гэсэн үг юм.

Би дадал, парадигм гэж юуг хэлээд байна вэ? Мэдээжийн хэрэг, MVC (загвар харах хянагч) архитектурын загвар, кодын зохион байгуулалтын загварууд. Эдгээр энгийн заль мэхийг дагаснаар та засвар үйлчилгээ хийхэд хялбар төдийгүй автоматаар шалгах чадвартай илүү сайн код бичих боломжтой болно.

Сайн тест хийх дүрэм

  • Туршилт нь аль болох энгийн байх ёстой. Шалгалт хэцүү байх тусам алдаа гаргах магадлал өндөр байдаг.
  • Дараа нь алдааг олж, програмын тодорхой хэсгийг туршиж үзэхэд хялбар байхын тулд тестүүдийг модулиудад бүлэглэсэн байх ёстой.
  • Туршилт бүр нь бусад шалгалтаас хамаарах ёсгүй.
  • Алдаа олох бүртээ тусдаа тест бичээрэй.

Ихэнх тестерүүдийн алдаа

Туршилтын хамгийн түгээмэл арга бол нүдний харааны сорилт байсаар ирсэн нь нууц биш юм. Үүний мөн чанар нь гутамшигт амархан байдаг - би хэдэн мянган мөр код бичиж, асуудлыг шийдэж, бүтээлээ эхлүүлсэн. Би эргэн тойрон тоглож, товшсон - бүх зүйл ажиллаж байгаа бололтой, та үүнийг байлдааны серверт байршуулж болно. Бүх зүйл маш энгийн бөгөөд хөгжүүлэгчийн анхаарал халамжаар (хамгийн тохиромжтой нь "шалгагч" хочтой хувь хүн) та програмын зөв ажиллагаанд найдаж болно.

Практикт бүх зүйл арай өөрөөр тохиолддог. Дүрмээр бол тусдаа шалгагч байдаггүй. Хөгжүүлэгч өөрөө техникийн даалгаварт заасан үйлдлүүдийн дарааллыг гүйцэтгэх замаар програмын ажиллах чадварыг шалгахыг оролддог. Илүү дэвшилтэт кодууд нь ийм төрлийн интеграцийн туршилтыг Selenium зэрэг хэрэгслээр автоматжуулдаг.

Тиймээс програмист зөвхөн хамгийн бүдүүлэг алдааг илрүүлэх боломжийг олж авдаг. Харамсалтай нь хэрэглэгчийн "тэнэг" болон "санаагүй" үйлдлүүд, бизнесийн логик дахь төвөгтэй алхамууд 99% тохиолдолд хөшигний ард үлддэг.

Тусдаа шалгагч байгаа нь асуудлыг хэсэгчлэн, тодорхой цаг хүртэл шийддэг. Хэдийгээр бид түүний саперын нарийн ширийн зүйлийг анхаарч үзэхгүй байсан ч програм томрох тусам түүний туршилтын чанар тэг болно. Би практикт жишээ өгөх болно.

Нэг удаа надад жижиг хөтөлбөр боловсруулах үүрэг өгсөн. Үйл ажиллагааны хувьд төсөл нь миний хамгийн богино хугацаанд хэрэгжүүлсэн хамгийн энгийн CRM-тэй төстэй байв. Тохиромжтой цалингаа аваад бүх эх үүсвэрээ захиалагчид хүлээлгэж өгөөд найман сарын турш төслийг мартсан. Дараа нь хамгийн сонирхолтой нь эхэлсэн. Үйлчлүүлэгч програмын функцийг нухацтай өргөжүүлэхээр шийдэж, надаас тусламж хүсэв. Мэдээжийн хэрэг, би үүнийг авч, функцийн дараа функцийг сийлбэрлэж эхлэв ... Эхэндээ энэ нь тийм ч хэцүү биш байсан ч функцийг бүхэлд нь нэгтгэх үед миний зүг рүү шуугиан дэгдээсэн. Кодын хэсгүүд хоорондоо зөрчилдөж эхэлсэн бөгөөд би зөрчилдөөнийг шийдвэрлэхэд маш их цаг зарцуулах шаардлагатай болсон. "За, таны өргөдөлд асуудал гарсныг та яаж хараагүй юм бэ?" уншигчид асуух болно. Би хариулах болно: Би үүнийг эхлүүлсэн, гэхдээ програм нь томорсон тул бүх функцийг бөөнөөр нь туршиж үзэх цаг зав, мэдрэл надад байсангүй. Би зөвхөн бие даасан функцуудыг туршихаар хязгаарлагдаж, төлбөрөө харамгүй төлсөн. Түүхийн ёс суртахуун: "Тестийг хөгжлийн салшгүй хэсэг гэж бод."

Нэгжийн туршилтууд нь мөнгөн сумтай адил юм

Нэгжийн туршилт нь таны мэдрэлийг хэмнэх хамгийн сайн арга бөгөөд програмын бие даасан хэсгүүд ажиллах баталгааг нэмэгдүүлэх болно. Хэрэв та энэ аймшигт араатантай хэзээ ч уулзаж байгаагүй бол би товчхон тайлбарлая. Нэгжийн туршилтууд нь танд туршилтын процессыг автоматжуулах, програмынхаа онцлог бүрийг туршилтанд оруулах боломжийг олгодог.

Хөгжүүлэлт дууссаны дараа шинэ шинж тэмдэг(хөгжүүлэлт эхлэхээс өмнө тест бичих боломжтой) хөгжүүлэгч өөрийн кодыг шалгахын тулд тусгай код бичдэг. Энэ нь янз бүрийн нөхцөл байдлыг дуурайж, утгыг буцаах шаардлагатай. Жишээлбэл, бид хоосон зайг багасгах функцийг бичсэн. Гүйцэтгэлийг нь шалгахын тулд бид хэд хэдэн туршилтыг бэлтгэх ёстой бөгөөд ингэснээр дараахь зүйлийг батлах боломжтой болно.

  • "мөр" мөрийг дамжуулахад бид "мөр" -ийг гаралт болгон авдаг;
  • гаралт дээр "мөр 9" гэсэн нэр томъёог дамжуулахад бид "мөр 9" авна;

Мөн бид бусад оролтын параметрүүдийн тестийг нэмж болно (жишээлбэл, хоосон зайг табаар солих). Ерөнхийдөө бид кодыг тестээр илүү сайн бүрхэж, сөрөг хувилбаруудыг урьдчилан таамаглах тусам хамгийн чухал мөчид толгой дээр бага зэрэг үс үлдэх магадлал өндөр болно.

JS ертөнцөд тестийг ихэвчлэн тусгай хүрээ ашиглан бичдэг. Тэдэнд танд хэрэгтэй бүх зүйл, мөн шалгалтын явцын тайланг зохион байгуулах зарим хэрэгслүүд байдаг.

Туршилтууд!= нэмэлт код

Нэгжийн бус шалгагч нар нэгжийн туршилтыг бичих, засварлах шаардлагатай гэж маргах дуртай нэмэлт код. Бодит төслүүдийн эцсийн хугацаа ихэвчлэн шахагдсан байдаг тул нэмэлт код бичих боломжгүй гэж тэд хэлэв.

Туршилт хийх цаг байхгүй үед

Цаг байхгүй тохиолдолд энгийн функцүүдийн тест бичих нь утгагүй юм (нийтлэл дэх жишээн дээрх ижил зүсэлтийг () ав), кодын хамгийн чухал хэсгүүдэд анхаарлаа хандуулах нь дээр. Байнга өөрчлөгддөг кодыг бичихдээ ижил дүрмийг баримтлах хэрэгтэй. Амьд төслийн техникийн даалгавар нь ихэвчлэн өөрчлөгддөг бөгөөд зарим функцийг байнга шинэчилж байх ёстой. Ийм өөрчлөлт нь тааламжгүй мөчүүдэд хүргэж болзошгүй - өөрчлөгдсөн код нь шинэ өгөгдөлтэй сайн ажилладаг боловч хуучин өгөгдлийг органик байдлаар шингээдэггүй. Энд, энд гажиг барихгүйн тулд ийм функцийг нэн даруй шалгах нь дээр. Энгийн дүрмийг санаарай: бүх кодыг тестээр хамрах цаг байхгүй - түүний хамгийн чухал хэсгийг хамарна.


Хатуу хугацааны хувьд би зөвшөөрч байна, гэхдээ би нэмэлт кодын талаар маргахад бэлэн байна. Нэг талаас, тийм ээ - тест нь нэмэлт код шаарддаг тул үүнийг бичих цаг болжээ. Нөгөөтэйгүүр, энэ код нь автомашины аюулгүйн дэрний үүргийг гүйцэтгэдэг бөгөөд хэрэглээ өсөх тусам үр дүнгээ өгөх нь гарцаагүй.
  • Кристиан Йохансен Туршилтанд суурилсан JavaScript хөгжүүлэлт (goo.gl/mE6Is) нь JavaScript-г тест бичих талаас нь хардаг цөөн хэдэн номын нэг юм.
  • Жон Ресинг, Beer Bibo JavaScript Ninja Secrets (goo.gl/xquDkJ) нь JS-ийн дунд шатны хөгжүүлэгчдэд хэрэг болох сайн ном юм. Энэхүү ном нь хөтчийн үр дүнтэй код бичих, үйл явдлыг зохицуулах нарийн ширийн зүйлс болон бусад олон сайхан зүйлсийг нарийвчлан авч үздэг.
  • Дэвид Фланаган JavaScript. Бүрэн гарын авлага» (goo.gl/rZjjk) - Уг ном нь зургаан удаа дахин хэвлэгдсэн бөгөөд хувилбар бүр нь бестселлер юм. Үнэндээ энэ бол хамгийн их юм дэлгэрэнгүй гарын авлага JS хөгжүүлэгч бүр дор хаяж нэг удаа унших ёстой JavaScript дээр.
  • PhantomJS + JSCoverage + QUnit эсвэл хамрах хүрээний тооцоолол бүхий консол JS нэгжийн тестүүд (goo.gl/FyQ38) - нийтлэлийн зохиогч статистик мэдээлэл цуглуулж, тестээр кодын хамрах хувийг тооцоолохын тулд дээрх багц багцуудыг ашиглаж байгааг харуулж байна.
  • Ашигтай PhantomJS ашиглах тохиолдлууд - Энэ хуудсанд PhantomJS-ийн олон тооны байлдааны хэрэглээг харуулав.

Цаг хугацаа байхгүй, тест бичихээс татгалзах хүсэл нь зовж шаналах үед гурван удаа бодоорой. Магадгүй, энэ тохиолдолд тестийг бүрмөсөн орхихын оронд кодын зөвхөн хамгийн төвөгтэй хэсгүүдийг тестээр хамрах нь илүү тохиромжтой байх болно. Сарын дараа таны хөтөлбөр урьд өмнө хэзээ ч байгаагүй том болж магадгүй юм шиг ирээдүйгээ үргэлж бодож байгаарай.

Бүх кодыг туршиж үзээгүй

Би яагаад үндсэн кодыг бичихээсээ өмнө тест хийх талаар бодох хэрэгтэй гэж хэлсэн бэ? Тийм ээ, учир нь эхлээд нэгжийн тестэд хамрагдах ёстой код нь арай өөр загвараар бичигдсэн байдаг. Бүх кодыг туршиж үзэх боломжгүй. Логик ба дүрслэлийг хольсон кодыг хаана ч ойлгохгүй байна. Энд би үргэлж хэдэн энгийн дүрмийг дагаж мөрдөхийг зөвлөж байна:

  • Том функц бичих шаардлагагүй. Функц бүр 100500 боломжит нөхцөл байдлыг бус нэг асуудлыг шийдэх ёстой. Жишээлбэл, сервер рүү өгөгдөл илгээх кодыг тэдгээрийг бэлтгэх үүрэгтэй функцэд өлгөх шаардлагагүй.
  • Арав гаруй мөр кодтой функц нь муу функц байх магадлалтай.
  • Логик ба танилцуулга хэзээ ч хамт байх ёсгүй.

QUnit бол jQuery бүтээгчдийн төрөл жанрын сонгодог бүтээл юм

QUnit нь ялангуяа JavaScript хөгжүүлэгчдийн дунд түгээмэл байдаг. Нэгдүгээрт, үүнийг сайн баримтжуулсан, ашиглахад хялбар, хоёрдугаарт, jQuery зохиогчид хийсэн. Номын сан нь jQuery дээр суурилсан болон эх JavaScript кодыг хоёуланг нь туршиж үзэхэд тохиромжтой.


Татаж авах Хамгийн сүүлийн үеийн хувилбар QUnit та албан ёсны сайтаас авах боломжтой. Номын сан нь нэг JS болон CSS файл хэлбэрээр ирдэг. Та шаардлагатай бүрэлдэхүүн хэсгүүдийг хэрхэн ачаалахаа олж мэдсэн гэж бодъё, хэрэв тийм бол туршилтын тест бичих цаг болжээ. Хол явахгүй, trim() функцийг туршиж үзээрэй.

Туршилтуудыг харуулахын тулд би дараах бүтэцтэй энгийн төслийг бүтээсэн.

  • index.html - туршилтын үр дүнг харуулах үндсэн файл;
  • qunit-1.12.0.js - QUnit номын сангийн файл;
  • example.js - туршилтын кодыг агуулсан файл (манай тохиолдолд trim() функцийн тайлбар);
  • test.js - тест бүхий файл;
  • qunit-1.12.0.css - тест бүхий тайланг зохиох загварууд.

index.html болон test.js файлын агуулгыг Жагсаалт 1 ба 2-т харуулав. Бидний хамгийн их сонирхдог хоёр дахь жагсаалт бол шалгаж буй функцийн мэдэгдэл (trim()) болон ажиллаж байгаа эсэхийг шалгах тест код юм. . trim() функц нь өөрөө хаана ч байрлаж болно гэдгийг анхаарна уу, би зүгээр л бүртгэлд зай хэмнэхийн тулд үүнийг хоёр дахь жагсаалтад оруулсан.
Одоо тестүүдийг өөрсдөө авч үзье. QUnit.js номын сан бидэнд хэд хэдэн аргыг санал болгодог:

  • test() - туршилтын тодорхойлолтод зориулсан боодол;
  • ok() - баталгаажуулалт нь эхний параметрийн үнэнийг шалгах боломжийг танд олгоно. Бидний жишээн дээр би үүнийг бидний тодорхойлсон trim() функц руу залгаж, хүлээн авахыг хүлээж буй утгатай харьцуулдаг. Хэрэв нөхцөл үнэн бол шалгалтыг давсан;
  • equal() - арга нь эхний болон хоёр дахь параметрийн тэгш байдлыг шалгах боломжийг олгодог. Үүнийг даруй анзаараарай энэ аргахатуу бус шалгалт хийдэг тул энэ нь зөвхөн скалярт тохиромжтой;
  • notEqual() нь тэнцүү()-ийн эсрэг юм. Эхний утга нь хоёр дахь утгатай тэнцүү биш бол гүйцэтгэнэ;
  • strictEqual() - тэнцүү()-тэй төстэй нэг ялгаа - энэ нь хатуу шалгалтыг ашигладаг (өөрөөр хэлбэл өгөгдлийн төрлийг мөн шалгадаг);
  • notStrictEqual() - strictEqual()-ын эсрэг;
  • deepEqual() - команд, массив, объектод хэрэглэгддэг рекурсив мэдэгдлийн арга;
  • notDeepEqual() - deepEqual()-ын эсрэг;
  • rises() нь үл хамаарах зүйл үүсгэдэг буцаан дуудлагын функцийг шалгах баталгаа юм.

Хоёр дахь жагсаалтад би эдгээр аргуудыг практикт хэрхэн хэрэгжүүлэх талаар тодорхой харуулсан. Хэрэв та энэ маягтаар туршилтын кейс ажиллуулбал бүх шалгалтыг амжилттай давах болно (харгалзах зургийг үзнэ үү). Туршилтанд тэнцсэн болон тэнцээгүй шалгалтын ялгааг харахын тулд би нэг шалгалтын кодыг бага зэрэг өөрчилсөн. Би алдаатай үр дүнг strictEqual() ашиглан тестийн мөрөнд зориудаар нэмсэн (харгалзах зургийг харна уу).

Жагсаалт 1. index.html файлын агуулга QUnit ашиглан туршиж байна



Энгийн функцуудыг туршиж үзэхэд энэ нь ойлгомжтой юм шиг санагдаж байна. Ямар ч байсан надад нэмж хэлэх зүйл алга. Дараа нь та жинхэнэ кодыг авч, өөрөө тест бичихийг оролдох хэрэгтэй. JavaScript хөгжүүлэгчдэд байнга тулгардаг өөр нэг даалгаврыг харцгаая - асинхрон функцуудыг шалгах. JavaScript кодоор дүүргэсэн програм нь AJAX ашиглан сервер талтай 99% харьцдаг. Энэ кодыг тестгүйгээр орхих нь бас боломжгүй боловч тест бичих нь арай өөр харагдах болно. Жишээ авч үзье:

AsyncTest("myAsyncFunc()", функц () ( setTimeout(функц () ( ok(myAsyncFunc() == үнэн, "Өгөгдөл амжилттай дамжуулагдсан"); start(); ), 500); ));

Энэ жишээнээс өмнөх жишээнүүдийн гол ялгаа нь test()-ийн боодолын оронд asyncTest()-г ашигладаг бөгөөд ингэснээр би асинхрон тестийг сонирхож байгаагаа шууд илэрхийлж байна. Дараа нь би 500 миллисекундын завсарлагаа эхлүүлнэ. Энэ хугацаанд myAsyncFunc() функц нь өгөгдлийг тестийн сервер рүү дамжуулах ёстой бөгөөд хэрэв бүх зүйл хэвийн байвал үнэнийг буцаана. Энд хамгийн сонирхолтой мөч ирж байна. asyncTest()-г дуудах үед гүйцэтгэлийн урсгал зогсох ба тест дууссаны дараа өөрөө эхлэх ёстой. Гүйцэтгэлийн урсгалыг хянахын тулд QUnit нь start() болон stop() аргуудыг өгдөг.


QUnit номын сантай асинхрон функцуудыг турших нь маш энгийн. Миний авч үзэхийг хүссэн сүүлийн жишээ бол олон асинхрон шалгалт хийдэг тест бичих явдал юм. Ийм даалгаварт гарч ирдэг гол асуулт бол гүйцэтгэлийг эхлүүлэх хамгийн оновчтой газар юм. Албан ёсны эмч иймэрхүү зүйлийг ашиглахыг санал болгож байна

AsyncTest("myAsyncFunc()", функц () ( wait(3); // Энд гурван тест хий ok(myAsyncFunc(), "Дэлхийг илүү сайн болгох нь 1"); ok(myAsyncFunc(), "Дэлхийг илүү сайхан болгох 2" "); ok(myAsyncFunc(), "Дэлхийг илүү сайхан газар болгох нь 3"); setTimeout(функц () (эхлэх(); ), 3000); ));

Захиалгат үйлдлийг шалгах

Олон төрлийн интерфейсийг JavaScript дээр бичдэг гэдгийг та үргэлж санаж байх хэрэгтэй. Жишээлбэл, хэрэглэгч пимп дээр дарахад түүний товшилтын хариуд ямар нэгэн зүйл тохиолдох болно. Төсөлд ийм "интерфейс" код асар их байдаг бөгөөд үүнийг бас тестээр хамруулах шаардлагатай. Хэрэглэгчийн товчлуурын даралтыг хэрхэн дуурайж, энэ үйлдэлд зориулж тусдаа тест бичиж болохыг харцгаая. Бидэнд дарагдсан товчлууруудыг бүртгэдэг функц байгаа гэж төсөөлөөд үз дээ. Би түүнд кодыг гурав дахь жагсаалтад өгсөн.

Жагсаалт 3. Товчлуурыг бүртгэх функц KeyLogger(target) ( if (!(This instance of KeyLogger))) ( return new KeyLogger(target); ) this.target = target; this.log = ; var self = this; this.target. off ("keydown").on("keydown", функц(үйл явдал) ( self.log.push(event.keyCode); )); )

Одоо энэ функцийг туршиж үзэцгээе. Юуны өмнө тестийн хэсэгт бид дарагдсан товчлуурыг дуурайх хэрэгтэй. Үүнийг хийх хамгийн хялбар арга бол jQuery номын сан бөгөөд энэ нь танд хэд хэдэн кодын мөрөнд үйл явдал үүсгэх боломжийг олгодог (Жагсаалт 4-ийг үзнэ үү).

Жагсаалт 4. KeyLogger тестийн тестийн код("Түлхүүр бичлэгийн тест", функц () ( var үйл явдал, $doc = $(баримт бичиг), keys = KeyLogger($doc); event = $.Event("keydown"); үйл явдал .keyCode = 9; $doc.trigger(үйл явдал); тэнцүү(keys.log.length, 1, "Түлхүүр бүртгэгдсэн"); тэнцүү(keys.log, 9, "Түлхүүрийг 9 кодоор дарсан"); ));

Туршилтын жагсаалтын хамгийн эхэнд би товчлуур даралтыг дуурайх үйл явдал бэлддэг - "keydown". Бид Tab товчийг дарах сонирхолтой байх болно (код 9). Дараа нь trigger() аргыг ашиглан бэлтгэсэн үйл явдлыг илгээж, үүний дараа би тест хийж эхлэх боломжтой. Эхлээд бид том дүр зургийг шалгана уу - товчлуур дарагдсан эсэх, дараа нь түүний код.

Туршилт нэрийн дор DOM

Qunit.js нь танд захиалгат үйлдлүүдийг шалгах боломжийг олгодог тул DOM-д зориулсан тест бичих нь бас асуудал биш байх ёстой. Энэ бол үнэн бөгөөд доорх жишээ миний үгийг батлах болно. Би энэ талаар тайлбар хийхгүй, зүгээр л кодыг харвал бүх зүйл тодорхой болно.

Тест("Шинэ div элемент нэмэх", функц () ( var $fixture = $("#qunit-fixture"); $fixture.append("

Энэ бол шинэ div
"); тэнцүү($("div", $fixture).length, 1, "Шинэ div амжилттай нэмэгдсэн!"); ));

PhantomJS - консолоос туршилтуудыг ажиллуулна


QUnit.js номын санг ашиглан тест бичих нь тохиромжтой бөгөөд энгийн боловч эрт орой хэзээ нэгэн цагт эхлүүлэх, турших, үр дүнг цуглуулах ажлыг автоматжуулах хүсэл танд ирэх болно. Жишээлбэл, би энэ бизнест зориулсан DigitalOcean-д тусдаа виртуал машинтай бөгөөд би үүнийг зөвхөн консол ашиглан удирдах боломжтой.

PhantomJS төсөл энэ асуудлыг хангалттай дэгжин шийддэг. Энэ нь нэгж тест бичих өөр нэг хүрээ биш, харин WebKit хөдөлгүүрийн бүрэн хэмжээний консол хувилбар юм. Энгийнээр хэлэхэд энэ програм нь хөтөчийг дуурайдаг. PhantomJS-ийн тусламжтайгаар энэ нь зөвхөн туршилтын гүйцэтгэлийн баталгаажуулалтыг автоматжуулах төдийгүй эрт орой хэзээ нэгэн цагт хөгжүүлэгчийн өмнө тулгардаг олон даалгаврыг шийдвэрлэх явдал юм: хуудсыг файлд буулгах үр дүнг авах (PNG, JPG), сүлжээний хяналтын функцууд (ачааллын хурд, ерөнхий гүйцэтгэл гэх мэт), хэрэглэгчийн үйлдлийг эмуляци хийх гэх мэт. Би залхуурахгүй байхыг зөвлөж байна, энэ төслийн албан ёсны баримт бичгийг уншина уу, та өөртөө сонирхолтой зүйлийг олох нь гарцаагүй.

PhantomJS-ийг өөр өөр платформ дээр (*nix, OS X, Windows) хөрвүүлж болно. Хэрэв та Windows дээр бүх зүйлийг хөгжүүлбэл ямар ч асуудал гарахгүй - хоёртын файлуудыг нэгтгэж, үргэлжлүүлээрэй. Хэрэв танд NVIDIA хоёр видео адаптер суулгасан бол эхлүүлэхэд бага зэргийн бэрхшээл гарч болзошгүй. Энэ тохиолдолд та хажуугийн мөрөнд тайлбарласан хакеруудыг ашиглах хэрэгтэй болно.


PhantomJS-тэй практик дээр танилцахыг хичээцгээе. Сүүлийн хэсэгт бэлтгэсэн тестүүдийг PhantomJS-ээр дамжуулан ажиллуулж, консол дээр гүйцэтгэлийн үр дүнг авахын тулд бидэнд тусгай дуудагч скрипт хэрэгтэй - run-qunit.js . Консолыг нээж (би Windows дээр ажилладаг тул cmd ашигладаг) командыг форматаар бичнэ үү

phantom.exe<путь к run-qunit.js> <путь к странице с тестами>

Миний хувьд эхлүүлэх тушаал дараах байдалтай болсон.

E:\soft\phantomjs>phantomjs.exe E:\temp\testjsforx\qunit\run-qunit.js файл:///E: /temp/testjsforx/qunit/index.html

Үүнийг хэрэгжүүлсний үр дүн:

Туршилтууд 2592 миллисекундэд дууссан. 9-ийн 9 баталгаа нь тэнцсэн, 0 нь амжилтгүй болсон.

Бүх шалгалтыг давсан

Кодыг тестээр хамруулах нь гарцаагүй бөгөөд ямар хэмжээний программ үүсгэх нь хамаагүй. Дахин нэг удаа би танд сануулж байна: тэр ч байтугай хамгийн жижиг програмууд ч гэсэн дэмжигдэж, функцээр гүйцэтгэгдэх ёстой болхи мангас болж хувирдаг. Сайн шалгагдсан код нь амжилт, чанарын түлхүүр юм. Тийм ээ, автоматжуулсан тест хийхэд тохиромжтой код бичиж эхлэх нь тийм ч амар биш, гэхдээ надад итгээрэй, энэ бүх зовлон ирээдүйд үр дүнгээ өгөхөөс ч илүү байх болно. Өнөөдөр энэ л байна, амжилт хүсье!

Windows дээрх PhantomJS-тэй холбоотой асуудлууд

Ийм зүйл тохиолдсон, гэхдээ би энэ нийтлэлийн бүх жишээг Линукс дээр биш, харин хуучин Windows 7 дээр туршиж үзсэн. PhantomJS хэд хэдэн видео адаптер ашигладаг системүүд дээр ажиллахад зарим асуудалтай байдаг. Миний зөөврийн компьютер дээр нэгдсэн видео чипээс гадна NVIDIA бас зогсдог бөгөөд үүнээс болж PhantomJS phantom.exit () тушаалд хариу өгөхөөс эрс татгалзсан. Үүний үр дүнд скриптийг гүйцэтгэсний дараа PhantomJS үйл явц нь ажлаа дуусгаагүй бөгөөд санах ойд хадгалагдсан хэвээр байв. Терминалын цонх мөн гарах командуудад хариу өгөхөө больсон ( тусалсангүй).

Хэрэв танд үүнтэй төстэй асуудал тулгараад байгаа бөгөөд Windows дээр PhantomJS ашиглахаар төлөвлөж байгаа бол дараах хакердалтыг хийхэд бэлэн байгаарай. нээлттэй самбар NVIDIA удирдлага. Модноос "3D тохиргоо" гэсэн зүйлийг ол. Баруун талд "Давуулагдсан график адаптер". Анхны утгаараа. түүний утгыг автоматаар сонгох гэж тохируулсан. Бид үүнийг "Өндөр гүйцэтгэлтэй NVIDIA процессор" эсвэл "Нэгдсэн график техник хангамж" болгон өөрчлөх хэрэгтэй. Энэхүү энгийн заль мэхийн дараа PhantomJS дуулгавартай хандаж эхлэв.

Үр дүнтэй туршилтын тохиолдлуудыг бий болгох нь чухал ач холбогдолтой байж болно томоохон төслүүд, янз бүрийн шалтгааны улмаас програмын хэсгүүдийн үйлдэл өөрчлөгдөж болзошгүй тохиолдолд. Магадгүй хамгийн нийтлэг асуудал бол хөгжүүлэгчдийн том бүлэг ижил эсвэл холбогдох модулиуд дээр ажиллаж байх явдал юм. Энэ нь бусад програмистуудын бичсэн функцүүдийн төлөв байдалд төлөвлөөгүй өөрчлөлтөд хүргэж болзошгүй юм. Эсвэл хатуу хугацаанд ажиллах нь програмын чухал хэсгүүдэд санамсаргүйгээр өөрчлөлт оруулахад хүргэдэг.

Вэб програмыг турших нь ихэвчлэн хуудасны элементүүдийн харааны үнэлгээ, үйл ажиллагааны гүйцэтгэлийн эмпирик үнэлгээнээс бүрддэг. Өөрөөр хэлбэл, хэсгүүдээр дамжих, динамик элементүүд дээр үйлдэл хийх.

Цаг хугацаа өнгөрөхөд төсөл шинэ зүйлээр дүүрдэг функциональ байдал, энэ нь түүний ажлыг шалгах үйл явцыг уртасгаж, хүндрүүлдэг. Нэгжийн туршилтыг автоматжуулалтад ашигладаг.

Туршилтын хувилбаруудыг бий болгох 2 арга байдаг:

  • цагаан хайрцагтуршилт– тест бичих нь функцийг хэрэгжүүлэхэд суурилдаг. Тэдгээр. Бид системийн модулиудын ажил дээр суурилсан алгоритмуудыг шалгадаг. Энэ арга нь системийн бүхэлдээ зөв ажиллах баталгаа болохгүй.
  • хар хайрцагтуршилт– скрипт нь техникийн үзүүлэлтүүд болон системийн шаардлагад суурилдаг. Ингэснээр та бүх програмын үр дүнгийн үнэн зөвийг шалгаж болно, гэхдээ энэ арга нь жижиг, ховор алдаануудыг олж авах боломжийг танд олгодоггүй.

Юуг турших вэ

Хэрэгжүүлсэн функц бүрээ туршиж үзэх нь зөв санаа юм шиг санагдаж магадгүй. Энэ нь бүхэлдээ үнэн биш юм. Тест бичих нь хөгжүүлэгчийн цаг хугацаа шаарддаг тул програм үүсгэх үйл явцыг оновчтой болгохын тулд зөвхөн нарийн төвөгтэй, чухал эсвэл бусад системийн модулиудын үр дүнгээс хамаарах функцүүдэд тест бэлтгэх нь зүйтэй. Алдаа агуулж болзошгүй хоёрдмол утгатай логикоор тестүүдийг хамрах. Ирээдүйд оновчтой болгохоор төлөвлөж буй кодын хэсгүүдэд тест хийх нь зүйтэй бөгөөд ингэснээр оновчлолын дараа тэдгээрийг зөв гүйцэтгэсэн эсэхийг шалгах боломжтой болно.

Ерөнхийдөө туршилтын зардлыг боловсруулах цаг хугацааны нягтралтай харьцуулах нь маш чухал юм. Мэдээжийн хэрэг, хэрэв та цаг хугацаагаар хязгаарлагдахгүй бол функц бүрийг тестээр хамруулах боломжтой. Гэхдээ дүрмээр бол хөгжүүлэлт нь цаг хугацааны хатуу дарамтанд явагддаг тул шинжээч эсвэл туршлагатай хөгжүүлэгчийн үүрэг бол хаана туршилт хийх шаардлагатайг ойлгох явдал юм. Үүнээс гадна тест бичих нь төслийн өртөгийг нэмэгдүүлдэг.

Тиймээс бид нэгжийн туршилтыг ашиглах үндэслэлтэй 3 тохиолдлыг томъёолж болно.

1) Хэрэв туршилтууд нь ердийн хайлтаас илүү хурдан алдааг тодорхойлох боломжтой бол.

2) Дибаг хийх хугацааг багасгах

3) Байнга өөрчлөгддөг кодыг шалгах боломжийг танд олгоно.

Frontend-ийн 3 үндсэн бүрэлдэхүүн хэсгээс (HTML, CSS, JavaScript) зөвхөн JavaScript кодыг шалгах шаардлагатай байж магадгүй юм. CSS нь зөвхөн хөгжүүлэгч/шалгагч/үйлчлүүлэгч харах үед л нүдээр баталгааждаг GUIянз бүрийн хөтөч дээр. HTML - тэмдэглэгээг ижил аргаар шалгана.

Хэрхэн турших вэ

Туршилтын хувилбарыг зохиохдоо та дараах зарчмуудыг баримтлах хэрэгтэй.

  • Таны тестүүд аль болох энгийн байх ёстой.Дараа нь таны давтахыг оролдож буй алдаа нь түүний хэрэгжилтийн үр дүнд нөлөөлөх магадлал өндөр байх болно.
  • Том модулиудын туршилтуудыг задлах.Алдааны тодорхой байршлыг олохын тулд Grove.
  • Туршилтыг бие даасан болгох.Нэг туршилтын үр дүн ямар ч тохиолдолд нөгөөгийн үр дүнгээс хамаарах ёсгүй.
  • Туршилтын үр дүн бүрэн давтагдах боломжтой, хүлээгдэж буй байх ёстой.Туршилтыг дахин хийх бүрт үр дүн нь сүүлчийн удаатай ижил байх ёстой.
  • Аппликешныг гүйцэтгэхэд алдаа гарсан тохиолдолд туршилтын скрипт үүсгэх шаардлагатай.Ингэснээр та алдаа үнэхээр засагдсан бөгөөд хэрэглэгчдэд харагдахгүй гэдэгт итгэлтэй байх болно.

Хэрхэн турших вэ

Js кодыг шалгах хэд хэдэн номын сан байдаг. Магадгүй хамгийн түгээмэл нь QUnit юм. Энэ номын санг ашиглан нэгжийн туршилт явуулахын тулд бид "sandbox" үүсгэх хэрэгтэй - тестийн номын сан, шалгах код, тестүүд хоорондоо холбогдсон энгийн html хуудас.

Туршилтын функцууд:

(function() ( window.stepen = function(int) ( var үр дүн = 2; for (var i = 1; i)< int; i ++) { result = result * 2; } return result; } window.returnFunc = function() { return "ok"; } })();

Туршилтын жагсаалт:

Test("stepen()", function() ( тэнцүү(stepen(2), 4, "2^2 - тэнцүү арга"); ok(stepen(3) === 8, "2^3 - ok арга" ); deepEqual(stepen(5), 32, "2^5 - deepEqual method"); )); asyncTest("returnFunc()", function() ( setTimeout(функц() ( тэнцүү(returnFunc(), "ok", "Async Func Test"); start(); ), 1000); ));

Таны харж байгаагаар QUnit нь кодын гүйцэтгэлийн үр дүнг хүлээгдэж буй үр дүнтэй харьцуулах 3 функцийг дэмждэг.

  • болж байна уу()- буцах үр дүн = үнэн бол туршилтыг амжилттай гэж үзнэ
  • тэнцүү()- хүлээгдэж буй үр дүнг харьцуулна
  • гүнзгий тэнцүү()- үр дүнг хүлээгдэж буй үр дүнтэй харьцуулж, түүний төрлийг шалгана

Гүйцэтгэлийн үр дүн:

Таны харж байгаагаар QUnit номын сан нь кодыг нэг дор хэд хэдэн хөтөч дээр туршиж үздэг.

Нэгжийн тест хийх өөр хэд хэдэн номын сан байдаг. Гэсэн хэдий ч, тэдгээрт тестийн скрипт үүсгэх ойлголт нь адилхан тул нэгийг нь авч үзсэний дараа нөгөө рүү шилжих нь танд хэцүү биш байх болно.

Санах нь чухал

Орчин үеийн js кодын онцлог нь түүний гүйцэтгэлийн асинхрон байдал юм. Туршилтын номын сангууд ихэвчлэн асинхрон тест хийх чадвартай байдаг. Жишээлбэл, хэрэв та backend руу авах хүсэлт илгээж, хариуг нь буцаадаг функцийг турших гэж байгаа бол тест хийхдээ stop() функцээр урсгалыг зогсоох хэрэгтэй болно. шалгаж байгаа функцийг сонгоод дараа нь setTimeout()-д "үүнийг ороож" start() аргаар хэлхээг дахин эхлүүлнэ үү. Тэдгээр. Функцийн гүйцэтгэлийг дуусгах тодорхой хугацааны интервалыг тохируулах шаардлагатай. Энэ сегментийн үргэлжлэх хугацааг анхааралтай сонгох хэрэгтэй, .k. Нэг талаас, аргын урт хугацааны ажил нь програмын үйл ажиллагааны тодорхой хэрэгжилтийн шинж чанар эсвэл бүр хэрэгцээ, эсвэл буруу үйлдэл байж болно.

Суурь програмуудыг турших

Backbone.js ашиглан бичсэн програмуудыг турших жишээний хувьд бид -д тайлбарласан төслийг ашиглах болно.

Та нэгжийн тестээр шалгаж болно:

  • Загвар, хянагчийг бий болгох зөв байдал
  • Загвар дээрх өгөгдлийн зөв байдал
  • Хяналтын аргуудын гүйцэтгэл (үүнд тэд үр дүнг буцаах ёстой)
  • Ачаалах амжилтыг харах

Туршилтын код:

Тест("Backbone.js", function() ( за(жишээ, "Нэрийн зай шалгах"); ok(sample.routers.app, "Чиллүүлэгч шалгах"); ok(sample.core.pageManager.open("чат") , "Хуудас нээх тест (Хянагч аргын дуудлага)") ok(sample.core.state, "Загвар шалгах"); тэнцүү(sample.core.state.get("content"), "sintel", "Загвар өгөгдөл авах тест "); stop(); ok(функц() ( $.ajax(( url: "app/templates/about.tpl", dataType: "текст" )). хийсэн (функц(өгөгдөл) ( self.$el. html(өгөгдөл); өгөгдөл буцаах; )) ), "Загвар ачааллыг шалгах"); setTimeout(функц() (эхлэх(); ), 1000); ));

Туршилтын алдаатай ажиллах үр дүн:

Туршилтын автоматжуулалт

Ерөнхийдөө програмыг ашиглах нь эрчимтэй хөгжүүлэлтийн явцад байнга хийх шаардлагатай ажил юм. Тиймээс энэ үйлдлийг ихэвчлэн автоматжуулдаг. Бид ажилдаа тасралтгүй нэгтгэх хэрэгсэл болох Jenkins-ийг ашигладаг. Энэхүү санаа нь Женкинсээр дамжуулан байршуулалтыг автоматжуулсан туршилтуудтай хослуулах явдал юм.

QUnit тестүүд нь хөтөч дээр ажилладаг. Хөтөчийг дуурайдаг Phantomjs програм хангамж нь бидэнд энэ функцийг даван туулахад тусална. Phantomjs-ийн хөгжүүлэгчид QUnit тестийг гүйцэтгэх скриптийг аль хэдийн өгсөн боловч зөв ажиллахын тулд үүнийг бага зэрэг өөрчлөх шаардлагатай болсон.

/** * Туршилтын нөхцөл үнэн болох эсвэл хугацаа дуусах хүртэл хүлээнэ үү. * Серверийн хариу үйлдэл дээр * хүлээх эсвэл ui өөрчлөлт (fadeIn гэх мэт) гарахад тустай. * * @param testFx javascript нөхцөл нь логик утгаар үнэлэгддэг, * үүнийг мөр болгон дамжуулж болно (жишээ нь: "1 == 1" эсвэл * "$("#bar").is(":visible")" эсвэл *-ийг буцаан дуудлагын функц болгон ашиглах. * @param ontestFx нөхцөл биелсэн үед юу хийхэд бэлэн, * үүнийг мөр болгон дамжуулж болно (жишээ нь: "1 == 1" эсвэл * "$("#bar"). (":visible")" эсвэл * буцаан дуудах функц болгон. * @param timeOutMillis хүлээх хамгийн их хугацаа. Хэрэв * заагаагүй бол 3 сек хэрэглэнэ. */ function waitFor(testFx, onReady, timeOutMillis) ( var maxtimeOutMillis = timeOutMillis - timeOutMillis: 3001, //< Default Max Timout is 3s start = new Date().getTime(), condition = false, interval = setInterval(function() { if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) { // If not time-out yet and condition not yet fulfilled condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code } else { if(!condition) { // If condition still not fulfilled // (timeout but condition is "false") console.log(""waitFor()" timeout"); phantom.exit(1); } else { // Condition fulfilled (timeout and/or condition is //"true") console.log(""waitFor()" finished in " + (new Date().getTime() - start) + "ms."); typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it"s supposed to do once the // condition is fulfilled clearInterval(interval); //< Stop this interval } } }, 100); // repeat check every 250ms }; }; if (phantom.args.length === 0 || phantom.args.length >2) console.log("Хэрэглээ: run-qunit.js URL"); phantom.exit(); ) var хуудас = шинэ вэб хуудас(); // "console.log()" дуудлагыг Хуудас доторх // контекстээс үндсэн Phantom контекст (жишээ нь одоогийн "энэ") рүү чиглүүлэх page.onConsoleMessage = function(msg) ( console.log(msg); ); page.open(phantom.args, function(status)( if (status !== "амжилт") ( console.log("Сүлжээнд нэвтрэх боломжгүй"); phantom.exit(); ) else ( waitFor(function()) ( page.evaluate(function()( var el = document.getElementById("qunit-testresult"); if (el && el.innerText.match("completed")) ( true буцаана; ) худал буцаана; )); ), function()( var failedNum = page.evaluate(function()( var el = document.getElementById("qunit-testresult"); console.log(el.innerText); оролдоно уу ( буцаах document.getElementsByClassName("бүтэлгүйт" ).innerHTML.length; ) catch (e) ( return 0; ) return 10000; )); phantom.exit((parseInt(failedNum, 10) > 0) ? 1: 0); )); ) ));

Үр дүнгийн мессежийг консол дээр харуулахын тулд тестийн скриптэд бүртгэлийн функцийг нэмэх хэрэгтэй.

Одоо сайт нь дараах сэдвүүдийн мэдлэгийг шалгах боломжтой. HTML, css, JavaScript, PHP, SQL.

Туршилт бүр нь дараахь зүйлсээс бүрдэнэ 10тодорхой сэдвээр асуултууд. Асуулт бүрт би таны мэдлэгийн түвшинг аль болох нарийвчлан шалгахын тулд тухайн хэлний хэрэглээний хамгийн олон талбарыг хөндөхийг хичээсэн.

Мэдээжийн хэрэг, бүх зүйл тестүүд үнэ төлбөргүй байдагмөн хэн ч туулж болно.

Туршилтын журам:

  1. Холбоосыг дагаж " Туршилтыг эхлүүлэх"харгалзах тестийн.
  2. Сонгох замаар асуултанд хариулна уу цор ганцзөв сонголт.
  3. Туршилт дууссаны дараа та харах болно таны оноо, алдааны тоо, ба асуулт бүрийн дүн шинжилгээтуршилтаас.

Анхаар!Өмнөх асуулт руу буцах нь ажиллахгүй тул хариулахаасаа өмнө сайтар бодож үзээрэй.

Туршилтууд одоогоор бэлэн байна

  1. HTML

    • Нийт тэнцсэн шалгалт: 75424 хүн
    • Дундаж оноо: 5-аас 2.83оноо.

    Суурь мэдлэгийн тест HTML. Та үндсэн мэдлэгтэй байх хэрэгтэй HTML шошгоболон тэдгээрийн зохистой хэрэглээ. Мөн стандартын онцлогийг ойлгох шаардлагатай XHTML 1.1.

  2. css

    • Нийт тэнцсэн шалгалт: 32828 хүн
    • Дундаж оноо: 5-аас 3.37оноо.

    Тест нь үндсэн мэдлэгийг шалгадаг css. Туршилтыг амжилттай давахын тулд та сонгогчдын үндсэн төрлийг (тэдгээрийн синтакс) мэдэж байх ёстой, үндсэн шинж чанар, тэдгээрийн боломжит утгыг мэддэг байх ёстой, мөн хамгийн алдартай псевдо-элементүүдийн зорилгыг мэддэг байх ёстой.

  3. JavaScript

    • Нийт тэнцсэн шалгалт: 24845 хүн
    • Дундаж оноо: 5-аас 3.31оноо.

    Энэхүү шалгалт нь таны JavaScript хэлний мэдлэгийг шалгадаг. Туршилтын асуултууд нь хэрэглээний янз бүрийн чиглэлийг хамардаг өгөгдсөн хэл. "Жижиг" нюансуудыг ойлгох талаар маш олон асуулт гарч ирдэг. Үгүй бол та үндсэн зүйлсийг мэдэх шаардлагатай: хувьсагчтай ажиллах, JavaScript-ийн үндсэн функцууд, операторын тэргүүлэх чиглэл гэх мэт.

  4. PHP

    • Нийт тэнцсэн шалгалт: 33239 хүн
    • Дундаж оноо: 5-аас 3.03оноо.

    Энэхүү шалгалт нь таны PHP хэлний мэдлэгийг шалгадаг. Та PHP-ийн үндсэн бүтэц, хувьсагчтай ажиллах, сесс, дахин чиглүүлэлтийн хэрэгжилт болон бусад стандарт зүйлсийг мэдэх шаардлагатай.
    Итгэл үнэмшилтэй хүсэлт:Тест нь "Скриптээс юу гарах вэ?" гэх мэт олон асуултуудыг агуулна. Том хүсэлт, битгий хуулж аваад шалгаарай. Өөртөө үнэнч бай.

  5. SQL

    • Нийт тэнцсэн шалгалт: 18014 хүн
    • Дундаж оноо: 5-аас 3.28оноо.

    Энэ шалгалт нь таны хэлний мэдлэгийг шалгадаг SQL асуулга. Асуултууд нь ямар ч гүнзгийрүүлэхгүйгээр зөвхөн энэ хэлний хамгийн энгийн мэдлэгийг хамарна. Танд хамгийн энгийн SQL асуулгын талаархи мэдлэг, түүнчлэн тэдгээрийг чадварлаг ашиглах шаардлагатай болно.

Node.js дээрх энгийн тооны машин програмын жишээн дээр. Бид Mocha framework ашиглан тест хийх болно.

Манай програм юу хийх ёстой вэ:

  • Дурын хоёр тоог нэмэх, хасах, хуваах, үржүүлэх;
  • Хэрэв дугаараас өөр зүйл оруулсан бол анхааруулга үзүүлж, гарах;
  • Мөн эцсийн хэрэглэгч програмыг ашиглах боломжтой командын мөрийн интерфейс байх ёстой.

Бидэнд хэрэгтэй зүйл:

  • Node.js болон npm
  • JavaScript-ийн мэдлэг: синтакс ба кодын бүтэц, өгөгдлийн төрөл, математик үйлдлүүд ба нөхцөлт илэрхийллүүд.

Зорилгоо тодорхой болгосноор та туршилт, хөгжүүлэлтийн орчинг бүрдүүлж эхлэх боломжтой.

Байгаль орчныг тохируулах

Бид Node.js-г ашиглаж байгаа тул файлууд болон хамаарлын локал орчныг бий болгох хэрэгтэй.

Үүсгэх шинэ хавтас тооцоолол. Тушаалын мөрөнд энэ лавлах руу шилжиж, npm init-тэй шинэ төсөл үүсгэн үүсгэнэ үү шинэ файл багц.jsonМанай хөтөлбөрийн хувьд.

Та багцын нэр, хувилбар, тайлбар болон багцын талаарх бусад мэдээллийг оруулахыг хүсэх болно. Та нэр оруулж болно calc.jsмөн үргэлжлүүлэн дарна уу Оруулна ууөгөгдмөл утгыг оноох. Тест команд руу орохдоо mocha гэж бичнэ үү - энэ бол бидний ашиглах тестийн хүрээ юм:

туршилтын тушаал: mocha

Бүх мэдээллийг оруулсны дараа скрипт нь файл үүсгэх болно багц.json, энэ нь иймэрхүү харагдаж байна:

( "нэр": "calc.js", "хувилбар": "1.0.0", "тайлбар": "Node.js дахь энгийн тооцоолуур", "main": "index.js", "скрипт": ( " тест": "mocha" ), "зохиогч": "", "лиценз": "ISC" )

Энэ алхамын сүүлчийн алхам бол Mocha-г суулгах явдал юм. Суулгахын тулд дараах тушаалыг оруулна уу:

npm install --save-dev mocha

Энэ командыг хэрэглэсний дараа хавтас гарч ирнэ зангилааны_модуль, файл package-lock.json, мөн файлд багц.jsonдараах мөрүүд гарч ирнэ:

"devDependencies": ( "mocha": "^4.0.1" )

Файл үүсгэх test.js. Бид Node.js-д суурилуулсан модулийг ашиглах болно батлахүнэн, үнэн эсэхийг шалгах. Энэ нь үнэн тул шалгалтыг давах ёстой:

Const assert = require("assert"); it("үнэн буцах ёстой", () => ( assert.equal(үнэн, үнэн); ));

Одоо командын мөрөөс тестийг ажиллуулна уу:

$ npm тест > mocha ✓ нь 1 дамжуулалт (8мс) үнэнийг буцаана

Туршилт санаснаар болсон тул орчны тохиргоо хийгдсэн. -аас хасах test.jsмөрөөс бусад бүх зүйл const assert = require("assert"); .

Бид файлыг ашиглах болно test.jsпрограм боловсруулах үйл явцын туршид. Өөр хоёр файл үүсгэ: operations.jsарифметик болон баталгаажуулалтын функцүүдийн хувьд болон calc.jsпрограмын хувьд. Бид маш олон файл ашигладаг тул тэдгээр нь хэтэрхий урт, төвөгтэй болдоггүй. Энд бидний одоогийн файлуудын жагсаалт байна:

  • calc.js;
  • зангилааны_модуль;
  • operations.js;
  • package-lock.json;
  • багц.json;
  • test.js;

Эхнийхийг нь нэмье жинхэнэ тестбидний хэрэглээний хувьд.

Математикийн үйлдлүүдийг нэмэх

Юуны өмнө манай програм дурын хоёр тоог нэмэх, хасах, хуваах, үржүүлэх чадвартай байх ёстой. Тиймээс эдгээр үйлдлүүдийн хувьд бид тусдаа функц үүсгэх ёстой.

Нэмэлтээс эхэлье. Бид хоёр тооны хүлээгдэж буй нийлбэрийг өвөрмөц байдлаар олж авах тест бичих болно. Доорх кодонд бид add() 4 функцийг ашиглан 1 ба 3-ын нийлбэр тэнцүү эсэхийг шалгана.

Const assert = require("assert"); it("1 ба 3-ын нийлбэрийг зөв олно", () => ( assert.equal(add(1, 3), 4); ));

Туршилтыг npm test тушаалаар ажиллуулсны дараа бид дараахь зүйлийг харж байна.

> mocha 0 дамжуулалт (9ms) 1 амжилтгүй 1) 1 ба 3-ын нийлбэрийг зөв олно: ReferenceError: Add нь Context.it (test.js:5:16) дээр тодорхойлогдоогүй байна npm ERR! туршилт амжилтгүй болсон. Дэлгэрэнгүй мэдээллийг дээрээс харна уу.

ReferenceError: add тодорхойлогдоогүй байгаа тул тест амжилтгүй боллоо. Бид хараахан байхгүй байгаа add() функцийг туршиж байгаа тул энэ үр дүн нэлээд хүлээгдэж байна.

Файлд add() функц үүсгэцгээе operations.js:

Const add = (x, y) => (+x) + (+y);

Энэ функц нь x ба y гэсэн хоёр аргументыг авч тэдгээрийн нийлбэрийг буцаана. Бид x + y-ийн оронд (+x) + (+y) гэж бичдэгийг та анзаарсан байх. Оролт нь мөр байх тохиолдолд аргументыг тоо руу шилжүүлэхийн тулд бид нэгдмэл операторыг ашигладаг.

Тэмдэглэл Энэ нь ES6-н нэмсэн сум функц болон далд өгөөжийг ашигладаг.

Бид Node.js-г ашиглаж, кодыг олон файл болгон хувааж байгаа тул кодыг экспортлохын тулд module.exports ашиглах хэрэгтэй:

Const add = (x, y) => (+x) + (+y); module.exports = (нэмэх)

Файлын эхэнд test.jsбид код импортолдог operations.js require()-тай. Үйлдлийн хувьсагчаар дамжуулан функцийг ашиглаж байгаа тул бид add()-г operations.add() болгож өөрчлөх хэрэгтэй:

Const үйлдэл = шаардлагатай("./operations.js"); const assert = шаардах("батлах"); it("1 ба 3-ын нийлбэрийг зөв олдог", () => ( assert.equal(operations.add(1, 3), 4); ));

Туршилтыг явуулцгаая:

$ npm тест > mocha ✓ 1 ба 3 1 дамжуулалтын нийлбэрийг зөв олдог (8мс)

Бид одоо ажиллаж байгаа функцтэй бөгөөд шалгалтууд амжилттай болж байна. Бусад үйлдлүүдийн функцүүд ижил төстэй байдлаар ажилладаг тул subtract() , multiply() , хуваах() тестүүдийг нэмэхэд хялбар байдаг:

It("1 ба 3-ын нийлбэрийг зөв олно", () => ( assert.equal(operations.add(1, 3), 4); )); it("-1 ба -1-ийн нийлбэрийг зөв олдог", () => ( assert.equal(operations.add(-1, -1), -2); )); it("33 ба 3-ын зөрүүг зөв олно", () => ( assert.equal(operations.subtract(33, 3), 30); )); it("12 ба 12-ын үржвэрийг зөв олно", () => ( assert.equal(operations.multiply(12, 12), 144); )); it("10 ба 2-ын хуваалтыг зөв олдог", () => ( assert.equal(operations.divide(10, 2), 5); ));

Одоо бүх функцийг үүсгэж экспортолцгооё test.js:

Const add = (x, y) => (+x) + (+y); const хасах = (x, y) => (+x) - (+y); const үржүүлэх = (x, y) => (+x) * (+y); const хуваах = (x, y) => (+x) / (+y); module.exports = (нэмэх, хасах, үржүүлэх, хуваах, )

Мөн шинэ туршилтуудыг ажиллуул:

$ npm тест > mocha ✓ 1 ба 3-ын нийлбэрийг зөв олно ✓ -1 ба -1-ийн нийлбэрийг зөв олно ✓ 33 ба 3-ын зөрүүг зөв олно ✓ 12 ба 12-ын үржвэрийг зөв олно ✓ 10-ын үржвэрийг зөв олно болон 2 5 дамжуулалт (8мс)

Бүх туршилтууд амжилттай давсан тул одоо манай програмын үндсэн функцууд зөв ажиллах болно гэдэгт итгэлтэй байна. Одоо бид нэмэлт баталгаажуулалт хийх боломжтой.

Баталгаажуулалт нэмж байна

Одоогийн байдлаар хэрэглэгч дугаараа оруулаад хүссэн үйлдлийг сонгоход бүх зүйл хэвийн ажиллаж байна. Гэсэн хэдий ч, хэрэв та тоо болон мөрийн нийлбэрийг олохыг оролдвол юу болох вэ? Аппликейшн нь үйлдлийг гүйцэтгэхийг оролдох боловч тоо хүлээж байгаа тул NaN буцаана.

Зарим хачирхалтай утгыг буцаахын оронд хоёр дахь ажлыг хийх цаг болжээ - хэрэв оролтын аргумент нь тоо биш бол програмыг анхааруулга харуулж, гарах болно.

Эхлээд та оролт нь тоо эсэхийг шалгах функц бичих хэрэгтэй. Програм нь зөвхөн тоонуудтай ажиллах ёстой тул бид гурван нөхцөл байдлыг шийдвэрлэх болно:

  1. Хоёр оролт нь тоо юм.
  2. Нэг оролт нь тоо, нөгөө нь тэмдэгт мөр юм.
  3. Хоёр оролт нь мөр юм.
it("тооны оронд мөр ашиглах үед алдаа гарсан тухай мэдээлдэг", () => ( assert.equal(operations.validateNumbers("sammy", 5), false); )); it("тооны оронд хоёр мөр ашиглах үед алдаа гарсан тухай мэдээлдэг", () => ( assert.equal(operations.validateNumbers("sammy", "sammy"), false); )); it("хоёр тоо ашиглах үед амжилт", () => ( assert.equal(operations.validateNumbers(5, 5), үнэн); ));

validateNumbers() функц нь хоёр параметрийг баталгаажуулна. isNaN() функц нь параметр нь тоо биш эсэхийг шалгах ба хэрэв үгүй ​​бол худал утгыг буцаана. Үгүй бол энэ нь үнэнийг буцаадаг бөгөөд энэ нь амжилттай баталгаажуулалт гэсэн үг юм.

Const validateNumbers = (x, y) => (хэрэв (isNaN(x) && isNaN(y)) ( худал буцаана; ) үнэнийг буцаана; )

Файлын төгсгөлд module.exports руу validateNumbers нэмэхээ бүү мартаарай. Одоо та шинэ туршилтуудыг ажиллуулж болно:

$ npm тест 1) тоонуудын оронд мөр ашиглах үед гарсан алдааг мэдээлнэ ✓ тоонуудын оронд хоёр мөр ашиглахад алдаа гарна ✓ хоёр тоог ашиглахад амжилттай 7 дамжуулалт (12 мс) 1 амжилтгүй болно 1) оронд нь мөр ашиглахад алдаа гарна. тооны: Баталгаажуулалтын алдаа: үнэн == худал + хүлээгдэж буй - бодит - үнэн + худал

Хоёр шалгалт тэнцсэн ч нэг нь тэнцээгүй. Хоёр дугаарын тест амжилттай болж, хоёр утсан дээрх шалгалт амжилттай болсон. Мөр болон тооны оролтыг шалгах талаар юу хэлж болохгүй.

Хэрэв бид функцээ дахин харвал бид үүнийг харж болно хоёулааФункц худал буцаахын тулд параметрүүд нь NaN байх ёстой. Хэрэв бид ядаж нэг параметр нь NaN байхад ижил үр дүнд хүрэхийг хүсвэл &&-г ||-ээр солих хэрэгтэй. :

Const validateNumbers = (x, y) => ( хэрэв (isNaN(x) || isNaN(y)) ( худал буцаана; ) үнэнийг буцаана; )

Хэрэв та эдгээр өөрчлөлтүүдийн дараа npm тестийг дахин ажиллуулбал бүх шалгалтыг давах болно:

✓ Тооны оронд мөр ашиглах үед алдаа гарсныг мэдээлнэ ✓ Тооны оронд хоёр мөр ашиглахад алдааг мэдээлнэ ✓ 8 дамжуулалт (9мс) хоёр тоог ашиглахад амжилт

Бид програмынхаа бүх функцийг туршиж үзсэн. Функцүүд математикийн үйлдлүүдийг амжилттай гүйцэтгэж, оролтыг баталгаажуулдаг. Эцсийн шат бол хэрэглэгчийн интерфэйсийг бий болгох явдал юм.

Интерфейс үүсгэх

Бидэнд аль хэдийн шаардлагатай функцууд байгаа боловч хэрэглэгч тэдгээрийг ямар ч байдлаар ашиглах боломжгүй хэвээр байна. Тиймээс бидэнд интерфэйс хэрэгтэй. Манай програмын хувьд бид командын мөрийн интерфейс үүсгэх болно.

Одоогоор файл calc.jsхоосон байх ёстой. Энд бидний програм хадгалагдах болно. Эхлээд та функцуудыг импортлох хэрэгтэй operations.js:

Const үйлдэл = шаардлагатай("./operations.js");

Интерфэйс нь өөрөө Node.js-н суулгасан Readline CLI модулийг ашиглана:

Const readline = require("readline");

Шаардлагатай бүх зүйлээ импорт хийсний дараа та програмаа үүсгэж эхлэх боломжтой. Интерфэйсийг үүсгэхийн тулд бид rl хувьсагчаар ашиглах боломжтой readline-г ашиглана:

Const rl = readline.createInterface(( оролт: process.stdin, гаралт: process.stdout ));

Хөтөлбөрийг эхлүүлсний дараа хэрэглэгчийн харах ёстой хамгийн эхний зүйл бол мэндчилгээний мессеж болон ашиглах заавар юм. Үүнийг хийхийн тулд бид console.log()-г ашиглана:

Console.log(` Calc.js Та Node.js тооны машин нээлээ! Хувилбар: 1.0.0. Хэрэглээ: хэрэглэгч хоёр тоо оруулаад дараа нь тэдэнтэй юу хийхээ сонгох ёстой. `);

Тооцоологчийн функцууд руу орохын өмнө console.log() ажиллах ёстой эсэхийг шалгая. Бид програмыг мессеж хэвлэж, гарах болно. Үүнийг хийхийн тулд төгсгөлд нь rl.close() арга руу дуудлага нэмнэ үү.

Аппликешныг ажиллуулахын тулд файлын нэрээр зангилаа оруулна уу:

$ node calc.js Calc.js Та Node.js тооны машиныг нээлээ! Хувилбар: 1.0.0. Хэрэглээ: Хэрэглэгч хоёр тоо оруулаад дараа нь юу хийхээ сонгох ёстой.

Хөтөлбөр нь мэндчилгээний мессежийг харуулж, гарна. Одоо бид хэрэглэгчийн оролтыг нэмэх хэрэгтэй. Хэрэглэгч хоёр тоо, нэг үйлдлийг сонгох шаардлагатай. Оролт бүрийг rl.question() аргаар хүсэх болно:

Rl.question("Эхний тоог оруулна уу: ", (x) => ( rl.question("Хоёр дахь тоог оруулна уу: ", (y) => ( rl.question(` Дараах үйлдлүүдээс аль нэгийг нь сонгоно уу: Нэмэх ( +) Хасах (-) Үржүүлэх (*) Хуваах (/) Таны сонголт: `, (сонголт) => ( // энд өөр код гарч ирнэ rl.close(); )); )); ));

Хувьсагч х-д эхний тоо, хоёрдугаарт y, сонголт нь сонгосон үйлдэл юм. Одоо манай программ оролт асууж байгаа боловч хүлээн авсан өгөгдөлд юу ч хийхгүй байна.

Гурав дахь оролтын дараа та зөвхөн тоо оруулсан эсэхийг шалгах хэрэгтэй. Үүнийг хийхийн тулд validateNumbers() функцийг ашиглана. NOT операторыг ашиглан бид дугаар оруулсан эсэхийг шалгаж, ороогүй бол програмаас гарна.

Хэрэв (!operations.validateNumbers(x, y)) ( console.log("Зөвхөн тоо зөвшөөрнө! Програмыг дахин эхлүүлнэ үү."); )

Хэрэв бүх зүйл зөв оруулсан бол та өмнө нь үүсгэсэн холбогдох үйлдлийн аргыг ажиллуулах хэрэгтэй. Дөрвөн боломжит сонголтыг боловсруулахын тулд бид switch хэллэгийг ашиглаж, үйлдлийн үр дүнг гаргана. Хэрэв байхгүй үйлдлийг сонгосон бол өгөгдмөл блокыг ажиллуулж, хэрэглэгчийг дахин оролдохыг хэлэх болно:

Хэрэв (!operations.validateNumbers(x, y)) ( console.log("Зөвхөн тоо оруулах боломжтой! Програмыг дахин эхлүүлнэ үү."); ) else ( солих (сонголт) ( "1" тохиолдол: console.log(` $(x) ба $(y) нийлбэр нь $(operations.add(x, y)).`); завсарлага; тохиолдол "2": console.log(`$(x) ба $(y)-ийн ялгаа тэнцүү байна $(operations.subtract(x, y)).`); завсарлага; "3" тохиолдол: console.log(`$(x) ба $(y)-н үржвэр нь $(operations.multiply(x, y))-тэй тэнцүү байна. ).`) ; завсарлага; "4" тохиолдол: console.log(`Хувийн $(x) ба $(y) нь $(operations.divide(x, y)) тэнцүү).`); завсарлага; анхдагч: console.log ("Програмыг дахин эхлүүлж, 1-ээс 4-ийн хоорондох тоог сонгоно уу."); завсарлага; ) )

Тэмдэглэл Энд байгаа console.log() функцууд нь илэрхийллийг зөвшөөрдөг загвар мөрүүдийг ашигладаг.

/** * Суурилуулсан Readline командын интерфэйсийг ашигладаг тооцоолуур програмыг ашигладаг энгийн Node.js тооцоолуур. */ const actions = require("./operations.js"); const readline = шаардах("readline"); // Интерфейс үүсгэхийн тулд readline ашиглана уу const rl = readline.createInterface(( оролт: process.stdin, гаралт: process.stdout )); console.log(` Calc.js Та Node.js тооны машин нээлээ! Хувилбар: 1.0.0. Хэрэглээ: Хэрэглэгч хоёр тоо оруулаад дараа нь тэдэнтэй юу хийхээ сонгох ёстой. `); rl.question("Эхний тоог оруулна уу: ", (x) => ( rl.question("Хоёр дахь дугаарыг оруулна уу: ", (y) => ( rl.question(` Дараах үйлдлүүдээс аль нэгийг нь сонгоно уу: Нэмэх ( +) Хасах (-) Үржүүлэх (*) Хуваах (/) Таны сонголт: `, (сонголт) => ( хэрэв (!operations.validateNumbers(x, y)) ( console.log("Та зөвхөн тоо оруулах боломжтой! програмыг дахин эхлүүлнэ. "); ) else (шилжүүлэх (сонголт) ( "1" тохиолдол: console.log(`$(x) ба $(y)-н нийлбэр нь $(operations.add(x, y))-тэй тэнцүү). `); завсарлага; "2" тохиолдол: console.log(`$(x) ба $(y) хоёрын ялгаа нь $(operations.subtract(x, y)).`); завсарлага; "3" тохиолдол: console.log(`$( x) ба $(y)-н үржвэр нь $(operations.multiply(x, y)) тэнцүү байна).`); завсарлага; "4" тохиолдол: console.log(`Хувийн $(x) $(y) нь $(үйлдэл. хуваах(x, y)).`); завсарлага; анхдагч: console.log("Програмыг дахин эхлүүлж, 1-ээс 4 хүртэлх тоог сонгоно уу."); завсарлага; ) ) rl.close(); )); ))) ; ));

Одоо манай програм бэлэн боллоо. Эцэст нь түүний ажлыг шалгая. 999 ба 1-ийг оруулаад хасах үйлдлийг сонгоно уу:

$ node calc.js Эхний тоог оруулна уу: 999 Хоёр дахь тоог оруулна уу: 1 Таны сонголт: 2 999 ба 1-ийн зөрүү 998 байна.

Хөтөлбөр ажлаа амжилттай дуусгаж, зөв ​​үр дүнг харуулав. Баяр хүргэе, та Node.js ашиглан энгийн тооны машин бичиж, TDD хөгжүүлэлтийн үндсийг сурсан.



Ачааж байна...
Топ