البرمجة وتطوير البرمجيات

كيف يختبر MSTest تطبيقات .NET المبنية بـ Native AOT قبل الشحن

يتيح MSTest 4.4 توليد مصدر الاختبارات وتشغيلها كملف أصلي باستخدام Native AOT، بما يجعل مسار الاختبار أقرب إلى نموذج النشر الفعلي للتطبيق. وتوصي Microsoft بإبقاء الاختبارات المُدارة، وإضافة مسار Native AOT محدود في CI مع التحقق من تطابق عدد الاختبارات والنتائج.

03 سبتمبر 2026
4 دقائق قراءة
291 قراءة
certi.news Editorial Team
كيف يختبر MSTest تطبيقات .NET المبنية بـ Native AOT قبل الشحن

يتيح MSTest 4.4 تشغيل مشاريع الاختبارات باستخدام نموذج النشر نفسه الذي قد يعتمد عليه التطبيق في الإنتاج، عبر توليد مصدر الاختبارات وتمكين Native AOT والتقليص. الفكرة لا تستهدف استبدال تشغيل الاختبارات المُدار المعتاد، بل إضافة مسار أصلي يكشف مشكلات مرتبطة بالتجميع المسبق وحذف الشيفرة غير المستخدمة قبل شحن التطبيق.

وبحسب Amaury Levé، Principal Software Engineer، فإن استخدام MSTest.Sdk/4.4.0 مع استهداف net10.0 وتعيين PublishAot=true يفعّل توليد مصدر MSTest ومسار الملف التنفيذي الأصلي. ويستخدم MSTest.Sdk منصة Microsoft Testing Platform، أو MTP، افتراضياً. أما المشاريع التي ما زالت تستخدم VSTest فعليها مراجعة إرشادات الانتقال إلى MTP، لأن معاملات سطر الأوامر وتكامل CI وبعض إدخالات .runsettings المدعومة تختلف.

ما الذي يتغير عملياً؟

بعد إعداد المشروع، ينبغي نشر الاختبارات لنظام التشغيل والمعمارية نفسيهما اللذين يستهدفهما التطبيق. يورد المصدر مثالاً باستخدام المعرّف linux-x64، مع إمكانية استبداله بقيم مثل win-x64 أو osx-arm64. وبعد النشر يُشغّل الملف التنفيذي الناتج مباشرة، أو باستخدام الامتداد .exe على Windows.

هذا المسار يقلل الاعتماد على الفحص الانعكاسي الشامل للتجميع، مثل استدعاء Assembly.GetTypes()، كما يستخدم سمات ومفوضات مولدة لإنشاء الاختبارات المدعومة واستدعائها. لكن توليد المصدر لا يعني انعدام Reflection؛ إذ يحتفظ وضع ReflectionFree الافتراضي ببعض المسارات الانعكاسية الاحتياطية. وعند التحقيق في مشكلات التوافق، يمكن استخدام MSTestSourceGenMode=Rooting للحفاظ على أعضاء الاختبارات المكتشفة مع استمرار التنفيذ الانعكاسي.

مسار CI محدود قبل التوسع

التوصية العملية هي الإبقاء على تشغيل الاختبارات المُدارة السريع للتغذية الراجعة اليومية، ثم اختيار مشروع اختبارات واحد ذي صلة مباشرة بمسار النشر وإضافة تجربة Native AOT في CI. يجب مقارنة المسارين في ثلاثة جوانب واضحة:

  • اكتشاف العدد نفسه تماماً من الاختبارات.
  • الحصول على النتائج نفسها للاختبارات.
  • تسجيل زمن النشر والتشغيل الأصلي منفصلاً عن زمن تنفيذ الاختبارات.

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

قيود يجب تحويلها إلى بوابات قبول

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

وتشمل القيود الأخرى أساليب الاختبار العامة، أو التي تستخدم معاملات ref أو out أو in، إضافة إلى عدم دعم بعض أنماط الأجزاء الثابتة عبر [AssemblyFixtureProvider]. كما أن بعض تكاملات MSTest SDK وامتدادات MTP وتقارير CI غير متاحة في مسار Native AOT، بينما يظل دعما TRX وCode Coverage متاحين وفق المادة. ولهذا ينبغي التعامل مع تحذيرات المحلل وتشخيصات البناء كبوابات للانتقال، لا كتحذيرات تُسكت.

