اختبار C# (.NET): الأطر والأدوات للمطور

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

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

ابدأ الدورة

اختبار C# (.NET): مراجعة الأطر والأدوات



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



الأطر الرئيسية لاختبار الوحدات



في .NET Core و.NET 5+، يتم دعم الاختبار المدمج من خلال ثلاثة أطر رئيسية:



  • MSTest — الإطار الكلاسيكي من Microsoft، بسيط للمبتدئين.
  • NUnit — إطار مفتوح المصدر شائع مع مجموعة غنية من السمات.
  • xUnit.net — أداة حديثة وخفيفة ومرنة، أنشأها مؤلف NUnit.


جميعها مدعومة في Visual Studio وRider ومن خلال واجهة dotnet CLI. يعتمد الاختيار على تفضيلات الفريق، لكن xUnit وNUnit يُعتبران أكثر مرونة للسيناريوهات المعقدة.



مثال اختبار باستخدام xUnit

لنختبر آلة حاسبة بسيطة باستخدام xUnit:



using Xunit;

public class Calculator{ public int Add(int a, int b) => a + b; public int Divide(int a, int b) => b == 0 ? throw new DivideByZeroException() : a / b;}

public class CalculatorTests{ [Fact] public void Add_ShouldReturnSum_WhenTwoNumbers() { // Arrange var calc = new Calculator();

// Act var result = calc.Add(3, 5);

// Assert Assert.Equal(8, result); }

[Theory] [InlineData(10, 2, 5)] [InlineData(9, 3, 3)] [InlineData(7, 1, 7)] public void Divide_ShouldReturnQuotient(int a, int b, int expected) { var calc = new Calculator(); var result = calc.Divide(a, b); Assert.Equal(expected, result); }

[Fact] public void Divide_ShouldThrow_WhenDivideByZero() { var calc = new Calculator(); Assert.Throws<DivideByZeroException>(() => calc.Divide(5, 0)); }}


السمة [Fact] تشير إلى اختبار عادي، بينما [Theory] مع [InlineData] تسمح بتشغيل اختبار واحد ببيانات إدخال مختلفة.



أدوات الكائنات الوهمية (Mock)



عند اختبار الوحدات، غالبًا ما نحتاج إلى عزل الفئة المختبرة عن التبعيات الخارجية (قواعد البيانات، واجهات API، نظام الملفات). لهذا الغرض، تُستخدم أطر الكائنات الوهمية:



  • Moq — الأكثر شيوعًا، بناء جملة بسيط، توثيق جيد.
  • NSubstitute — أكثر إيجازًا، مع واجهة fluent.
  • FakeItEasy — واجهة برمجة تطبيقات سهلة لإنشاء كائنات وهمية بسرعة.


مثال استخدام Moq

لنفترض أن لدينا خدمة ترسل البريد الإلكتروني. نريد اختبار المنطق دون إرسال فعلي:



using Moq;using Xunit;

public interface IEmailSender{ void Send(string to, string subject, string body);}

public class NotificationService{ private readonly IEmailSender _sender; public NotificationService(IEmailSender sender) => _sender = sender;

public void NotifyUser(string email, string message) { if (string.IsNullOrWhiteSpace(email)) throw new ArgumentException("Email is required"); _sender.Send(email, "Notification", message); }}

public class NotificationServiceTests{ [Fact] public void NotifyUser_ShouldCallSend_WhenValidEmail() { // Arrange var mockSender = new Mock<IEmailSender>(); var service = new NotificationService(mockSender.Object);

// Act service.NotifyUser("test@example.com", "Hello!");

// Assert mockSender.Verify(s => s.Send("test@example.com", "Notification", "Hello!"), Times.Once); }

[

توصيات