اختبار الوحدة في Asp.Net: البرنامج التعليمي الكامل

⚡ ملخص ذكي

يبدأ اختبار وحدة تطبيق ASP.NET في Visual Studio بمشروع اختبار الوحدة، ويربط مرجعًا بالمشروع المستهدف، ويضيف سمات MSTest [TestClass] و[TestMethod]، ويستدعي أساليب Assert لإثبات أن الفئات تتصرف كما هو مصمم.

  • 🧪 مشروع تجريبي: أضف مشروع اختبار الوحدة إلى حل ASP.NET وقم بالإشارة إلى المشروع المستهدف الذي تريد التحقق منه.
  • 🏷️ سمات: قم بتمييز الفئة بـ [TestClass] وكل اختبار بـ [TestMethod] حتى يتمكن MSTest من اكتشافها.
  • التأكيدات: استخدم Assert.AreEqual و Assert.IsTrue وما شابهها من استدعاءات لتحديد النتيجة المتوقعة لكل اختبار.
  • ▶ ️ إجراء الاختبارات: قم بتشغيل قائمة "تنفيذ الاختبار" وقم بتشغيل جميع الاختبارات داخل Visual Studio وافحص مستكشف الاختبار لمعرفة نتائج النجاح والفشل.
  • 🇧🇷 اختيار الإطار: تعمل كل من MSTest و NUnit و xUnit مع اختبار dotnet؛ يأتي MSTest بشكل افتراضي، ويفضل استخدام xUnit لـ ASP.NET Core.
  • 🛠️ أفضل ممارسة: قم بعزل الوحدة، واتبع خطوات الترتيب والتنفيذ والتأكيد، وحافظ على سرعة المجموعة الكاملة بحيث يتم تشغيلها في كل عملية إيداع.

اختبار الوحدات في ASP.NET

يعد الاختبار جانبًا أساسيًا في أي لغة برمجة. الاختبار يمكن إنشاء تطبيقات ASP.NET بمساعدة Visual Studio.

يُستخدم Visual Studio لإنشاء أكواد الاختبار، كما يُستخدم لتشغيلها في تطبيقات ASP.NET. بهذه الطريقة، يصبح من السهل التحقق من أي أخطاء في هذه التطبيقات. يأتي Visual Studio مزودًا بوحدة اختبار جاهزة للاستخدام، مما يتيح إجراء اختبارات مباشرة لمشروع ASP.NET.

مقدمة في اختبار ASP.NET

يُعد اختبار الوحدة المستوى الأول لاختبار مشاريع ASP.NET، حيث يركز هذا الاختبار على وظائف التطبيق لضمان عمله بالشكل المتوقع. في ASP.NET، تتمثل الخطوة الأولى في إنشاء مشروع اختبار في Visual Studio، والذي سيحتوي على التعليمات البرمجية اللازمة لاختبار التطبيق.

لننظر إلى صفحة الويب أدناه. تحتوي الصفحة على الرسالة التالية: "Guruتم عرض رسالة "99 – ASP.NET". كيف نتأكد من عرض الرسالة الصحيحة عند تشغيل مشروع ASP.NET؟ يتم ذلك بإضافة مشروع اختبار إلى حل ASP.NET (المستخدم لتطوير تطبيقات الويب). يضمن مشروع الاختبار هذا عرض الرسالة الصحيحة للمستخدم.

مقدمة في اختبار ASP.NET

دعونا نلقي نظرة أكثر تفصيلاً الآن ونرى كيف يمكننا العمل على الاختبار في ASP.NET.

إنشاء مشروع اختبار وحدة .NET

قبل أن نقوم بإنشاء مشروع اختباري، نحتاج إلى تنفيذ الخطوات عالية المستوى أدناه.

  1. استخدم "DemoApplication" الخاص بنا والمستخدم في الأقسام السابقة. سيكون هذا هو تطبيقنا الذي يحتاج إلى الاختبار.
  2. سنضيف فئة جديدة إلى تطبيق العرض التوضيحي. ستحتوي هذه الفئة على سلسلة نصية تسمى 'Guru99 – ASP.NET. سيتم اختبار هذه السلسلة في مشروع الاختبار الخاص بنا.
  3. وأخيرًا، سنقوم بإنشاء مشروع اختبار. يُستخدم هذا المشروع لاختبار تطبيق ASP.NET.

لذا دعونا نتبع الخطوات العامة المذكورة أعلاه ونرى كيفية تنفيذ الاختبار.

الخطوة 1) تأكد من أن DemoApplication مفتوح في Visual Studio.

الخطوة 2) لنضف الآن فئة جديدة إلى تطبيق العرض التوضيحي. ستحتوي هذه الفئة على سلسلة نصية تسمى 'Guru99 – ASP.NET. سيتم اختبار هذه السلسلة في مشروع الاختبار الخاص بنا.

اتبع الخطوة أدناه لإضافة فئة جديدة.

إنشاء مشروع اختبار وحدة .NET

  1. في Visual Studio، انقر بزر الماوس الأيمن فوق "DemoApplication" في مستكشف الحلول.
  2. اختر الخيار إضافة->فئة من قائمة السياق.

الخطوة 3) في هذه الخطوة،

إنشاء مشروع اختبار وحدة .NET

  1. قم بتسمية "Tutorial.cs" للفئة الجديدة.
  2. انقر فوق الزر "إضافة" لإضافة الملف إلى DemoApplication.

الآن، تتم إضافة فئة جديدة إلى ملف "DemoApplication".

الخطوة 4) افتح ملف Tutorial.cs الجديد من "DemoApplication". أضف السلسلة "Guru99 – ASP.NET."

لفتح الملف، انقر نقرًا مزدوجًا فوق الملف Tutorial.cs في مستكشف الحلول.

إنشاء مشروع اختبار وحدة .NET

سيكون للملف بعض التعليمات البرمجية الافتراضية المكتوبة بالفعل. لا تهتم بهذا الكود، فقط أضف السطر أدناه من الكود.

إنشاء مشروع اختبار وحدة .NET

namespace DemoApplication
{
  public class Tutorial
  {
     public String Name;
     public Tutorial()
     {
        Name = "Guru99 - ASP.Net";
     }
  }
}

Code تفسير:-

  1. متغير الاسم هو من نوع السلسلة.
  2. وأخيرًا، في دالة البناء الخاصة بفئة Tutorial، قم بتعيين قيمة المتغير Name. يتم تعيين القيمة إلى "Guru99 – ASP.NET

الخطوة 5) انتقل الآن إلى ملف demo.aspx وأضف أسطر التعليمات البرمجية لعرض النص "Guru99 – ASP.NET."

إنشاء مشروع اختبار وحدة .NET

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
    <body>
    <form id="form1" runat="server">
    <div>
        <% DemoApplication.Tutorial tp=new DemoApplication.Tutorial();%>
        <%=tp.Name%>
    </div>
    </form>
    </body>
</html>

Code تفسير:-

  1. يُنشئ السطر الأول كائنًا من الفئة 'Tutorial'. هذه هي الخطوة الأولى عند التعامل مع الفئات والكائنات. اسم الكائن هو 'tp'.
  2. أخيرًا نسمي "tutorial.cs" من ملف demo.aspx. يعرض قيمة متغير الاسم.

عند تشغيل البرنامج أعلاه في Visual Studio، سوف تحصل على الإخراج التالي.

انتاج:-

إنشاء مشروع اختبار وحدة .NET

من المخرجات، ترى الرسالة "Guruتم عرض "99 – ASP.NET".

الخطوة 6) والآن، دعونا نضيف مشروع الاختبار الخاص بنا إلى تطبيق العرض التوضيحي. يتم ذلك بمساعدة Visual Studio.

إنشاء مشروع اختبار وحدة .NET

  1. انقر بزر الماوس الأيمن فوق الحل - DemoApplication.
  2. في قائمة السياق، اختر الخيار "مشروع جديد".

الخطوة 7) تتضمن الخطوة إضافة مشروع اختبار الوحدة إلى التطبيق التجريبي.

إنشاء مشروع اختبار وحدة .NET

  1. انقر على نوع العنصر كـ "اختبار" من اللوحة اليمنى.
  2. قم باختيار العنصر "مشروع اختبار الوحدة" من القائمة التي تظهر في الجزء الأوسط من مربع الحوار.
  3. إعطاء اسم لمشروع الاختبار. في حالتنا، الاسم المعطى هو "DemoTest".
  4. وأخيرا، انقر فوق الزر "موافق".

ستشاهد في النهاية إضافة مشروع DemoTest إلى مستكشف الحلول. باستخدام هذا، يمكنك أيضًا رؤية ملفات أخرى مثل UnitTest1.cs والخصائص وما إلى ذلك يتم إنشاؤها افتراضيًا.

إنشاء مشروع اختبار وحدة .NET

تشغيل مشروع الاختبار

يُستخدم مشروع الاختبار الذي تم إنشاؤه في القسم السابق لاختبار تطبيق ASP.NET الخاص بنا. في الخطوات التالية، سنرى كيفية تشغيل مشروع الاختبار.

  • تتمثل الخطوة الأولى في إضافة مرجع إلى مشروع ASP.NET. تُنفذ هذه الخطوة لتمكين مشروع الاختبار من الوصول إلى مشروع ASP.NET.
  • ثم سنكتب رمز الاختبار الخاص بنا.
  • وأخيرًا، سوف نقوم بتشغيل الاختبار باستخدام Visual Studio.

الخطوة 1) لاختبار تطبيقنا التجريبي، يحتاج مشروع الاختبار الأول إلى الرجوع إلى التطبيق التجريبي. إضافة مرجع إلى الحل Demo.aspx.

تشغيل مشروع اختبار .NET

  1. انقر بزر الماوس الأيمن فوق مشروع الاختبار التجريبي
  2. من القائمة اختر خيار إضافة->مرجع.

الخطوة 2) الخطوة التالية هي إضافة مرجع إلى DemoApplication.

تشغيل مشروع اختبار .NET

  1. حدد خيار المشاريع من الجانب الأيسر لمربع الحوار
  2. انقر فوق مربع الاختيار بجوار DemoApplication
  3. انقر على زر "موافق".

سيسمح هذا لمشروع تجريبي باختبار التطبيق التجريبي الخاص بنا.

الخطوة 3) حان الآن وقت إضافة رمز الاختبار إلى مشروع الاختبار الخاص بنا.

  • للقيام بذلك، انقر نقرًا مزدوجًا أولاً على ملف UnitTest1 (يتم إضافة ملف UnitTest1 تلقائيًا بواسطة Visual Studio عند إنشاء مشروع الاختبار) في مستكشف الحلول.
  • هذا هو الملف الذي سيتم تشغيله لاختبار مشروع ASP.NET.

تشغيل مشروع اختبار .NET

ستشاهد الكود أدناه الذي تمت إضافته بواسطة Visual Studio في ملف UnitTest1.cs. هذا هو الكود الأساسي المطلوب لتشغيل مشروع الاختبار.

تشغيل مشروع اختبار .NET

الخطوة 4) الخطوة التالية هي إضافة الكود المستخدم لاختبار السلسلة "Guru99 – ASP.NET."

تشغيل مشروع اختبار .NET

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using DemoApplication;

namespace DemoTest
{
 [TestClass]
 public class UnitTest1
 {
   [TestMethod]
   public void TestMethod1()
   {
      Tutorial tp = new Tutorial();
      Assert.AreEqual(tp.Name,"Guru99 - ASP.Net");
   }
 }
}
  1. قم بإنشاء كائن جديد يسمى "tp" من النوع Tutorial
  2. تُستخدم دالة Assert.AreEqual في .NET لاختبار ما إذا كانت قيمة ما تساوي قيمة أخرى. لذا، في حالتنا، نقارن قيم tp.Name بـ Guru99 – ASP.NET.

الخطوة 5) والآن، لنُشغّل مشروع الاختبار. للقيام بذلك، نحتاج إلى الذهاب إلى خيار القائمة: اختبار -> تشغيل -> جميع الاختبارات

تشغيل مشروع اختبار .NET

انتاج:-

تشغيل مشروع اختبار .NET

ستظهر نافذة مستكشف الاختبار في Visual Studio. سيؤدي ذلك إلى عرض النتيجة المذكورة أعلاه وإظهار أن الاختبار تم تشغيله بنجاح في Visual Studio.

سمات وتأكيدات اختبار MSTest التي ستستخدمها

استخدم Microsoftتوفر مساحة الاسم .VisualStudio.TestTools.UnitTesting مجموعة صغيرة من السمات والتأكيدات التي تغطي معظم اختبارات وحدة ASP.NET. إن تعلم هذه السمات أولاً يجعل قراءة وصيانة كل اختبار لاحق أسهل.

  • [فئة الاختبار] – يشير هذا إلى أن الفئة عبارة عن حاوية للاختبارات. يقوم MSTest بفحص الفئات التي تحتوي على هذه السمة عند اكتشافها.
  • [طريقة الاختبار] يشير الرمز `-` إلى دالة عامة بدون معلمات كاختبار فردي. تُرجع الدالة قيمة فارغة (void) أو من نوع Task أو ValueTask.
  • [اختبار التهيئة] / [اختبار التنظيف] – يتم تشغيلها قبل وبعد كل طريقة اختبار. استخدمها لإنشاء إعدادات مشتركة والتخلص منها، مثل مستودع وهمي أو سياق في الذاكرة.
  • [تهيئة الفئة] / [تنظيف الفئة] – يتم تشغيلها مرة واحدة للفصل بأكمله. وهي مفيدة عندما يكون الإعداد مكلفًا، على سبيل المثال عند تهيئة قاعدة بيانات اختبارية.
  • [DataRow] و [DataTestMethod] – توفير مدخلات مُعَلمة بحيث تغطي طريقة اختبار واحدة عدة حالات.

