عند كتابة برنامج، يمكنك التأكد من أنه يعمل بشكل صحيح من خلال الاختبار. يمكن تعريف الاختبار على نطاق واسع على أنه عملية تشغيل برنامج في للتأكد من أنها تتصرف كما كانت.
يمكن أن يمنحك الاختبار الناجح الثقة في أنه عند إضافة تعليمة برمجية أو ميزات أو حتى ترقية تبعياتك، فإن البرنامج الذي كتبته بالفعل مواصلة العمل بالطريقة التي تتوقعها. يمكن أن يساعد الاختبار أيضًا في حماية البرامج مقابل سيناريوهات مستبعدة أو إدخالات غير متوقعة.
في ما يلي بعض الأمثلة على السلوك الذي قد تريد اختباره على الويب:
- التأكد من أن ميزة موقع الويب تعمل بشكل صحيح عند النقر فوق أحد الأزرار.
- التأكد من أن دالة معقدة تؤدي إلى النتائج الصحيحة.
- إكمال إجراء يتطلب تسجيل دخول المستخدم.
- التحقق من أنّ أحد النماذج يُبلغ عن خطأ بشكلٍ صحيح عند إدخال بيانات غير صحيحة
- التأكد من أن تطبيق الويب المعقد يستمر في العمل عندما يكون المستخدم عديم الجدوى نطاق ترددي منخفض أو تصبح غير متصلة بالإنترنت.
الاختبار التلقائي مقابل الاختبار اليدوي
يمكنك اختبار البرنامج بطريقتين عامتين: الاختبار الآلي واليدوي. اختبار الفرضية.
يتضمن الاختبار اليدوي أشخاصًا يقومون بتشغيل البرامج مباشرة، مثل تحميل الموقع الإلكتروني في المتصفّح والتأكّد من أنّه يعمل على النحو المتوقّع. كتيب التي يمكن إنشاؤها أو تحديدها بسهولة، على سبيل المثال، هل يمكن تحميل موقعك؟ هل يمكنك أداء هذه الإجراءات؟ - ولكن كل عملية تشغيل يكلف مقدارًا هائلاً من وقت الإنسان. على الرغم من إبداع الأشخاص بشكل كبير، قد يتيح ذلك نوعًا من الاختبار المعروفة باسم الاختبارات الاستكشافية، فيمكن أن نكون ضعيفين في ملاحظة الإخفاق أو والتناقضات، خاصة عند القيام بنفس المهمة عدة مرات.
الاختبار الآلي هو أي عملية تتيح تنظيم الاختبارات وتنفيذها. بشكل متكرر بواسطة جهاز كمبيوتر لتأكيد السلوك المقصود لبرنامجك بدون تكليف شخص بإجراء أي خطوات متكررة، كعملية الإعداد أو التحقّق من النتائج والأهم من ذلك أنّه بعد ضبط الاختبار الآلي، يمكن تنفيذه بشكل متكرّر. لا يزال هذا تعريفًا واسعًا للغاية، وتجدر الإشارة إلى أن تأخذ الاختبارات جميع الأنواع من الأشكال والأشكال. تتعلق غالبية هذه الدورة نفسه عن طريق الاختبار الآلي كتدريب.
الاختبار اليدوي مكانه، وغالبًا ما كبداية لكتابة ولكن أيضًا عندما يصبح الاختبار الآلي غير موثوق به وواسع النطاق، أو صعوبة في الكتابة.
الأساسيات من خلال مثال
بالنسبة لنا، كمطوري ويب يكتبون جافا سكريبت أو لغات ذات صلة، فإن ملف اختبار تلقائي يمكن أن يكون نصًا كهذا الذي يتم تشغيله كل يوم، ربما من خلال عقدة، أو من خلال تحميلها في متصفح:
import { fibonacci } from "../src/math.js";
if (fibonacci(0) !== 0) {
throw new Error("Invalid 0th fibonacci result");
}
const fib13 = fibonacci(13);
if (fib13 !== 233) {
throw new Error("Invalid 13th fibonacci result, was=${fib13} wanted=233");
}
هذا مثال مبسَّط يوفّر الرؤى التالية:
هذا اختبار لأنه يشغِّل بعض البرامج (وبرنامج Fibonacci) ) وتضمن يعمل بالطريقة المرجوّة من خلال التحقق من نتائجه مقابل القيم المتوقعة. فإذا كان السلوك غير صحيح، فإنه يتسبب في خطأ، يتم التعبير عن JavaScript من خلال طرح
Error
.على الرغم من أنّه يمكنك تشغيل هذا النص البرمجي يدويًا في الوحدة الطرفية أو إلا أنه لا يزال هذا اختبارًا مبرمَجًا لأنّه يمكن تنفيذه بشكل متكرّر. دون الحاجة إلى تنفيذ أي خطوات فردية. الصفحة التالية، حيث إجراء الاختبارات، توضّح المزيد.
وعلى الرغم من أن هذا الاختبار لا يستخدم أي مكتبات، إلا أنه يمكن استخدام JavaScript التشغيل في أي مكان - لا يزال اختبارًا. هناك العديد من الأدوات التي يمكن أن تساعدك وكتابة الاختبارات، بما في ذلك تلك التي سيتم تناولها لاحقًا في هذه الدورة، ولكن إلا أنها لا تزال تعمل على المبدأ الأساسي المتمثل في التسبب في خطأ إذا حدث خطأ ما.
اختبار المكتبات عمليًا
توفر معظم المكتبات أو أطر الاختبار المضمنة عنصرين أساسيين تسهيل كتابة الاختبارات: التأكيدات وطريقة تحديد الاختبارات المستقلة. سنتناول هذه المواضيع بالتفصيل في القسم التالي: الإقرارات الأساسيات الأخرى. ومع ذلك، على مستوى عالٍ، من المهم أن تتذكر أن جميع الاختبارات التي تراها أو تكتبها تقريبًا ستنتهي باستخدام هذه الأنواع من الأساسيات.
التأكيدات هي طريقة لدمج التحقق من نتيجة والتسبب في حدوث خطأ إذا
حدث خطأ ما. على سبيل المثال، يمكنك جعل الاختبار السابق أكثر إيجازًا.
من خلال تقديم "assert
":
import { fibonacci } from "../src/math.js";
import { assert } from "a-made-up-testing-library";
assert.equal(fibonacci(0), 0, "Invalid 0th fibonacci result");
assert.equal(fibonacci(13), 233, "Invalid 13th fibonacci result");
يمكنك تحسين هذا الاختبار بشكل أكبر من خلال تحديد اختبارات مستقلة، اختياريًا مجمعة في مجموعات. يقوم الجناح التالي باختبار فيبوناتشي بشكل مستقل والدالة الكتالانية:
import { fibonacci, catalan } from "../src/math.js";
import { assert, test, suite } from "a-made-up-testing-library";
suite("math tests", () => {
test("fibonacci function", () => {
assert.equal(fibonacci(0), 0, "Invalid 0th fibonacci result");
assert.equal(fibonacci(13), 233, "Invalid 13th fibonacci result");
});
test("relationship between sequences", () => {
const numberToCheck = 4;
const fib = fibonacci(numberToCheck);
const cat = catalan(numberToCheck);
assert.isAbove(fib, cat);
});
});
في سياق اختبار البرامج هذا، يشير مصطلح test في الاسم إلى حالة الاختبار: سيناريو فردي ومستقل وقابل للمعالجة، مثل "العلاقة بين التسلسلات" حالة الاختبار في المثال السابق.
تكون الاختبارات ذات الأسماء الفردية مفيدة في المهام التالية، من بين مهام أخرى:
- تحديد مدى نجاح الاختبار أو فشله بمرور الوقت.
- يُعد إبراز خطأ أو سيناريو بالاسم حتى تتمكن بسهولة أكبر من اختبار يتم حله بالفعل.
- إجراء بعض الاختبارات بشكل مستقل عن اختبارات أخرى، من خلال فلتر الكرة الأرضية على سبيل المثال.
إن إحدى طرق التفكير في حالات الاختبار هي استخدام "المصادقة والترخيص والمحاسبة" لاختبار الوحدة: والترتيب والتنفيذ والتأكيد. سيكون لكل حالة اختبار في جوهرها ما يلي:
- رتب بعض القيم أو الحالة (قد تكون هذه مجرد بيانات إدخال غير قابلة للتغيير).
- نفِّذ إجراءً، مثل استدعاء طريقة.
- التأكيد على قيم الناتج أو الحالة المعدَّلة (باستخدام
assert
)
حجم الاختبارات
تصف نماذج الرموز في القسم السابق اختبار الوحدة، لأنها اختبار أجزاء صغيرة من برنامجك، مع التركيز غالبًا على ملف واحد، وفي هذا حالة، مخرجات دالة واحدة فقط. يزداد تعقيد الاختبار كلما التفكير في التعليمات البرمجية من ملفات أو مكونات متعددة أو حتى أنواع مختلفة من خارجة عن سيطرتك أحيانًا، مثل خدمة شبكة أو سلوك التبعية الخارجية). ولهذا السبب، غالبًا ما تتم تسمية أنواع الاختبار بناءً على النطاق أو المقياس.
إلى جانب اختبارات الوحدات، تشمل بعض الأمثلة على أنواع الاختبارات الأخرى المكوّنات الاختبار والاختبار المرئي واختبار الدمج. لا يحمل أي من هذه الأسماء والتعريفات الصارمة، وقد يكون لها معانٍ مختلفة بناءً على لقاعدة التعليمات البرمجية، لذا تذكر استخدامها كدليل والتوصل إلى تعريفات من أجلك. على سبيل المثال، ما هو المكوّن الذي يخضع للاختبار في نظامك؟ بالنسبة رد الفعل للمطوّرين، قد يتم ربط هذا حرفيًا بـ "مكون React"، ولكنه قد يكون لها معنى مختلف بالنسبة إلى المطورين في السياقات الأخرى.
يمكن أن يضعه مقياس الاختبار الفردي داخل مفهوم يشار إليه غالبًا باسم "هرم الاختبار"، والذي يمكن أن يكون قاعدة أساسية جيدة لأي اختبار وعمليات التحقق وكيفية تشغيله.
وقد تم تكرار هذه الفكرة، كما تم الآن استخدام أشكال أخرى مختلفة شائعة الاستخدام، مثل معيَّن للاختبار أو لاختبار مخروط الثلج. من المحتمل أن تكون أولوياتك في الكتابة التجريبية فريدة أو قاعدة التعليمات البرمجية. ومع ذلك، هناك ميزة شائعة تتمثل في أن الاختبارات البسيطة، مثل اختبارات الوحدات، أن تكون أسرع في التشغيل، وأسهل في الكتابة (لذا سيكون لديك المزيد منها)، اختبار نطاق محدود، في حين أن الاختبارات المعقدة مثل الاختبارات الشاملة يتم الصعب ولكن يمكن اختبار نطاق أوسع. في الواقع، الطبقة العلوية من العديد اختبار "الأشكال" إلى أن يكون اختبارًا يدويًا، لأن بعض تفاعلات المستخدم من التعقيد للغاية بحيث لا يمكن تنظيمه في اختبار آلي.
وسيتم توسيع هذه الأنواع في أنواع آلية اختبار الفرضية.
التحقق من فهمك
ما هي المبادئ الأولية التي توفّرها معظم مكتبات وأُطر الاختبار؟