مرحباً أيها مطورو .NET! هل أنتم مستعدون للارتقاء بمستوى اختباراتكم باستخدام **منصة اختبار Microsoft (MTP)** و **.NET 10**؟ إذا كنتم تستخدمون `dotnet test` مع مُشغل VSTest التقليدي، فاستعدوا—**MTP** هنا لتجعل اختباراتكم أكثر سلاسة وسرعة ومرونة. في هذا الدليل التفاعلي، سنستكشف ماهية **MTP**، المعروفة أيضاً باسم **MicrosoftTestingPlatform**، ولماذا هي خطوة متقدمة عن VSTest، وكيفية الاستفادة منها مع `dotnet test` في **.NET 10** لبناء اختبارات قوية لمشاريعكم. سأرشدكم خلال الخطوات التي اتبعتها لتجربة هذا الإعداد، من مشروع MSTest أساسي إلى حل متعدد المشاريع مع ملف تنفيذي مستقل. دعونا نغوص في عالم **MTP, MicrosoftTestingPlatform, .NET 10, dotnet test** ونجعل الاختبار أسهل وأكثر متعة!
هل تريد منصة متكاملة وشاملة لفريق المطورين لديك للعمل معاً بأقصى إنتاجية؟
Apidog يلبي جميع متطلباتك، و يحل محل Postman بسعر أكثر بأسعار معقولة!
لماذا يهم الاختبار في تطوير .NET؟
قبل أن نبدأ العمل، دعنا نتحدث عن سبب أهمية الاختبار. سواء كنت تبني تطبيقًا صغيرًا أو نظامًا مؤسسيًا ضخمًا، فإن الاختبارات تضمن أن يعمل الكود الخاص بك كما هو متوقع، وتكتشف الأخطاء مبكرًا، وتنقذك من جلسات تصحيح الأخطاء في وقت متأخر من الليل. تتيح لك اختبارات الوحدات الآلية، مثل تلك التي سننشئها باستخدام **MSTest** و **MTP**، التحقق من الوظائف، وتحسين جودة الكود، وتجعل إعادة الهيكلة أمرًا سهلاً. مع تحسينات الأداء في **.NET 10** وإطار الاختبار الحديث لـ **MTP**، أنت مستعد لكتابة اختبارات سريعة وموثوقة وسهلة الدمج في مسارات CI/CD. هل أنت مستعد لترى كيف؟ دعنا نتبع رحلتي!
ما هي منصة اختبار Microsoft (MTP)؟
إن **منصة اختبار Microsoft (MTP)**، أو **MicrosoftTestingPlatform**، هي الجيل التالي من إطارات عمل الاختبار من Microsoft، تم تقديمها لتحل محل مُشغل VSTest القديم. على عكس VSTest، الذي يعتمد على محولات معقدة وتنفيذ قائم على DLL، تقدم **MTP** تجربة مبسطة وأصلية لتشغيل الاختبارات في .NET. إنها مدمجة في **.NET 10**، مما يجعلها أسرع وأكثر مرونة، مع ميزات مثل مشغلات الاختبار التنفيذية المستقلة وتكامل أفضل مع `dotnet test`. تدعم **MTP** MSTest و NUnit و xUnit، وهي مصممة لسير العمل الحديث، بما في ذلك CI/CD والتطوير عبر الأنظمة الأساسية. يمكنك اعتبارها بمثابة الأخ الأكثر روعة وكفاءة لـ VSTest، مُحسّنة لتحسينات الأداء في **.NET 10**.
الخطوة 1: إعداد مشروع MSTest أساسي باستخدام MTP
دعنا نبدأ ببساطة بإنشاء مشروع MSTest أساسي لنرى **MTP** عمليًا. إليك كيف بدأت الأمور:
إنشاء المشروع:
- افتح طرفيتك وقم بإنشاء مشروع MSTest جديد باستخدام .NET CLI:
dotnet new mstest -n MyMtpTests
- يؤدي هذا إلى إنشاء مجلد مشروع `MyMtpTests` مع ملف اختبار افتراضي (`UnitTest1.cs`) وملف `.csproj`.
التحقق من ملف المشروع:
- يبدو ملف `MyMtpTests.csproj` الذي تم إنشاؤه شيئًا كهذا:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.1.1" />
<PackageReference Include="MSTest.TestFramework" Version="3.1.1" />
</ItemGroup>
</Project>
- يقوم هذا بإعداد مشروع MSTest قياسي باستخدام VSTest، مع استخدام **Coverlet** لتغطية الكود و **Microsoft.NET.Test.Sdk** لتنفيذ الاختبارات.
تشغيل الاختبارات:
- انتقل إلى مجلد المشروع:
cd MyMtpTests
- قم بتشغيل الاختبار الافتراضي:
dotnet test
- يقوم مُشغل VSTest بتنفيذ الاختبار النموذجي في `UnitTest1.cs`، وسترى مخرجًا يؤكد نجاح الاختبار، بالإضافة إلى إحصائيات التغطية من Coverlet.

