اختبار في Java: نظرة عامة على الأطر والأدوات الرئيسية
الاختبار هو جزء لا يتجزأ من التطوير الاحترافي في Java. بدون اختبارات عالية الجودة، من المستحيل ضمان استقرار الكود وأمانه وتوافقه مع المتطلبات. في هذه المقالة، سنستعرض بالتفصيل الأدوات والأطر الرئيسية لاختبار تطبيقات Java، والتي ستساعدك في كتابة كود موثوق وقابل للصيانة.
1. JUnit 5 — أساس اختبار الوحدة
JUnit 5 (Jupiter) هو المعيار الفعلي لاختبار الوحدة في Java. يوفر تعليقات توضيحية (annotations) وتأكيدات (asserts) وآليات لتنظيم الاختبارات.
الإمكانيات الرئيسية:
- التعليقات التوضيحية
@Testو@BeforeEachو@AfterAllلإدارة دورة حياة الاختبارات - الاختبارات المعلمية باستخدام
@ParameterizedTest - الاختبارات المتداخلة (
@Nested) للتجميع المنطقي - الإضافات (Extensions) عبر
@ExtendWith
مثال على اختبار بسيط باستخدام JUnit 5:
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;
class CalculatorTest {
@Test void testAddition() { Calculator calc = new Calculator(); int result = calc.add(2, 3); assertEquals(5, result, "2 + 3 يجب أن يساوي 5"); }
@Test void testDivisionByZero() { Calculator calc = new Calculator(); assertThrows(ArithmeticException.class, () -> calc.divide(10, 0)); }}2. Mockito — إنشاء الكائنات الوهمية (Mocks)
Mockito هو الإطار الأكثر شيوعًا لإنشاء كائنات mock في Java. يتيح لك عزل الفئة التي تختبرها عن تبعياتها.
الإمكانيات الرئيسية لـ Mockito:
- إنشاء mocks عبر
Mockito.mock() - تكوين السلوك باستخدام
when()...thenReturn() - التحقق من استدعاءات الطرق (
verify()) - التقاط الوسائط عبر
ArgumentCaptor
import static org.mockito.Mockito.*;import org.junit.jupiter.api.Test;
class UserServiceTest {
@Test void testGetUser() { // إنشاء mock للمستودع UserRepository mockRepo = mock(UserRepository.class); when(mockRepo.findById(1L)).thenReturn(new User("Alice"));
// حقن mock في الخدمة UserService service = new UserService(mockRepo);
// تنفيذ الاختبار User user = service.getUser(1L); assertEquals("Alice", user.getName());
// التحقق من استدعاء الطريقة verify(mockRepo).findById(1L); }}3. TestNG — بديل لـ JUnit مع إمكانيات موسعة
TestNG هو إطار قوي مستوحى من JUnit و NUnit. يقدم ميزات إضافية: تبعيات الاختبارات، التشغيل المتوازي، مجموعات الاختبارات.
الميزات المميزة لـ TestNG:
- التعليقات التوضيحية
@Testو@BeforeSuiteو@AfterClass - تجميع الاختبارات عبر السمة
groups - المعلمية عبر تكوين XML
- التبعيات بين الاختبارات (
dependsOnMethods)
import org.testng.annotations.Test;import static org.testng.Assert.*;
public class MathTest {
@Test(groups = {"smoke", "math"}) public void testSum() { assertEquals(5, Math.addExact(2, 3)); }
@Test(dependsOnMethods = {"testSum"}) public void testMultiply() { assertEquals(6, Math.multiplyExact(2, 3)); }}4. Selenium WebDriver — اختبار واجهات الويب
Selenium هو أداة لا غنى عنها لاختبار تطبيقات الويب الآلي. يدعم جميع المتصفحات الرئيسية ويسمح بمحاكاة إجراءات المستخدم.