اختبار في. NET 2.0 الأساسية

اختبارات الوحدة والتكامل مع xUnit

مرحبا!

فيما يلي منشورنا الجديد حول .NET Core.

في السابق ، تعلمنا كيفية نشر تطبيق .NET Core الخاص بنا باستخدام Docker. تأكد من التحقق من ذلك!

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

سيمنحك هذا المنشور فكرة عن كيفية تنفيذ الاختبارات على تطبيق .NET Core.

خبرة شخصية

في Wolox ، نقوم باختبار مشاريع .NET Core الخاصة بنا باستخدام xUnit والأمر test المتوفر على .NET Core CLI. ليست هذه هي الطريقة الوحيدة لاختبار هذا الإطار المحدد ، ولكنها سريعة الإعداد إلى حد ما وتغطي الأساسيات حول كيفية البدء في رحلتك نحو الإنتاجية.

من المهم أن يكون كود المصدر الخاص بالتطبيق جاهزًا للاختبار. في هذا المثال ، سوف نستخدم هذا المشروع ، والذي يتوفر على GitHub.

للحفاظ على البنية نظيفة ، سنقوم بتقسيم الكود الخاص بنا إلى مجلدين:

  • واحد لكود المصدر (src) و ،
  • واحد للاختبارات (اختبار).

يجب علينا إنشاء مشروع اختبار جديد في مجلد الاختبار.

لكل قسم من أقسام هذا المنشور ، سننشئ مشروع اختبار باستخدام الأمر dotnet الجديد الذي يولد مشروع xUnit جديد (dotnet new xunit). بمجرد الانتهاء من مشروع الاختبار ، نحتاج إلى الرجوع إلى الكود المصدري لتطبيقنا في ملف المشروع. يمكننا القيام بذلك باستخدام الأمر التالي:

إضافة إشارة dotnet ROUTE_TO_CSPROJ.csproj

هذا سيتيح لنا استخدام أي أساليب أو فئات محددة في مشروعنا الرئيسي.

اختبارات الوحدة

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

عادة ما تكون هذه الوحدات فئات أو وظائف محددة ، يتم تقييمها لمعرفة ما إذا كانت النتيجة المتوقعة عند استخدام أساليبها تتوافق مع ما نحصل عليه بالفعل.

على سبيل المثال ، سنقوم بإنشاء فئة مساعد (MathHelper.cs) لتضمين الوظائف التي سنختبرها. ستكون هذه فئة ثابتة.

لاختبار هذه الفئات ، سنقوم بإنشاء ملف في مشروع الاختبار الخاص بنا ، يسمى UnitTestMathHelper.cs. هنا ، سوف نحدد فئة بنفس اسم الملف ، وطريقة تسمى TestSum.

تُخبر علامات [Fact] مشروع الاختبار بأننا نقوم بترميز طرق الاختبار. بالنسبة لهذا التطبيق ، سنختبر طريقتين فقط من الطرق المتاحة على المساعد الخاص بنا. طريقة واحدة للقيام بذلك هي باستخدام التعليمات البرمجية التالية:

هنا ، نستخدم أولاً علامة [Fact] ، لذلك سيتم تحديد هذه الطريقة كاختبار.

  • بعد ذلك ، نستخدم بعض المتغيرات لإنشاء بيانات الاختبار الخاصة بنا (الخطان 4 و 5) والنتيجة المتوقعة (السطر 6).
  • الشيء التالي الذي نحتاج إلى فعله هو استدعاء الطريقة التي سنختبرها (في هذه الحالة ، طريقة Sum في السطر 7).
  • أخيرًا ، نحتاج إلى التحقق مما إذا كانت النتيجة التي تم الحصول عليها هي نفس النتيجة التي كنا نتوقعها (السطر 8). بمجرد تنفيذ حالة الاختبار الخاصة بنا ، نحتاج إلى استخدام وظيفة "Assert.Equal´" للسماح للتطبيق بتحديد نتيجة الاختبار.

