اختبار في Java: نظرة عامة على الأطر والأدوات
الاختبار عالي الجودة هو جزء لا يتجزأ من التطوير في Java. تتيح الأطر الحديثة أتمتة التحقق من الكود، واكتشاف الأخطاء في المراحل المبكرة، وضمان استقرار التطبيق. في هذه المقالة، سنستعرض الأدوات الرئيسية لاختبار الوحدات، وإنشاء الكائنات الوهمية (mocking)، واختبار التكامل في Java، بالإضافة إلى تقديم أمثلة عملية لاستخدامها.
1. JUnit 5 — معيار اختبار الوحدات
JUnit 5 (Jupiter) هو الإطار الأكثر شيوعًا لاختبار الوحدات في Java. يوفر تعليقات توضيحية (annotations) لتحديد طرق الاختبار، وإدارة دورة الحياة، والمعاملات.
التعليقات التوضيحية الرئيسية في JUnit 5:
@Test— تشير إلى طريقة اختبار@BeforeEach/@AfterEach— يتم تنفيذها قبل/بعد كل اختبار@BeforeAll/@AfterAll— يتم تنفيذها مرة واحدة للفئة بأكملها@ParameterizedTest— للاختبارات ببيانات إدخال مختلفة
مثال على اختبار بسيط:
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;
public class CalculatorTest {
@Test void testAddition() { Calculator calc = new Calculator(); assertEquals(5, calc.add(2, 3)); }
@Test void testDivisionByZero() { Calculator calc = new Calculator(); assertThrows(ArithmeticException.class, () -> calc.divide(10, 0)); }}2. TestNG — بديل بإمكانيات موسعة
TestNG (Test Next Generation) هو إطار قوي آخر مستوحى من JUnit، لكنه يوفر وظائف إضافية: تجميع الاختبارات، والاختبارات التابعة، والتنفيذ المتوازي، والتكوينات المرنة عبر XML.
الميزات المميزة لـ TestNG:
@Test(groups = {"smoke"})— تجميع الاختبارات@DataProvider— تمرير البيانات إلى الاختبارات@Test(dependsOnMethods = {"methodA"})— التبعيات بين الاختبارات
مثال مع DataProvider:
import org.testng.annotations.DataProvider;import org.testng.annotations.Test;import static org.testng.Assert.assertEquals;
public class DataDrivenTest {
@DataProvider(name = "testData") public Object[][] createData() { return new Object[][] { { 1, 2, 3 }, { 5, -3, 2 }, { 0, 0, 0 } }; }
@Test(dataProvider = "testData") public void testAdd(int a, int b, int expected) { Calculator calc = new Calculator(); assertEquals(calc.add(a, b), expected); }}3. Mockito — إنشاء الكائنات الوهمية (mocks)
Mockito هي مكتبة لإنشاء الكائنات الوهمية في Java. تتيح عزل المكون الذي يتم اختباره عن تبعياته (قواعد البيانات، الخدمات الخارجية) والتحقق من التفاعل بين الكائنات.
الإمكانيات الرئيسية لـ Mockito:
mock()— إنشاء كائن وهميwhen().thenReturn()— تحديد السلوكverify()— التحقق من استدعاءات الطرق@Mockو@InjectMocks— الحقن التلقائي للكائنات الوهمية
مثال على استخدام Mockito:
import static org.mockito.Mockito.*;import org.junit.jupiter.api.Test;
public class UserServiceTest {
@Test void testGetUser() { // إنشاء كائن وهمي للمستودع UserRepository mockRepo = mock(UserRepository.class); when(mockRepo.findById(1L)).thenReturn(new User("Alice"));
UserService service = new UserService(mockRepo); User user = service.getUser(1L);
assertEquals("Alice", user.getName()); verify(mock