اختبارات C#: Unit, Integration, E2E — دليل شامل لـ .NET

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

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

ابدأ الدورة

الاختبار في C#: من Unit إلى E2E — كيفية بناء بنية تحقق عالية الجودة في .NET



تعتمد جودة البرمجيات بشكل مباشر على نظام الاختبار. في بيئة C# و.NET، يوجد هرم اختبار راسخ: اختبارات الوحدة (unit)، واختبارات التكامل (integration)، والاختبارات الشاملة (end-to-end). في هذه المقالة، سنقوم بتحليل كل مستوى بأمثلة عملية، ونعرض المكتبات التي يجب استخدامها، ونقدم قوالب جاهزة للكود.



1. اختبار الوحدة (Unit-testing): أساس استقرار الكود



تتحقق اختبارات الوحدة من عمل الأساليب أو الفئات أو المكونات الفردية بشكل منفصل عن التبعيات الخارجية (قواعد البيانات، واجهات API، نظام الملفات). الهدف الرئيسي هو العثور بسرعة على الانحدار (regression) أثناء إعادة الهيكلة (refactoring).



الأدوات المستخدمة في C#

  • NUnit — إطار عمل كلاسيكي مع السمات [Test]، [TestCase].
  • xUnit — إطار عمل حديث من مبتكري NUnit، يُفضل في المشاريع الجديدة.
  • Moq — مكتبة لإنشاء كائنات mock.
  • FluentAssertions — لكتابة assert قابلة للقراءة.


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

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



public interface IUserRepository{    bool IsPremiumUser(int userId);}

public class DiscountService{ private readonly IUserRepository _userRepo; public DiscountService(IUserRepository userRepo) => _userRepo = userRepo;

public decimal CalculateDiscount(int userId, decimal amount) { if (_userRepo.IsPremiumUser(userId)) return amount * 0.9m; // خصم 10% return amount; }}

// الاختبارpublic class DiscountServiceTests{ [Fact] public void CalculateDiscount_ForPremiumUser_Returns90Percent() { // Arrange var mockRepo = new Mock<IUserRepository>(); mockRepo.Setup(r => r.IsPremiumUser(It.IsAny<int>())).Returns(true); var service = new DiscountService(mockRepo.Object);

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

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


نصيحة: استخدم [Theory] و [InlineData] في xUnit للاختبارات المعلمية (parameterized tests) — فهذا يقلل من تكرار الكود.



2. اختبار التكامل (Integration-testing): التحقق من ترابط المكونات



تتحقق اختبارات التكامل من كيفية تفاعل وحداتك مع الأنظمة الخارجية الحقيقية: قواعد البيانات، قوائم الانتظار، خدمات الويب. على عكس اختبارات الوحدة، لا يتم استخدام mock هنا — بل نقوم بتشغيل بيئات حقيقية.



المكتبات والمنهجيات

  • TestContainers — يقوم بتشغيل حاويات Docker (PostgreSQL، SQL Server، Redis) مباشرة من الاختبارات.
  • WebApplicationFactory (من Microsoft.AspNetCore.Mvc.Testing) — ينشئ مضيف اختبار ASP.NET Core.
  • Respawn — ينظف قاعدة البيانات بين الاختبارات دون إعادة إنشاء الحاوية.


مثال على اختبار تكامل باستخدام TestContainers و WebApplicationFactory

سنتحقق من أن API الخاص بنا يحفظ المستخدم بشكل صحيح في PostgreSQL:



public class UserApiIntegrationTests : IClassFixture<TestContainersFixture>{    private readonly HttpClient _client;    private readonly TestContainersFixture _fixture;

public UserApiIntegrationTests(TestContainersFixture fixture) { _fixture = fixture; var factory = new WebApplicationFactory<Program>() .WithWebHostBuilder(builder => { builder.ConfigureTestServices(services => { // استبدال سلسلة الاتصال الحقيقية بالحاوية services.RemoveAll<DbContextOptions<AppDbContext>>(); se

المدونات

توصيات الكتب