testing

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

ميزة كانت تعمل سابقًا تتوقف!
أو نتيجة حساب تظهر بشكل خاطئ في الشاشة!

هنا تبدأ رحلة البحث عن الخطأ، بين الملفات والدوال والفئات — وغالبًا تستغرق ساعات أو حتى أيام.
لكن هناك طريقة ذكية لتجنّب هذا السيناريو: اختبار الوحدات (Unit Testing).


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

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

بكلمات أخرى:

اختبار الوحدة هو “مراقب الجودة” داخل الكود نفسه.

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


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

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

وفي النهاية، كل اختبار وحدة هو استثمار صغير في راحة بالك المستقبلية كمطوّر.


إعداد بيئة اختبار الوحدة

يأتي Flutter جاهزًا مع أداة مدمجة تدعى flutter test، وهي المسؤولة عن تشغيل جميع الاختبارات داخل مجلد test/.

للبدء، أنشئ ملفًا جديدًا باسم:

test/calculator_test.dart

ثم أضف هذا المثال البسيط:

import 'package:flutter_test/flutter_test.dart';

int sum(int a, int b) => a + b;

void main() {
  test('تحقق من دالة الجمع', () {
    expect(sum(2, 3), 5);
  });
}

الآن شغّل الأمر التالي في الطرفية:

flutter test

ستظهر لك نتيجة مثل:

00:00 +1: الكل ناجح!

🎉 مبروك! لقد أنشأت أول اختبار وحدة بنجاح.


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

عندما تشغّل flutter test:

  1. يقوم Flutter بتحميل كل ملفات الاختبار في الذاكرة.
  2. ينفّذ كل اختبار على حدة داخل بيئة معزولة.
  3. يقارن النتائج الفعلية بالنتائج المتوقعة (من خلال expect).
  4. يعرض لك تقارير دقيقة بكل اختبار نجح أو فشل.

ببساطة، إنها عملية تحقق آلية دقيقة تمنحك ثقة في كل سطر كود تكتبه.


محاكاة التبعيات باستخدام Mockito

في بعض الأحيان، تحتاج لاختبار دالة تعتمد على خدمة خارجية — مثل قاعدة بيانات أو API — وهنا نستخدم مكتبة Mockito لمحاكاة هذه الخدمات.

مثلاً:

import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';

class UserService {
  Future<String> getUser() async => 'Ahmed';
}

class MockUserService extends Mock implements UserService {}

void main() {
  test('اختبار خدمة المستخدم', () async {
    final service = MockUserService();

    when(service.getUser()).thenAnswer((_) async => 'Ali');

    expect(await service.getUser(), 'Ali');
  });
}

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


قياس تغطية الاختبار (Code Coverage)

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

flutter test --coverage

وسيقوم Flutter بإنشاء ملف lcov.info يحتوي على النسبة المئوية لتغطية الكود.
كلما ارتفعت النسبة، زادت ثقتك بأن تطبيقك مستقر وخالٍ من المفاجآت.


نصائح عملية لكتابة اختبارات وحدة فعالة

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

الخلاصة

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

✨ تذكّر: كل اختبار تكتبه هو خطوة نحو تطبيق أكثر ثقة واحترافية.


By احمد علي

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *