اختبارات Java: الوحدة والتكامل والاختبارات الشاملة من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

المقدمة: لماذا يعتبر الاختبار أساس كود Java عالي الجودة

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

في هذه المقالة، سنقوم بتحليل ثلاثة مستويات رئيسية للاختبار: unit (اختبار الوحدة)، integration (اختبار التكامل)، و e2e (اختبار شامل). سننظر فيها من خلال أمثلة عملية بلغة Java، باستخدام أطر العمل الشائعة: JUnit 5، Mockito، Spring Boot Test و Selenium. ستتعلم كيفية بناء هرم الاختبار الصحيح وعدم تحميل المشروع باختبارات غير مفيدة.



1. اختبار الوحدة: التحقق من الوحدات الذرية للكود

اختبارات الوحدة (Unit tests) هي المستوى الأدنى والأسرع. تتحقق من عمل "وحدة" واحدة (عادةً دالة أو كلاس) بمعزل عن التبعيات الخارجية (قاعدة البيانات، API، نظام الملفات).



1.1 الأدوات وأطر العمل

  • JUnit 5 — المعيار الفعلي لكتابة الاختبارات في Java.
  • Mockito — مكتبة لإنشاء الكائنات الوهمية (mocks) والنماذج البديلة (stubs).
  • AssertJ — مكتبة للتحقق السلس (التأكيدات).


1.2 مثال على اختبار وحدة باستخدام JUnit 5 و Mockito

لنفترض أن لدينا خدمة OrderService تعتمد على مستودع PaymentRepository. نريد اختبار منطق الخدمة دون استدعاء قاعدة البيانات الحقيقية.

// الكلاس المراد اختبارهpublic class OrderService {    private final PaymentRepository paymentRepository;

public OrderService(PaymentRepository paymentRepository) { this.paymentRepository = paymentRepository; }

public String processOrder(Order order) { if (order.getAmount() <= 0) { throw new IllegalArgumentException("يجب أن يكون مبلغ الطلب موجبًا"); } boolean success = paymentRepository.pay(order); return success ? "تم الدفع بنجاح" : "خطأ في الدفع"; }}

// اختبار الوحدةimport org.junit.jupiter.api.Test;import org.junit.jupiter.api.extension.ExtendWith;import org.mockito.InjectMocks;import org.mockito.Mock;import org.mockito.junit.jupiter.MockitoExtension;import static org.junit.jupiter.api.Assertions.*;import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)class OrderServiceTest {

@Mock private PaymentRepository paymentRepository;

@InjectMocks private OrderService orderService;

@Test void testProcessOrder_Success() { // ترتيب Order order = new Order(100.0); when(paymentRepository.pay(order)).thenReturn(true);

// تنفيذ String result = orderService.processOrder(order);

// تأكيد assertEquals("تم الدفع بنجاح", result); verify(paymentRepository, times(1)).pay(order); }

@Test void testProcessOrder_NegativeAmount() { // ترتيب Order order = new Order(-10.0);

// تنفيذ & تأكيد assertThrows(IllegalArgumentException.class, () -> { orderService.processOrder(order); }); }}

أفضل الممارسات لاختبارات الوحدة:

  • اختبار واحد — فحص واحد (مبدأ FIRST: سريع، معزول، قابل للتكرار، ذاتي التحقق، في الوقت المناسب).
  • استخدم أسماء واضحة: shouldReturnSuccess_whenPaymentIsApproved.
  • لا تختبر الدوال الخاصة (private) — اختبر العقد العام (public).
  • قم بتغطية الحالات الحدودية: null، سلاسل فارغة، أرقام سالبة.


2. اختبار التكامل: التحقق من تفاعل المكونات

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

المدونات

توصيات الكتب