سيعيد هذا قيمة بناءً على الحالة التي حددناها كشرط لنجاح الاختبار. فئة Assert لها طرق مختلفة تنطبق على مواقف مختلفة.

يمكننا أيضًا استخدام العلامة [Theory] ، إلى جانب [InlineData] إذا أردنا اختبار طريقة باستخدام مدخلات مختلفة ، كما هو موضح في التعليمة البرمجية التالية.

لتشغيل اختبار وحدتنا ، نحتاج فقط للتوجه إلى المجلد الرئيسي باستخدام الجهاز الطرفي لدينا واكتب أمر اختبار dotnet. يجب أن تعطينا نتيجة اختباراتنا. هنا ، نقوم بإجراء 4 اختبارات. واحد لطريقة Sum وواحد لكل من القيم التي تم اختبارها في طريقة الضرب.

أعطها فرصة! حاول إنشاء اختبار لأحد الأساليب في OperationsController. يجب أن نكون قادرين على المثيل مباشرة على طلبك.

خادم الاختبار

يسمح لنا خادم الاختبار باختبار وظائف المكونات المختلفة لتطبيقنا معًا. إنها أكثر تعقيدًا من اختبارات الوحدة ، وذلك لأنها تتطلب منا إعداد خادم لتطبيقنا.

في هذا المثال ، سنختبر فئة جديدة وجهاز تحكم: Hero. يمكن العثور على رمز هذه الفئة الجديدة ووحدة التحكم والملفات الأخرى التي تحتاج إلى تغيير هنا.

بمجرد تعيين ذلك ، يمكننا البدء في كتابة رمز الاختبار.

تتمثل الخطوة الأولى في إضافة حزمة Microsoft.AspNetCore.TestHost NuGet إلى ملف تكوين الاختبار الخاص بنا. يجب أن يبدو ملف مشروعنا كما يلي:

سيوفر لنا ذلك المكتبات اللازمة لإنشاء خادم اختبار لتطبيقنا.

دعنا ننشئ مجلدًا جديدًا في مجلد الاختبار الخاص بنا ونطلق عليه التكامل ، وملف جديد لبدء الخادم نفسه. تُظهر التعليمة البرمجية التالية طريقة واحدة للقيام بذلك:

سنستخدم قاعدة بيانات في الذاكرة لهذا الاختبار ، لذلك نحن بحاجة إلى تغيير كيفية إعداد قاعدة البيانات. للقيام بذلك ، نحتاج إلى إضافة بضعة أسطر في طريقة ConfigureServices الموجودة في ملف Startup.cs في تطبيقنا. إليك الشكل الذي يجب أن يبدو عليه الرمز الجديد:

باستخدام هذه المجموعة ، سنكون قادرين على استخدام خادم الاختبار كما لو كان هو الخادم العادي. يجب أن يعمل الخادم بنفس الطريقة التي يعمل بها تطبيقنا ، ولكنه يسمح لنا بإجراء اختباراتنا مع بيانات الاختبار ، لتجنب تعريض المعلومات المستخدمة في خوادم الإنتاج الخاصة بنا للخطر. تعمل وظائف التأكيد التي استخدمناها سابقًا بنفس الطريقة التي تعمل بها عند إجراء اختبارات الوحدة.

بالنسبة لهذه الاختبارات ، سنقوم أولاً بعمل بعض بيانات الاختبار لاستخدامها في اختباراتنا. في هذه الحالة ، سنقوم بإنشاء بعض "الأبطال" ونخزنها في قائمة ، كما هو موضح في الكود التالي:

سيتم استخدام هذه القائمة في كل من اختباراتنا ، ولكن ليس بالطريقة نفسها. دعنا نلقي نظرة على الاختبار الأول:

إذن ، ماذا نفعل هنا؟

  • أولاً ، نحن نستخدم علامة [Theory] ، والتي تشير إلى أننا سنجري الاختبارات نفسها عدة مرات باستخدام مدخلات اختبار مختلفة. بعد ذلك ، لدينا علامة [MemberData]. يمكن استخدام هذا لإحضار بيانات [النظرية] من خاصية ثابتة. تحتوي هذه السمة على الكثير من الاستخدامات ، في هذه الحالة ، نستخدمها فقط للحصول على المعلومات من خاصية Heroes التي حددناها سابقًا.
  • الشيء التالي الذي نقوم به هو إعطاء طريقتنا اسمًا ومعلمات. كما كنت قد خمنت ، فإن المعلمات المدرجة تطابقت معاملات فئة البطل ، والتي سيتم دمجها لاحقًا (السطر 7) ، وإضافتها إلى قاعدة بياناتنا في الذاكرة (الخطان 9 و 10).
  • الباقي بسيط جدا. نقوم بتقديم طلب إلى التطبيق الخاص بنا ، باستخدام رقم معرف البطل كمعلمة (السطر 12) ونتحقق مما إذا كان رمز حالة الاستجابة على ما يرام (السطر 14).
  • بعد ذلك ، نحصل على "Hero" من الاستجابة ، كسلسلة JSON (السطر 16) ونحولها إلى كائن بطل (السطر 18).
  • أخيرًا ، يمكننا التحقق مما إذا كانت خصائص البطل المدرج (المعرف والاسم) تتوافق مع خصائص بطل الاستجابة (الخطان 20 و 21).

سيتم تشغيل هذا الاختبار لكل من الأبطال المحددين في خاصية الأبطال.

دعنا نلقي نظرة على الاختبار التالي:

هنا ، نحن نتبع نهجًا مختلفًا تجاه أبطالنا:

  • كما ترى ، نستخدم أولاً العلامة [Fact] بدلاً من [MemberData]. وذلك لأن هذه المرة ، سوف نستخدم خاصية "الأبطال" ككل ، بدلاً من اختبار إدخال كل بطل بشكل منفصل.
  • باستخدام Linq ، يمكننا تحويل قائمة هذا الكائن [] إلى قائمة Hero (الأسطر 5 إلى 10) وإدراج الشيء بالكامل في قاعدة البيانات الخاصة بنا (الأسطر 12 إلى 13).
  • والخطوة التالية هي تحديد القيمة المتوقعة للاستجابة (في هذه الحالة ، البطل ذو أقصر ارتفاع ، راجع السطر 15).
  • مرة أخرى ، سنقدم طلبًا إلى تطبيقنا (السطر 17) ، ونفحص رمز حالة الاستجابة (السطر 19) ، ونخرج JSON من الاستجابة (السطر 21) ونحوله إلى كائن Hero (السطر 23).
  • يتم إجراء المقارنة النهائية بنفس الطريقة ، للتحقق من أن خصائص البطل التي حصلنا عليها من الاستجابة هي نفسها التي نتوقعها (الخطان 25 و 26).

الآن ، يمكننا تشغيل اختبار dotnet الخاص بالأوامر test ونرى نتيجة اختباراتنا. إذا كان كل شيء على ما يرام ، فستتلقى رسالة "اختبار التشغيل الناجح". إذا فشل أي من اختباراتنا ، فستتلقى رسالة "فشل الاختبار" مع معلومات حول ما حدث.

هذا هو!

يمكننا الجمع بين اختبارات الوحدة والتكامل لمشروعنا ، وإعدادهم كما نريد. من المهم ملاحظة أنه يوصى عادةً باستخدام قاعدة بيانات اختبار لتجنب التضحية بالمعلومات التي قد لا يمكن استردادها في حالة تلفها / الكتابة فوقه. هنا ، نقوم بإعداد قاعدة بيانات في الذاكرة ، ولكن إذا لزم الأمر يمكنك إعداد قاعدة بيانات للعمل بنفس الطريقة التي تعمل بها قاعدة البيانات العادية لتجنب التضحية بالمعلومات التي قد لا يتم استردادها في حالة تلفها / الكتابة فوقه.

الآن ، يمكنك تطوير اختبارات تلقائية لتطبيقات .NET Core. جربها! إذا كنت تريد اللعب ، يمكنك دائمًا تجربة نموذج التطبيق.

ترقبوا المنصب التالي.

اختبار سعيد!