داخل كل دالة اختبار، تتحقق فئة Assert من النتيجة. تشمل الاستدعاءات الشائعة Assert.AreEqual لمقارنة القيم، وAssert.IsTrue وAssert.IsFalse للقيم المنطقية، وAssert.IsNull وAssert.IsNotNull للمراجع، وAssert.ThrowsException للاستثناءات المتوقعة. صمّم كل اختبار باستخدام نمط الترتيب، والتنفيذ، والتأكيد (Arrange, Act, Assert) بحيث تبقى مراحل الإعداد والاستدعاء والتحقق منفصلة بصريًا. يُسهّل هذا التصميم تصحيح أخطاء الاختبارات الفاشلة لأن السطر الفاشل غالبًا ما يكون هو سطر التأكيد الوحيد في الأسفل.

مقارنة بين MSTest وNUnit وxUnit لـ ASP.NET

تهيمن ثلاثة أطر اختبار على بيئة .NET. يعمل كل منها داخل Visual Studio ويتكامل مع dotnet test، لذا فإن الاختلاف يكمن في الغالب في الأسلوب ودعم المجتمع والسلوك الافتراضي.

  • MSTest – تم الشحن بواسطة Microsoft ويأتي مُثبّتًا مسبقًا مع قالب مشروع اختبار الوحدات في Visual Studio الذي استُخدم سابقًا في هذا البرنامج التعليمي. وهو الخيار الافتراضي الأكثر أمانًا عندما يكون الفريق جديدًا على اختبار الوحدات. Microsoft كومة.
  • NUnit – الأقدم بين الثلاثة، تم نقله أصلاً من JUnit. يوفر نموذج قيود غني، واختبارات ذات معلمات من خلال TestCase و TestCaseSource، ودعمًا ناضجًا عبر كل إصدار من .NET.
  • xUnit.net – يستخدم داخليًا من قبل فرق ASP.NET Core و Entity Framework Core. يستبدل أسلوب SetUp بالمنشئ و IDisposable، ويشجع على استخدام فئة اختبار واحدة لكل سلوك، ويستخدم [Fact] و [Theory] بدلاً من [TestMethod].

تكتشف جميع الأطر الثلاثة الاختبارات من خلال السمات، وتُشغّلها باستخدام أمر dotnet test، وتُنتج تقارير XML بصيغة trx أو xUnit التي تستخدمها خطوط أنابيب التكامل المستمر مثل Azure DevOps، وGitHub Actions، و Jenkins يمكن استهلاكها مباشرةً. بالنسبة لأول مشروع ASP.NET، يُفضّل استخدام MSTest لتبسيط سلسلة الأدوات. أما الفرق التي ترغب في مزيد من خيارات التخصيص أو التي تستخدم ASP.NET Core بالفعل، فغالبًا ما تختار xUnit لضمان التوافق مع إطار العمل الذي بُني عليه.

أفضل الممارسات لاختبار الوحدة لتطبيقات ASP.NET

