ما المقصود باختبارات الوحدة؟

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

ما المقصود باختبار الوحدة؟

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

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

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

استراتيجيات اختبارات الوحدة

لإنشاء اختبارات الوحدة، يُمكنك اتباع بعض التقنيات الأساسية لضمان تغطية جميع حالات الاختبار.

عمليات التحقق المنطقية

هل يُجري النظام العمليات الحسابية المناسبة ويلتزم بالمسار المناسب من خلال التعليمة البرمجية المعطاة إدخالات صحيحة ومتوقعة؟ هل تتم تغطية جميع المسارات عبر التعليمة البرمجية بواسطة الإدخالات المعطاة؟

عمليات التحقق من حدود النطاق

بالنسبة للإدخالات المعطاة، كيف يستجيب النظام؟ كيف يستجيب النظام للإدخالات النموذجية أو الحالات الطرفية أو الإدخالات غير الصالحة؟

لنفترض أنك تتوقع إدخال هو عدد صحيح يقع بين 3 و7. كيف يستجيب النظام عند استخدام 5 (إدخال نموذجي) أو 3 (حالة طرفية) أو 9 (إدخال غير صالح)؟

معالجة الأخطاء

عندما تكون هناك أخطاء في الإدخالات، كيف يستجيب النظام؟ هل يُطلب من المستخدم إدخال آخر؟ هل يتعطل البرنامج؟

عمليات التحقق الموجهة للكائنات

إذا تغيرت حالة أي كائنات ثابتة من خلال تشغيل التعليمة البرمجية، فهل يتم تحديث الكائن بشكل صحيح؟

مثال على اختبارات الوحدة

فيما يلي مثال لطريقة أساسية للغاية في لغة Python وبعض حالات الاختبار المشتملة على تعليمة برمجية أُجرِي عليها اختبار الوحدة المطابق.

أسلوب Python

def add_two_numbers(x, y):

    return x + y

اختبارات الوحدة المطابقة

def test_add_positives():

    result = add_two_numbers(5, 40)

    assert result == 45

def test_add_negatives():

    result = add_two_numbers(-4, -50)

    assert result == -54

def test_add_mixed():

    result = add_two_numbers(5, -5)

    assert result == 0  

ما مزايا اختبارات الوحدة؟

اختبارات الوحدة تعود بالفائدة على مشروعات تطوير البرمجيات بعدة طرق.

الكفاءة في اكتشاف الأخطاء

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

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

الوثائق

من المهم توثيق التعليمة البرمجية لمعرفة بالضبط ما يُفترض أن تفعله هذه التعليمة البرمجية. ومع ذلك، تعمل اختبارات الوحدة أيضًا كشكل من أشكال التوثيق.

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

كيف يستخدم المطورون اختبارات الوحدة؟

يستخدم المطورون اختبارات الوحدة في مراحل مختلفة من دورة حياة تطوير البرنامج. 

التطوير المستند إلى الاختبار

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

بعد إكمال إحدى كتل التعليمة البرمجية

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

كفاءة DevOps

يُعد التكامل المستمر والتسليم المستمر (CI/CD) من الأنشطة الأساسية الموجودة في عملية تطبيق DevOps على ممارسات تطوير البرمجيات. يتم دمج أي تغييرات تطرأ على التعليمة البرمجية في قاعدة التعليمات البرمجية الأوسع، ويتم تشغيلها من خلال اختبارات مؤتمتة ثم يتم نشرها إذا نجحت الاختبارات.

تشكل اختبارات الوحدة جزءًا من مجموعة الاختبارات بجانب اختبارات التكامل. يجري تشغيلها تلقائيًا في مسار التكامل المستمر والتسليم المستمر (CI/CD) لضمان جودة التعليمة البرمجية أثناء ترقيتها وتغييرها بمرور الوقت.

متى تكون اختبارات الوحدة أقل فائدةً؟

اختبارات الوحدة لا تكون مطلوبةً دائمًا لكل حالة اختبار مفردة في كل كتلة مفردة من كُتل التعليمة البرمجية في كل مشروع مفرد. فيما يلي بعض الأمثلة عن الحالات التي يمكن فيها الاستغناء عن اختبارات الوحدة. 

عندما يكون الوقت ضيقًا

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

بمجرد أن يبدأ المطورون في كتابة الاختبارات، فإنهم يرون أيضًا فرصًا لإعادة التصميم في كتلة التعليمة البرمجية وينصرف انتباههم عن إكمال كتابة الاختبارات. يمكن أن يؤدي ذلك إلى تمديد الجداول الزمنية الخاصة بعملية التطوير وإلى مشكلات في الميزانية.

تطبيقات واجهة المستخدم/تجربة المستخدم

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

قواعد التعليمات البرمجية القديمة

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

المتطلبات سريعة التطور

