สวัสดีครับนักพัฒนา .NET ทุกท่าน! พร้อมที่จะยกระดับการทดสอบของคุณด้วย Microsoft Testing Platform (MTP) และ .NET 10 แล้วหรือยัง? หากคุณเคยใช้ dotnet test
กับ VSTest runner แบบดั้งเดิม เตรียมตัวให้พร้อม—MTP มาเพื่อทำให้การทดสอบของคุณราบรื่นขึ้น เร็วขึ้น และยืดหยุ่นมากขึ้น ในคู่มือฉบับนี้ เราจะมาสำรวจว่า MTP หรือ MicrosoftTestingPlatform คืออะไร ทำไมถึงดีกว่า VSTest และวิธีนำมาใช้กับ dotnet test ใน .NET 10 เพื่อสร้างการทดสอบที่แข็งแกร่งสำหรับโปรเจกต์ของคุณ ผมจะพาคุณไปดูขั้นตอนที่ผมใช้ในการทดลองกับการตั้งค่านี้ ตั้งแต่โปรเจกต์ MSTest พื้นฐาน ไปจนถึงโซลูชันแบบหลายโปรเจกต์ที่มีไฟล์ปฏิบัติการแบบสแตนด์อโลน มาดำดิ่งสู่โลกของ MTP, MicrosoftTestingPlatform, .NET 10, dotnet test และทำให้การทดสอบง่ายขึ้นและสนุกยิ่งขึ้นกันเถอะ!
ต้องการแพลตฟอร์มแบบ All-in-One ที่รวมทุกอย่างสำหรับทีมพัฒนาของคุณ เพื่อทำงานร่วมกันด้วย ประสิทธิภาพสูงสุด หรือไม่?
Apidog ตอบสนองทุกความต้องการของคุณ และ แทนที่ Postman ในราคาที่เข้าถึงได้มากกว่ามาก!
ทำไมการทดสอบจึงมีความสำคัญในการพัฒนา .NET
ก่อนที่เราจะลงมือทำ มาคุยกันว่าทำไมการทดสอบจึงเป็นเรื่องสำคัญ ไม่ว่าคุณจะสร้างแอปขนาดเล็กหรือระบบองค์กรขนาดใหญ่ การทดสอบช่วยให้มั่นใจว่าโค้ดของคุณทำงานได้ตามที่คาดหวัง ดักจับข้อผิดพลาดตั้งแต่เนิ่นๆ และช่วยให้คุณไม่ต้องแก้ไขข้อผิดพลาดตอนดึกๆ การทดสอบหน่วยอัตโนมัติ เช่นที่เราจะสร้างด้วย MSTest และ MTP ช่วยให้คุณตรวจสอบฟังก์ชันการทำงาน ปรับปรุงคุณภาพโค้ด และทำให้การปรับโครงสร้างโค้ดเป็นเรื่องง่าย ด้วยการเพิ่มประสิทธิภาพของ .NET 10 และเฟรมเวิร์กการทดสอบที่ทันสมัยของ MTP คุณพร้อมที่จะเขียนการทดสอบที่รวดเร็ว เชื่อถือได้ และง่ายต่อการรวมเข้ากับ CI/CD pipelines พร้อมที่จะดูวิธีการแล้วหรือยัง? มาติดตามการเดินทางของผมกัน!
Microsoft Testing Platform (MTP) คืออะไร?
Microsoft Testing Platform (MTP) หรือ MicrosoftTestingPlatform คือเฟรมเวิร์กการทดสอบยุคถัดไปของ Microsoft ที่เปิดตัวเพื่อมาแทนที่ VSTest runner ที่ล้าสมัย แตกต่างจาก VSTest ที่พึ่งพาอะแดปเตอร์ที่ซับซ้อนและการรันแบบ DLL-based, MTP มอบประสบการณ์การรันการทดสอบใน .NET ที่ราบรื่นและเป็นแบบเนทีฟ มันถูกสร้างขึ้นใน .NET 10 ทำให้เร็วขึ้นและยืดหยุ่นมากขึ้น ด้วยคุณสมบัติเช่น test runner แบบไฟล์ปฏิบัติการสแตนด์อโลน และการรวมเข้ากับ 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 runner จะรันการทดสอบตัวอย่างใน
UnitTest1.cs
และคุณจะเห็นผลลัพธ์ยืนยันว่าการทดสอบผ่าน พร้อมกับสถิติการครอบคลุมจาก Coverlet

เกิดอะไรขึ้น? นี่คือการตั้งค่าแบบดั้งเดิมที่ใช้ VSTest แต่เป็นพื้นฐานที่ดีก่อนที่เราจะอัปเกรดเป็น MTP โปรเจกต์จะรันการทดสอบเป็น DLL ซึ่งก็ใช้ได้ แต่ไม่ยืดหยุ่นเท่าแนวทางแบบไฟล์ปฏิบัติการของ MTP
ขั้นตอนที่ 2: การพัฒนาไปสู่ MTP Executable-Based Test Runner
ตอนนี้ มาทำให้เรื่องน่าตื่นเต้นยิ่งขึ้นด้วยการเปลี่ยนไปใช้ **MTP**’s standalone executable runner ซึ่งช่วยให้คุณรันการทดสอบได้โดยไม่ต้องใช้ 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>
: เปิดใช้งาน test runner ของ 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 setups ที่กำหนดเอง หรือสภาพแวดล้อมที่ไม่มีการติดตั้ง .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 ยกระดับการทดสอบไปอีกขั้น:
- ความเร็ว: Native runner ของ MTP ถูกปรับให้เหมาะสมสำหรับ **.NET 10** ช่วยลดเวลาเริ่มต้นเมื่อเทียบกับ VSTest
- ความยืดหยุ่น: ไฟล์ปฏิบัติการแบบสแตนด์อโลนทำให้การทดสอบพกพาได้ เหมาะสำหรับ CI/CD ที่กำหนดเองหรือสภาพแวดล้อมแบบคอนเทนเนอร์
- ความสามารถในการปรับขนาด: การรองรับหลายโปรเจกต์จัดการโซลูชันที่ซับซ้อน โดย MTP ช่วยให้มั่นใจว่าการรันการทดสอบเป็นไปอย่างสม่ำเสมอ
- คุณสมบัติที่ทันสมัย: การคอมไพล์แบบ AOT และการปรับแต่งหน่วยความจำของ **.NET 10** ทำให้การทดสอบทำงานได้เร็วขึ้น ในขณะที่ MTP รองรับคุณสมบัติขั้นสูง เช่น การรันการทดสอบแบบขนานและ custom reporters
ผู้ใช้ต่างพูดถึง 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 pipeline ของคุณ หรือสำรวจคุณสมบัติขั้นสูงของ MTP เช่น การรันแบบขนาน มีการตั้งค่าการทดสอบเจ๋งๆ หรือไม่? แชร์กันเลย—มาทำให้การทดสอบเป็นเรื่องสนุกต่อไป!