اتباع مجموعة صغيرة من العادات يحافظ على سرعة وموثوقية وفائدة مجموعة البرامج طوال عمر مشروع ASP.NET.

  1. اختبر سلوكًا واحدًا لكل طريقة. الاختبار الذي يؤكد عدة أشياء غير مترابطة يفشل لأسباب عديدة ويستغرق وقتاً أطول لإصلاحه.
  2. قم بتسمية الاختبارات وفقًا للغرض. نمط مثل MethodUnderTest_Scenario_ExpectedResult يجعل مخرجات مستكشف الاختبار عبارة عن مواصفات قابلة للقراءة للفئة.
  3. اعزل الوحدة عن الأنظمة الخارجية. قم بتغليف استدعاءات الملفات والشبكة وقواعد البيانات خلف واجهات واستبدلها بنماذج وهمية أو محاكاة حتى لا يصطدم الاختبار بالتبعية الحقيقية.
  4. حافظ على سرعة الاختبارات. استهدف إنهاء مجموعة الاختبارات الكاملة في ثوانٍ. يتم تخطي الاختبارات البطيئة، وتخفي الاختبارات المتخطاة الأخطاء.
  5. اتبع نموذج الترتيب، والتنفيذ، والتأكيد. تشير ثلاثة مربعات قصيرة ذات خطوط فارغة بينها إلى النية وتسهل اكتشاف الخطوط الفاشلة.
  6. قم بإجراء الاختبارات على كل عملية إيداع. قم بتوصيل اختبار .NET بخط أنابيب التكامل المستمر (CI) بحيث يؤدي الاختبار المعطل إلى منع الدمج بدلاً من النشرping إلى الإنتاج.
  7. Tracتغطية الكود k، ولكن لا تسعى وراءها. تسلط التغطية الضوء على المسارات غير المختبرة، لكن العدد الكبير وحده لا يضمن الجودة. Revانظر ماذا تفعل الأسطر المفقودة بالفعل.

عند تطبيق هذه الممارسات معًا، فإنها تحول مشروع DemoTest المبني أعلاه إلى نواة لمجموعة أدوات تلتقط الأخطاء في كل عملية دفع، وتوثق السلوك للمطورين المستقبليين، وتمنح الثقة عند إعادة هيكلة تطبيق ASP.NET.

الأسئلة الشائعة

نعم. يمكن لـ GitHub Copilot إنشاء كتل [TestClass] و [TestMethod]، واقتراح تخطيطات Arrange Act Assert، وإنشاء حالات [DataRow] ذات المعلمات من توقيع طريقة الهدف. Revراجع التأكيدات المُولّدة قبل الوثوق بها في بيئة الإنتاج.

نعم. يمكن للمساعدين المعتمدين على التعلم الآلي تحديد الاختبارات الهشة، واقتراح أسماء أفضل، وتسليط الضوء على الإعدادات المكررة التي تنتمي إلى [TestInitialize]. إنهم يقللون من وقت المراجعة، لكن المطور يظل مسؤولاً عن صحة كل تأكيد.

يعزل اختبار الوحدة فئةً أو دالةً واحدةً ويُحاكي تبعياتها. أما اختبار التكامل فيختبر عدة مكونات معًا، وغالبًا ما يتصل بقاعدة بيانات أو خادم ويب حقيقي. تُنفَّذ اختبارات الوحدة في أجزاء من الثانية، بينما تستغرق اختبارات التكامل وقتًا أطول، لكنها تكشف أخطاء الربط.

في Visual Studio Enterprise، استخدم تحليل الاختبار Code تغطية لجميع الاختبارات. في الطبعات الأخرى، أضف الغلاف رقم NuGet قم بتجميع الحزمة وتشغيل الأمر dotnet test --collect:"XPlat Code "تغطية" لإنتاج Cobertura تقرير XML.

قم بتغليف التبعية خلف واجهة وحقنها عبر المُنشئ. في الاختبار، مرر نموذجًا وهميًا أو كائنًا مُحاكيًا تم إنشاؤه باستخدام مكتبات مثل Moq أو NSubstitute بحيث لا تتصل الوحدة قيد الاختبار بقاعدة البيانات الحقيقية أو نقطة نهاية HTTP.

شغّل الأمر `dotnet test` في المجلد الذي يحتوي على مشروع الاختبار. يقوم هذا الأمر ببناء المشروع، واكتشاف جميع دوال الاختبار (`TestMethod`)، وتنفيذها، ثم طباعة ملخص لها. تستخدم أنظمة التكامل المستمر، مثل GitHub Actions، الأمر نفسه ضمن خطوة من خطوات سير العمل.

قم بتحديد الدالة باستخدام [DataTestMethod] وأضف سمة واحدة أو أكثر من سمات [DataRow] التي توفر قيم الإدخال والنتيجة المتوقعة. ثم يقوم MSTest بتشغيل نفس النص مرة واحدة لكل صف، مما ينتج عنه سطر منفصل في مستكشف الاختبار لكل حالة.

اكتب دالة اختبار فاشلة ([TestMethod]) تصف السلوك المطلوب التالي، ثم أضف إليها ما يكفي من التعليمات البرمجية اللازمة لنجاح الاختبار، ثم أعد هيكلة الكود. يُحافظ تكرار هذه العملية (الاختبار، إعادة الهيكلة، إعادة البناء) على توجيه التصميم بالاختبارات بدلاً من العكس.

تلخيص هذه التدوينة بـ: