اختبار C#: Unit و Integration و E2E من الألف إلى الياء

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

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

ابدأ الدورة

مقدمة: لماذا الاختبار ليس رفاهية بل ضرورة



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



كثير من المطورين، خاصة المبتدئين، ينظرون إلى الاختبارات على أنها "عمل إضافي". لكن في الواقع، يوفر الاختبار ساعات من التصحيح وإعادة الهيكلة. في هذه المقالة، سنستعرض ثلاثة مستويات رئيسية للاختبار في بيئة C#: Unit (اختبارات الوحدة)، Integration (اختبارات التكامل)، و E2E (اختبارات النهاية إلى النهاية). سترى كيف يحل كل منها مشاكله الخاصة، وما الأدوات التي يجب استخدامها، وكيفية كتابة اختبارات نظيفة وقابلة للصيانة.



1. اختبارات الوحدة: أساس الجودة



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



أدوات اختبارات الوحدة في C#



أكثر الأطر شيوعًا لـ .NET هي xUnit (الموصى بها من Microsoft) و NUnit. لاستبدال التبعيات، تُستخدم مكتبة Moq أو FakeItEasy المدمجة في .NET.



مثال على اختبار وحدة (xUnit + Moq)



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



public class DiscountService{    private readonly IUserRepository _userRepo;

public DiscountService(IUserRepository userRepo) { _userRepo = userRepo; }

public decimal CalculateDiscount(int userId, decimal orderTotal) { var user = _userRepo.GetById(userId); if (user.IsVip) return orderTotal * 0.2m; // خصم 20% return orderTotal * 0.05m; // خصم 5% }}


اختبار لهذه الدالة:



public class DiscountServiceTests{    [Fact]    public void CalculateDiscount_WhenUserIsVip_Returns20Percent()    {        // Arrange        var mockRepo = new Mock<IUserRepository>();        mockRepo.Setup(repo => repo.GetById(1))                .Returns(new User { Id = 1, IsVip = true });        var service = new DiscountService(mockRepo.Object);

// Act var result = service.CalculateDiscount(1, 100m);

// Assert Assert.Equal(20m, result); }}


هام: في اختبارات الوحدة، لا نصل إلى قاعدة البيانات الحقيقية. نستخدم mock لعزل منطق DiscountService.



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



تتحقق اختبارات التكامل من تفاعل عدة مكونات حقيقية: قاعدة البيانات، API، نظام الملفات. في .NET، يُستخدم لهذا غالبًا WebApplicationFactory (لـ ASP.NET Core) والحاويات الاختبارية (Testcontainers).



خصائص اختبارات التكامل



  • أبطأ من اختبارات الوحدة — تتطلب تشغيل البنية التحتية (قاعدة بيانات، خادم HTTP).
  • أغلى في الصيانة — تحتاج إلى إدارة حالة بيئة الاختبار.
  • قيمتها — تكشف مشاكل في التهيئة، تعيين البيانات، العمل مع قاعدة البيانات الحقيقية.


مثال على اختبار تكامل (ASP.NET Core + xUnit)



لنفترض أن لدينا متحكمًا للتعامل مع الطلبات. سيتحقق الاختبار من أن الطلب إلى API الحقيقي يُرجع JSON صحيحًا:



public class OrdersApiTests : IClassFixture<WebApplicationFactory<Program>>{    private readonly HttpClient _client;

public OrdersApiTests(WebApplicationFactory<Program> factory) { _client = f

المدونات

توصيات الكتب