لماذا يهم هذا الأسلوب؟

الاختبار المُدار ومسار Native AOT يجيبان عن سؤالين مختلفين: الأول يسرّع دورة التطوير، والثاني يتحقق من أن الاختبارات نفسها تستطيع العمل ضمن نموذج النشر الذي سيستخدمه التطبيق. هذا لا يعادل اختباراً شاملاً لقطعة الإنتاج النهائية؛ فالإعدادات ونظام التشغيل والمعمارية والخدمات الخارجية والتغليف قد تختلف. لكنه يزيل متغيراً مهماً، هو اختلاف نموذج التقليص والترجمة المسبقة بين الاختبار والتطبيق.

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

مصدر الخبر
كيف أعددنا هذا الخبر؟

اعتمد الخبر على المصدر الأصلي الموضح أعلاه. قد نستخدم أدوات آلية للمساعدة في الاستخراج والتصنيف والصياغة، لكن النشر يخضع لقواعد تمنع المحتوى المكرر والقصير أو الروتيني منخفض القيمة. اقرأ سياستنا التحريرية.

c
كاتب المقال

certi.news Editorial Team

certi.news Editorial Team

The certi.news editorial team monitors technical sources and reconstructs news, verifying facts and context prior to publication.

ما الذي تحتاج معرفته

يضيف MSTest 4.4 مسارًا لتوليد مصدر الاختبارات وتشغيلها كملف أصلي باستخدام Native AOT، بما يقرّب الاختبار من نموذج نشر تطبيق .NET الفعلي. توصي المادة بالإبقاء على الاختبارات المُدارة وإضافة مسار Native AOT محدود في CI، مع جعل تطابق عدد الاختبارات ونتائجها شرطًا للقبول.

  • يتطلب المسار استخدام MSTest.Sdk/4.4.0 واستهداف net10.0 وتعيين PublishAot=true.
  • ينبغي نشر الاختبارات لنظام التشغيل والمعمارية نفسيهما المستهدفين من التطبيق، مثل linux-x64 أو win-x64 أو osx-arm64.
  • توليد المصدر يقلل الاعتماد على الفحص الانعكاسي الشامل، لكنه لا يلغي Reflection بالكامل.
  • يجب مقارنة عدد الاختبارات ونتائجها وزمن النشر والتشغيل الأصلي بين المسارين المُدار وNative AOT.
  • قد تفشل بعض الاختبارات أو لا تُكتشف بسبب قيود في تعريف الأصناف والأساليب؛ ويساعد التشخيص MSTEST0069 في كشف إحدى هذه الحالات.
  • لا ينبغي اعتماد Native AOT أساسًا لتحسين السرعة؛ القيمة الأساسية هي رفع تطابق الاختبار مع نموذج نشر التطبيق.

أسئلة شائعة

هل يحل اختبار Native AOT محل الاختبارات المُدارة؟

لا. توصي المادة بالإبقاء على الاختبارات المُدارة للتغذية الراجعة اليومية، وإضافة مسار Native AOT محدود للتحقق من مشكلات الترجمة المسبقة والتقليص.

ما شرط القبول الأهم لمسار Native AOT؟

يجب أن يكتشف المساران العدد نفسه تمامًا من الاختبارات وأن يحصلا على النتائج نفسها، مع تسجيل زمن النشر والتشغيل الأصلي بصورة منفصلة.

هل يلغي توليد المصدر استخدام Reflection؟

لا. يحتفظ وضع ReflectionFree الافتراضي ببعض مسارات Reflection الاحتياطية، ويمكن استخدام MSTestSourceGenMode=Rooting عند التحقيق في مشكلات التوافق.

ما القيود المذكورة لمسار Native AOT؟

تشمل القيود بعض تعريفات أصناف الاختبار، وأساليب تستخدم ref أو out أو in، وبعض أنماط الأجزاء الثابتة والتكاملات أو التقارير غير المتاحة في هذا المسار.

استكشف هذه القصة

المواضيع والجهات المرتبطة

من نفس التصنيف

مقالات قد تهمك

عرض كل الأخبار