ماذا يحدث؟ هذا إعداد تقليدي يستخدم VSTest، ولكنه أساس متين قبل الترقية إلى **MTP**. يقوم المشروع بتشغيل الاختبارات كملف DLL، وهو أمر جيد ولكنه ليس مرنًا مثل نهج **MTP** القائم على الملفات التنفيذية.
الخطوة 2: التطور إلى مُشغل اختبار MTP القائم على الملف التنفيذي
الآن، دعنا نجعل الأمور أكثر إثارة بالتحول إلى مُشغل **MTP** التنفيذي المستقل، والذي يتيح لك تشغيل الاختبارات بدون `dotnet test`. إليك كيف فعلت ذلك:
تحديث ملف المشروع:
- قم بتعديل `MyMtpTests.csproj` لتمكين **MTP** وإنشاء ملف تنفيذي:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
<!-- Enable MTP runner and executable output -->
<EnableMSTestRunner>true</EnableMSTestRunner>
<TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>
<OutputType>Exe</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.10.2" />
<PackageReference Include="MSTest.TestAdapter" Version="3.10.2" />
</ItemGroup>
<ItemGroup>
<Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
</ItemGroup>
</Project>
التغييرات الرئيسية:
- `<EnableMSTestRunner>true</EnableMSTestRunner>`: ينشط مُشغل الاختبار الخاص بـ **MTP**.
- `<TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>`: يضمن التوافق مع `dotnet test`.
- `<OutputType>Exe</OutputType>`: يخرج ملفًا تنفيذيًا مستقلاً بدلاً من ملف DLL.
بناء المشروع:
- تشغيل:
dotnet build
- يؤدي هذا إلى إنشاء ملف تنفيذي (مثل `MyMtpTests.exe`) في مجلد `bin/Debug/net8.0`.

تشغيل الملف التنفيذي:
- انتقل إلى دليل الإخراج:
cd bin/Debug/net8.0
- قم بتشغيل الملف التنفيذي:
- Windows: `MyMtpTests.exe`
- macOS/Linux: `./MyMtpTests`
- يتم تشغيل الاختبارات كتطبيق وحدة تحكم مستقل، لا حاجة إلى `dotnet test`!

لماذا هذا رائع: النهج القائم على الملف التنفيذي مثالي لإعدادات CI/CD المخصصة أو البيئات التي لا تحتوي على .NET SDK مثبتًا. إنه يغير قواعد اللعبة من حيث المرونة، وتجعله **MTP** أسرع من VSTest عن طريق تقليل الحمل الزائد.
الخطوة 3: الاحتراف مع .NET 10 واختبار المشاريع المتعددة
لرؤية تألق **MTP** و **.NET 10** في سيناريو واقعي، دعنا نبني حلاً متعدد المشاريع مع مكتبة فئات واختبارات. إليك كيف قمت بإعداده:
هيكل المشروع النهائي:
MyMtpSolution/
│
├── MyLibrary/
│ ├── Calculator.cs
│ └── MyLibrary.csproj
│
├── MyLibrary.Tests/
│ ├── CalculatorTests.cs
│ └── MyLibrary.Tests.csproj
│
├── MyMtpSolution.sln
└── dotnet.config
1. إنشاء حل:
- ابدأ من جديد بحل:
dotnet new sln -n MyMtpSolution
2. إنشاء مكتبة فئات:
- أضف مشروع مكتبة فئات:
dotnet new classlib -n MyLibrary
- نفذ فئة `Calculator` في `MyLibrary/Calculator.cs`:
namespace MyLibrary
{
public class Calculator
{
public int Add(int a, int b) => a + b;
public int Subtract(int a, int b) => a - b;
public int Multiply(int a, int b) => a * b;
public int Divide(int a, int b) =>
b == 0 ? throw new ArgumentException("Cannot divide by zero.") : a / b;
}
}
3. إنشاء مشروع اختبار:
- قم بإنشاء مشروع MSTest:
dotnet new mstest -n MyLibrary.Tests
- أضف الاختبارات في `MyLibrary.Tests/UnitTest1.cs`:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MyLibrary;
namespace MyLibrary.Tests
{
[TestClass]
public class CalculatorTests
{
private Calculator _calculator;
[TestInitialize]
public void Setup()
{
_calculator = new Calculator();
}
[TestMethod]
public void Add_ReturnsCorrectSum()
{
Assert.AreEqual(5, _calculator.Add(2, 3));
}
[TestMethod]
public void Subtract_ReturnsCorrectDifference()
{
Assert.AreEqual(1, _calculator.Subtract(3, 2));
}
[TestMethod]
public void Multiply_ReturnsCorrectProduct()
{
Assert.AreEqual(6, _calculator.Multiply(2, 3));
}
[TestMethod]
public void Divide_ReturnsCorrectQuotient()
{
Assert.AreEqual(2, _calculator.Divide(6, 3));
}
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void Divide_ByZero_ThrowsException()
{
_calculator.Divide(6, 0);
}
}
}
4. إضافة مراجع المشروع:
- اربط مشروع الاختبار بالمكتبة:
dotnet add MyLibrary.Tests reference MyLibrary
5. إضافة مشاريع إلى الحل:
- قم بتضمين كلا المشروعين في الحل:
dotnet sln MyMtpSolution.sln add MyLibrary/MyLibrary.csproj
dotnet sln MyMtpSolution.sln add MyLibrary.Tests/MyLibrary.Tests.csproj
6. تكوين لـ MTP:
- قم بتحديث `MyLibrary.Tests.csproj` لتمكين **MTP**:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
<EnableMSTestRunner>true</EnableMSTestRunner>
<TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.10.2" />
<PackageReference Include="MSTest.TestAdapter" Version="3.10.2" />
</ItemGroup>
<ItemGroup>
<Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
</ItemGroup>
</Project>
- اختياريًا، قم بتحديث `MyLibrary.csproj` للتناسق (على الرغم من أنه ليس ضروريًا بشكل صارم):
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
7. الترقية إلى .NET 10:
- قم بتنزيل **.NET 10 SDK** من dotnet.microsoft.com (تأكد من أنه متوافق مع نظام التشغيل الخاص بك—Windows، macOS، أو Linux).