اعتمادًا على المشروع، يمكن للبرنامج أن يتوسّع أو يغير الاتجاهات أو يتم إلغاء أجزاء كاملة منه تمامًا في أي مرحلة من مراحل العمل. إذا كان من المحتمل أن تكثر التغيرات في المتطلبات، فلا توجد أسباب كبيرة لكتابة اختبارات الوحدة في كل مرة يحدث فيها تطوير لإحدى الكتل بالتعليمة البرمجية.

ما أفضل الممارسات المتعلقة باختبارات الوحدة؟

نتناول مجموعة من أفضل الممارسات المتعلقة باختبارات الوحدة لتحقيق أقصى استفادة من عمليتك.

استخدم إطار لاختبارات الوحدة

يضيع الوقت في كتابة اختبارات وحدة صريحة ومخصصة بالكامل لكل كتلة (block) مفردة من التعليمة البرمجية. توجد أطر اختبار مؤتمتة لجميع لغات البرمجة الشائعة.

على سبيل المثال، تتضمن لغة Python الإطار pytest والإطار unittest، وهم إطاران مختلفان لاختبارات الوحدة. تُستخدم أطر الاختبارات على نطاق واسع في جميع مشروعات تطوير البرمجيات من جميع الأحجام.

أتمتة اختبارات الوحدة

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

قد يتم أيضًا تشغيل اختبارات الوحدة على مشروع كامل، وفقًا لجدول زمني. أتمتة اختبارات الوحدة تضمن تشغيل الاختبارات في جميع الأحداث والحالات المناسبة طوال دورة حياة التطوير.

تأكيد نتيجة واحدة فقط

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

تنفيذ اختبارات الوحدة

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

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

ما الفرق بين اختبارات الوحدة وأنواع الاختبارات الأخرى؟

بالإضافة إلى اختبارات الوحدة، توجد أنواع أخرى كثيرة من طرق اختبار البرامج. ولكل نوع من هذه الأنواع دور محدد في دورة حياة تطوير البرنامج:

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

طرق الاختبار هذه تتطلب عادةً أدواتٍ خاصةً وعملياتٍ مستقلةً للتحقق من البرنامج. وأيضًا يتم تنفيذ العديد من هذه الاختبارات بعد تطوير وظائف التطبيق الأساسية. 

في المقابل، يتم تشغيل اختبارات الوحدة في كل مرة يتم فيها إنشاء التعليمة البرمجية. يمكن كتابة اختبارات الوحدة هذه بمجرد كتابة أي تعليمة برمجية وتنفيذ هذه الاختبارات لا يتطلب أي أدواتٍ خاصة. تُعد اختبارات الوحدة أحد الأنواع الأساسية في اختبار البرنامج.

كيف تساعدك AWS في تلبية متطلبات اختبارات الوحدة؟

توفر Amazon Web Services (AWS) للمطورين مجموعةً كبيرةً من المزايا. يُمكنك تطوير التعليمة البرمجية وتشغيلها واختبار البرمجيات، مثل اختبارها عن طريق اختبارات الوحدة واختبارات التكامل. يُمكنك أيضًا تشغيل مسارات DevOps ومتابعة العديد من فرص التطوير.

تعمل أدوات المطورين من AWS على توفير بيئات تطوير متكاملة (IDEs)، ومكوناتٍ إضافية، ومجموعات تطوير برمجيات (SDKs) للعديد من لغات البرمجة وحالات الاستخدام البرمجية. من بين المزايا الأخرى، تجعل هذه الأدوات اختبارات الوحدة أكثر كفاءةً.

AWS Fargate هو محرك حوسبة بلا خوادم بطريقة الدفع حسب الاستخدام يتيح لك التركيز على إنشاء التطبيقات بدون إدارة خوادم. يُمكنك بسهولة تشغيل برامج آلية خاصة باختبارات الوحدة على Fargate لتبسيط عملية تطوير التطبيقات. 

يُمكنك أيضًا العثور على برامج لاختبارات الوحدة تابعة لجهات خارجية على AWS Marketplace. يُمكنك تنفيذ البرنامج بسرعة وباستخدام عناصر التحكم التي تحتاجها. يقدم بائعو AWS Marketplace خياراتٍ تسعير مرنةً، وبالتالي تدفع مقابل ما تحتاج إليه عندما تحتاج إليه.

ابدأ اليوم اختبارات الوحدة على AWS عن طريق إنشاء حساب.

الخطوات التالية على AWS

التحقق من الموارد الإضافية المتعلقة بالمنتج
الاطلاع على خدمات أدوات المطوّرين 
سجِّل الاشتراك للحصول على حساب مجاني

تمتع بالوصول الفوري إلى الطبقة المجانية من AWS.

تسجيل الاشتراك 
ابدأ في التطوير في وحدة التحكم

بدء الإنشاء في وحدة إدارة تحكم AWS.

تسجيل الدخول