تعلم البرمجة باستخدام JavaScript


الدرس: اختبر أن الوظيفة تفعل ما تقوله


الصفحة السابقة

افهم أهمية الاختبار


منذ حوالي عام ، تم استدعائي للعمل في شركة ناشئة لمساعدتهم على إكمال التطوير في الوقت المحدد لتاريخ نشرهم. يعالج منتج هذه الشركة عددًا كبيرًا من المعاملات الصغيرة ، لذا كانت الدقة ضرورية.

كنت أعمل على الواجهة ، لكنني لاحظت على الفور مشكلة: لم تتطابق الحسابات. من خلال بدء بضع مئات من المعاملات ، كانت المجاميع خاطئة بعدة عشرات من اليورو. كان هناك شيء خاطئ بشكل خطير.

كان هذا المشروع كبيرًا ومعقدًا وطموحًا للغاية (كانت الواجهة نفسها تحتوي على أكثر من 600000 سطر من التعليمات البرمجية!) ، لكن هذه الشركة الناشئة لم تقم بإعداد بنية اختبار. لتحديد موقع المشكلة ، استغرق الأمر منا أكثر من أسبوع مع زيادة الإحباط والذعر. كان هناك ربع مليون يورو على المحك ، وذلك لعميل واحد فقط.

انتهت القصة بشكل جيد ، لكن الأمر استغرق أسبوعًا كاملاً للعثور على خطأ ، والذي كان سيُكتشف إذا كان هناك نظام اختبار لائق. كان من الممكن أن نخسر الكثير من المال لدرجة أن الشركة كانت ستخرج من العمل.

TL ؛ DR - الاختبار مهم حقًا!

ما هو الاختبار؟



حسنًا ، هناك ثلاثة أنواع أساسية.

إنشاء اختبارات الوحدة


يتحقق اختبار الوحدة من الوحدات الفردية (عادةً ما تكون وظائف أو فئات فريدة) من خلال تزويدها بالمدخلات والتأكد من أنها تعطي المخرجات المتوقعة.

هذا سبب آخر لكتابة وظائف قصيرة لها غرض واحد فقط: من الأسهل كتابة الاختبارات لها!

بشكل عام ، يتم اختبار كل وحدة في حالة بسيطة ، ثم في حالة ذات حدود واحدة أو أكثر.

على سبيل المثال ، إذا كنت تأخذ بعض الوظائف من الفصل السابق:


const getWordCount = (stringToTest) => {

 

const wordArray = stringToTest.split(' ');



return wordArray.length;



}



const getLetterCount = (stringToTest) => {



const wordArray = stringToTest.split(' ');



let totalLetters = 0;



for (let word of wordArray) {



word.replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g, "");



totalLetters += word.length;



}



return totalLetters;



}
 
ما الحالات التي ستختبرها لكل وظيفة هنا؟
  • getWordCount   - يمكنك التحقق من سلسلة تعرف فيها عدد الكلمات (حالة بسيطة) ، ثم ربما سلسلة فارغة ، وسلسلة تحتوي على مسافات فقط (حالة حدية).
  • getLetterCount   - يمكنك التحقق من سلسلة حيث تعرف عدد الأحرف (حالة بسيطة) ، ثم جرِّب سلسلة تحتوي على علامات ترقيم فقط (حالة حدية).
يمكنك كتابة هذه الاختبارات كرمز ملحق:

const testSimpleWordCount = () => {

 

const testString = 'I have four words!';



if (getWordCount(testString) !== 4) {



   console.error('Simple getWordCount failed!');



}



}



const testEdgeWordCount = () => {



const testString = '             ';



if (getWordCount(testString) !== 0) {



   console.error('Edge getWordCount failed!');



}



}



const testSimpleLetterCount = () => {



const testString = 'I have twenty one letters!';



if (getLetterCount(testString) !== 21) {



   console.error('Simple getLetterCount failed!');



}



}



const testEdgeLetterCount = () => {



const testString = '")(&;//!!';



if (getLetterCount(testString) !== 0) {



   console.error('Edge getLetterCount failed!');



}



}
 
 لقد استخدمت console.error () بدلاً من console.log () لعرض الرسائل كأخطاء على وحدة التحكم.

هذه اختبارات مباشرة ، ويمكن أن تكون جيدة لإجراء فحوصات سريعة ، ولكن من الأفضل عادةً استخدام بنية اختبار .

تسمح لك معماريات الاختبار والمكتبات بكتابة مجموعات اختبار كاملة من التعليمات البرمجية تلقائيًا ، باستخدام وظائف وبناء جملة محددة. إليك ما قد يبدو عليه الاختباران أعلاه في بعض البنى:


describe('getWordCount()', function() {

 

it('should find four words', function() {



expect(getWordCount('I have four words!').to.equal(4));



});



it('should find no words', function() {



expect(getWordCount('      ').to.equal(0));



});



});
 
تشكل اختبارات الوحدة عادةً 60-80٪ من جميع اختبارات مشروع JavaScript . لكن هناك اختبارات أخرى ، مثل اختبارات التكامل.

اكتشف اختبارات التكامل



JavaScript
لا توجد اختبارات تكامل"

تمكن اختبارات التكامل من التحقق من وظائف متعددة الطبقات أو للتأكد من أنها تعمل معا كما يفترض عليهم القيام به. توضح الصورة أعلاه ما يحدث عندما تعمل الوحدات الفردية بشكل صحيح (يفتح الدرجان بشكل منفصل) ، ولكن اندماجها في النظام المحيط بها يسبب مشكلة وظيفية.

افهم الاختبارات الوظيفية



في الاختبارات الوظيفية ، والمعروف أيضا نهاية إلى نهاية (E2E) ، تحقق سيناريوهات كاملة في السياق. على سبيل المثال ، يقوم المستخدم بتسجيل الدخول إلى تطبيقك ، ويفتح إشعاراته ، ويميزها جميعًا كمقروءة. تتحقق هذه الاختبارات أيضًا من الموارد الخارجية التي يمكن أن يستخدمها مشروعك ، على سبيل المثال نظام دفع تابع لجهة خارجية.

كيف تعمل في الواقع العملي؟


تتطلب ممارسة اختبارات الوحدة القليل من الخبرة واستخدام الأدوات المخصصة. هناك أطر عمل مختلفة مخصصة لاختبار الوحدة والوظيفة لتطبيقات JavaScript للواجهة الأمامية و / أو الخلفية. غالبًا ما نجد الإطارات Jasmine  و mocha.js  و Mocha  وما إلى ذلك.

لاستخدام هذه الأدوات ، غالبًا ما يكون من الضروري إعداد تكوين معين ونظام تجميع للكود الخاص بك. لذلك من الضروري أن تفهم JavaScript على نطاق أوسع قبل التدرب على الاختبارات.

باختصار



في هذا الفصل ، قدمنا ​​لك ثلاثة أنواع من الاختبارات:

  • اختبارات الوحدة
  • اختبارات التكامل
  • الاختبارات الوظيفية (E2E) .
لقد رأيت أيضًا أنه بينما يمكن أن يعمل الاختبار اليدوي لكود الملحقات ، إلا أن هناك بنى آلية تجعل الاختبار أسهل وأكثر موثوقية.

في الفصل التالي ، سنرى كيفية إصلاح بعض التعليمات البرمجية عندما تسوء الأمور: التصحيح !