- قم بتحديث ملفي `.csproj` لاستهداف **.NET 10**:
<TargetFramework>net10.0</TargetFramework>
8. إنشاء ملف dotnet.config:
- في جذر الحل، أنشئ `dotnet.config` بما يلي:
[dotnet.test.runner]
name = "Microsoft.Testing.Platform"
- يؤدي هذا إلى تمكين التكامل الأصلي لـ **MTP** مع `dotnet test` في **.NET 10**.
9. بناء وتشغيل الاختبارات:
- من جذر الحل:
dotnet test
- تقوم **MTP** بتشغيل الاختبارات، مستفيدة من تحسينات **.NET 10**. سترى مخرجًا لجميع الاختبارات، بما في ذلك النجاح/الفشل وإحصائيات التغطية.

لماذا هذا رائع: يجلب **.NET 10** تحسينات في الأداء (JIT أسرع، إدارة ذاكرة أفضل)، ويزيل التكامل الأصلي لـ **MTP** الجسور القديمة لـ VSTest، مما يجعل الاختبارات أسرع وأكثر موثوقية. يحاكي إعداد المشاريع المتعددة التطبيقات الواقعية، مع مكتبة ومشروع اختبار منفصل.
كيف يحسن .NET 10 و MTP الاختبار
تأخذ **MTP** و **.NET 10** الاختبار إلى المستوى التالي:
- السرعة: تم تحسين المُشغل الأصلي لـ **MTP** لـ **.NET 10**، مما يقلل من وقت البدء مقارنة بـ VSTest.
- المرونة: الملفات التنفيذية المستقلة تجعل الاختبارات قابلة للنقل، وهي مثالية لـ CI/CD المخصص أو البيئات المعبأة في حاويات.
- قابلية التوسع: يدعم دعم المشاريع المتعددة الحلول المعقدة، مع ضمان **MTP** لتنفيذ الاختبارات المتسق.
- الميزات الحديثة: تجعل تجميع AOT وتحسينات الذاكرة في **.NET 10** الاختبارات تعمل بشكل أسرع، بينما تدعم **MTP** الميزات المتقدمة مثل تنفيذ الاختبارات المتوازية والمُبلغين المخصصين.
المستخدمون يتحدثون بحماس عن **MTP**: "إنها مثل VSTest ولكن بدون الأعباء—أسرع وأنظف!" مع **.NET 10**، تحصل على أداء متطور، وتجعل **MTP** `dotnet test` ممتعًا.
نصائح استكشاف الأخطاء وإصلاحها
- الاختبارات لا تعمل؟ تأكد من تثبيت **.NET 10 SDK** وتعيين `TargetFramework` إلى `net10.0`.
- MTP غير مفعل؟ تحقق من وجود `EnableMSTestRunner` و `TestingPlatformDotnetTestSupport` في ملف `.csproj` أو `dotnet.config`.
- التغطية مفقودة؟ تحقق من تضمين `coverlet.collector` وقم بتشغيل `dotnet test --collect:"XPlat Code Coverage"`.
- الملف التنفيذي يفشل؟ تأكد من أن `OutputType` هو `Exe` وقم بتشغيل `dotnet build` قبل تنفيذ الملف `.exe`.
الخلاصة
أنت الآن محترف في استخدام **MTP (MicrosoftTestingPlatform), .NET 10, dotnet test** لبناء إعداد اختبار حديث! من مشروع MSTest أساسي إلى حل متعدد المشاريع مع ملف تنفيذي مستقل، لقد رأيت كيف تتفوق **MTP** على VSTest وكيف يعزز **.NET 10** الأداء. حاول إضافة المزيد من الاختبارات، أو دمجها في مسار CI/CD الخاص بك، أو استكشاف الميزات المتقدمة لـ **MTP** مثل التنفيذ المتوازي. هل لديك إعدادات اختبار رائعة؟ شاركها—دعنا نحافظ على أجواء الاختبار حيوية!
