Konfigurasi MSTest SDK

Artikel ini membahas opsi konfigurasi tingkat lanjut untuk MSTest.Sdk. Untuk penyiapan dasar dan memulai, lihat Memulai dengan MSTest.

Penting

Secara bawaan, MSTest.Sdk menggunakan runner MSTest dengan MTP, termasuk dengan dotnet test. Ini memerlukan modifikasi panggilan CI dan CLI lokal Anda, dan juga berdampak pada entri yang tersedia dari .runsettings. Anda dapat menyimpan integrasi dan alat lama dengan beralih ke VSTest.

MSTest.Sdk mengatur EnableMSTestRunner dan TestingPlatformDotnetTestSupport ke true secara default. Untuk informasi selengkapnya tentang pengujian dotnet dan modenya yang berbeda, lihat Pengujian dengan pengujian dotnet.

Menguji perpustakaan bantu utilitas

Jika project yang menggunakan MSTest.Sdk dimaksudkan untuk menjadi pustaka pembantu utilitas pengujian, dan tidak dengan sendirinya berisi pengujian yang dapat dijalankan, project harus memiliki <IsTestApplication>false</IsTestApplication>.

Pilih pelari

Secara default, MSTest SDK bergantung pada MTP, tetapi Anda dapat beralih ke VSTest dengan menambahkan properti <UseVSTest>true</UseVSTest>.

Perluas MTP

Anda dapat menyesuaikan pengalaman MTP melalui satu set ekstensi paket NuGet. Untuk menyederhanakan dan meningkatkan pengalaman ini, MSTest SDK memperkenalkan dua fitur:

Microsoft.Testing.Platform profil

Konsep profiles memungkinkan Anda memilih kumpulan konfigurasi dan ekstensi default yang akan diterapkan ke project pengujian Anda.

Anda dapat mengatur profil menggunakan properti TestingExtensionsProfile dengan salah satu dari tiga profil berikut:

  • None - Tidak ada ekstensi yang diaktifkan.

  • Default - Mengaktifkan ekstensi yang direkomendasikan untuk versi MSTest.SDK ini. Ini adalah default ketika properti tidak diatur secara eksplisit.

    Mengaktifkan ekstensi berikut:

  • AllMicrosoft - Mengaktifkan ekstensi Microsoft yang dipilih untuk penggunaan siap pakai secara luas, termasuk ekstensi dengan lisensi yang ketat. Ekstensi eksperimental dan khusus API masih dapat memerlukan keikutsertaan eksplisit.

    Mengaktifkan semua ekstensi dari Default profil, ditambah ekstensi berikut:

    Dalam MSTest.Sdk versi 3.11.0 hingga 4.2.x, ekstensi Laporan Azure DevOps hanya disertakan dalam AllMicrosoft.

Catatan

Profil mereferensikan paket Laporan Azure DevOps dan Laporan GitHub Actions, tetapi pelaporan tetap dinonaktifkan saat runtime. Berikan --report-azdo untuk mengaktifkan pelaporan Azure DevOps. Untuk mengaktifkan pelaporan GitHub Actions, jalankan pengujian pada GitHub Actions dan lulus --report-gh.

Berikut adalah contoh lengkap menggunakan profil None.

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <TestingExtensionsProfile>None</TestingExtensionsProfile>
    </PropertyGroup>

</Project>
Ekstensi/Profil Tidak Bawaan AllMicrosoft
Cakupan Kode ✔️ ✔️
Jejak Kerusakan ✔️
Palsu ✔️¹
Hang Dump (proses pembuangan data ketika program mengalami hang) ✔️
Hot Reload ✔️
Laporan HTML ✔️
Laporan GitHub Actions ✔️³ ✔️³
Coba Lagi ✔️
Trx ✔️ ✔️
Laporan Azure DevOps ✔️³ ✔️²

¹ MSTest.Sdk 3.7.0+ ² MSTest.Sdk 3.11.0+ ³ MSTest.Sdk 4.3.0+

Mengaktifkan atau menonaktifkan ekstensi

Ekstensi dapat diaktifkan dan dinonaktifkan oleh properti MSBuild dengan pola Enable[NugetPackageNameWithoutDots].

Misalnya, untuk mengaktifkan ekstensi crash dump (paket NuGet Microsoft. Testing.Extensions.CrashDump), Anda dapat menggunakan properti berikut EnableMicrosoftTestingExtensionsCrashDump diatur ke true:

<Project Sdk="MSTest.Sdk/4.1.0">

<PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <EnableMicrosoftTestingExtensionsCrashDump>true</EnableMicrosoftTestingExtensionsCrashDump>
</PropertyGroup>

</Project>

Untuk daftar semua ekstensi yang tersedia, lihat fitur MTP.

Beberapa ekstensi MTP tetap bersifat opsional dan tidak disertakan dalam profil Default atau AllMicrosoft:

  • Mulai dari MSTest.Sdk 4.3, atur <EnableMicrosoftTestingExtensionsJUnitReport>true</EnableMicrosoftTestingExtensionsJUnitReport>, lalu berikan --report-junit.
  • Mulai dari pratinjau MSTest.Sdk 4.4, atur <EnableMicrosoftTestingExtensionsCtrfReport>true</EnableMicrosoftTestingExtensionsCtrfReport>, lalu berikan --report-ctrf.
  • Untuk mereferensikan ekstensi OpenTelemetry, atur <EnableMicrosoftTestingExtensionsOpenTelemetry>true</EnableMicrosoftTestingExtensionsOpenTelemetry>. Karena ekstensi memerlukan konfigurasi API, daftarkan di titik masuk kustom Anda seperti yang dijelaskan di OpenTelemetry.

Ekstensi ini hanya tersedia dengan MTP.

Peringatan

Penting untuk meninjau persyaratan lisensi untuk setiap ekstensi karena mungkin berbeda.

Ekstensi yang diaktifkan dan dinonaktifkan dikombinasikan dengan ekstensi yang disediakan oleh profil ekstensi yang Anda pilih.

Pola properti ini dapat digunakan untuk mengaktifkan ekstensi tambahan di atas profil implisit Default (seperti yang terlihat dalam contoh CrashDumpExtension sebelumnya).

Anda juga dapat menonaktifkan ekstensi yang berasal dari profil yang dipilih. Misalnya, nonaktifkan MS Code Coverage ekstensi dengan mengatur <EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>:

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>
    </PropertyGroup>

</Project>

Di MSTest.Sdk 4.3.0 dan versi yang lebih baru, profil Default merujuk ke paket Azure DevOps Report dan GitHub Actions Report. Untuk menghapus referensi paket, atur <EnableMicrosoftTestingExtensionsAzureDevOpsReport>false</EnableMicrosoftTestingExtensionsAzureDevOpsReport> atau <EnableMicrosoftTestingExtensionsGitHubActionsReport>false</EnableMicrosoftTestingExtensionsGitHubActionsReport>. Jika Anda mempertahankan referensi paket, pelaporan Azure DevOps hanya dimulai saat Anda meneruskan --report-azdo. Pelaporan GitHub Actions hanya dimulai ketika Anda menjalankan tes di GitHub Actions dan meneruskan --report-gh.

Fitur

Di luar pemilihan ekstensi runner dan runner-specific, MSTest.Sdk juga menyediakan fitur tambahan untuk menyederhanakan dan meningkatkan pengalaman pengujian Anda.

Uji dengan Aspire

Aspire adalah stack siap-cloud yang berpendirian teguh untuk membangun aplikasi yang dapat diamati, siap-produksi, dan terdistribusi. Aspire dikirimkan melalui kumpulan paket NuGet yang menangani masalah cloud-native tertentu. Untuk informasi selengkapnya, lihat Aspire dokumen.

Catatan

Fitur ini tersedia dari MSTest.Sdk 3.4.0.

Dengan mengatur properti EnableAspireTesting ke true, Anda dapat membawa semua dependensi dan arahan default using yang Anda butuhkan untuk pengujian dengan Aspire dan MSTest.

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnableAspireTesting>true</EnableAspireTesting>
    </PropertyGroup>

</Project>

Pengujian menggunakan Playwright

Playwright memungkinkan pengujian end-to-end yang andal untuk web apps modern. Untuk informasi selengkapnya, lihat dokumentasi Playwright resmi.

Catatan

Fitur ini tersedia dari MSTest.Sdk 3.4.0.

Dengan mengatur properti EnablePlaywright ke true Anda dapat membawa semua dependensi dan arahan default using yang Anda butuhkan untuk pengujian dengan Playwright dan MSTest.

<Project Sdk="MSTest.Sdk/4.1.0">

    <PropertyGroup>
        <TargetFramework>net10.0</TargetFramework>
        <EnablePlaywright>true</EnablePlaywright>
    </PropertyGroup>

</Project>

Migrasi ke MSTest SDK

Pertimbangkan langkah-langkah berikut yang diperlukan untuk bermigrasi ke MSTest SDK.

Memperbarui project Anda

Saat memigrasikan proyek pengujian MSTest yang ada ke MSTest SDK, mulailah dengan mengganti entri Sdk="Microsoft.NET.Sdk" di bagian atas proyek pengujian Anda dengan Sdk="MSTest.Sdk"

- Sdk="Microsoft.NET.Sdk"
+ Sdk="MSTest.Sdk"

Tambahkan versi pada global.json:

{
    "msbuild-sdks": {
        "MSTest.Sdk": "4.1.0"
    }
}

Anda kemudian dapat mulai menyederhanakan project Anda.

Hapus properti default.

- <EnableMSTestRunner>true</EnableMSTestRunner>
- <OutputType>Exe</OutputType>
- <IsPackable>false</IsPackable>
- <IsTestProject>true</IsTestProject>

Hapus referensi paket default:

- <PackageReference Include="MSTest"
- <PackageReference Include="MSTest.TestFramework"
- <PackageReference Include="MSTest.TestAdapter"
- <PackageReference Include="MSTest.Analyzers"
- <PackageReference Include="Microsoft.NET.Test.Sdk"

Terakhir, berdasarkan profil ekstensi yang Anda gunakan, Anda juga dapat menghapus beberapa paket Microsoft.Testing.Extensions.*.

Memperbarui CI Anda

Setelah memperbarui proyek, jika Anda menggunakan MTP (default) dan jika Anda mengandalkan dotnet test untuk menjalankan pengujian, Anda harus memperbarui konfigurasi CI. Untuk informasi selengkapnya dan memandu pemahaman Anda mengenai semua perubahan yang diperlukan, lihat integrasi pengujian dotnet.

Jika Anda menggunakan mode VSTest dotnet test, berikut adalah contoh pembaruan saat menggunakan tugas DotNetCoreCLI di Azure DevOps:

Profil ekstensi default MSTest.Sdk menyediakan paket Microsoft.Testing.Extensions.CodeCoverage dan Microsoft.Testing.Extensions.TrxReport yang diperlukan oleh opsi yang ditambahkan. Jika Anda memilih profil None, aktifkan atau rujuk kedua ekstensi sebelum menggunakan opsi tersebut.

\- task: DotNetCoreCLI@2
  inputs:
    command: 'test'
    projects: '**/**.sln'
-    arguments: '--configuration Release'
+    arguments: '--configuration Release -- --report-trx --results-directory $(Agent.TempDirectory) --coverage'

Generator sumber pantulan

Penting

Perilaku MSTest 4.4 berikut hanya tersedia dalam build pratinjau hingga MSTest 4.4.0 dirilis.

MSTest 4.3 memperkenalkan generator sumber pantulan dalam paket eksperimental MSTest.SourceGeneration versi independen. Dimulai dengan MSTest 4.4, paket lulus dari status eksperimental dan menggunakan versi MSTest.

Proyek Native AOT secara otomatis menyertakan generator kode sumber. Untuk proyek non-NativeAOT yang menggunakan MSTest.Sdk, aktifkan secara eksplisit dengan <EnableMSTestSourceGeneration>true</EnableMSTestSourceGeneration>. MSTest.Sdk menyelaraskan versi MSTest.SourceGeneration, MSTest.TestFramework, dan MSTest.TestAdapter melalui MSTestVersion.

SDK juga mendukung pembuatan sumber dalam pustaka pengujian dan proyek yang dapat digunakan kembali yang menggunakan Central Package Management. Menyediakan hook runtime yang sesuai MSTest.TestAdapter dan menghasilkan item PackageVersion yang diperlukan.

.NET Standard tidak mendukung hook runtime ini. Saat Anda mengaktifkan pembuatan sumber untuk target standar .NET, SDK melaporkan kesalahan ini:

Pembuatan kode sumber MSTest tidak didukung untuk kerangka kerja target .NET Standard karena hook runtime MSTest.TestAdapter yang diperlukan tidak tersedia.

Generator sumber menemukan pengujian pada waktu kompilasi. Ketika generator aktif, kelas pengujian harus mendeklarasikan [TestClass] secara langsung alih-alih mewarisinya. Penganalisis MSTEST0069 menandai kelas yang mengandalkan [TestClass] yang diwarisi.

Mulai MSTest 4.3.2, MSTestSourceGenMode secara default menggunakan ReflectionFree untuk proyek yang di-trim dan Native AOT. Mode ini menggunakan metadata dan pemanggil yang dihasilkan jika mendukung struktur pengujian. Pada runtime yang mendukung refleksi, MSTest menggunakan refleksi sebagai cadangan untuk entri yang dihasilkan yang tidak didukung atau tidak ada.

Mulai dari MSTest 4.4, pembuatan tanpa refleksi menghasilkan metadata lengkap untuk atribut yang diwariskan, termasuk AttributeUsage dan AllowMultiple. Pada MTP, dapat melewati deteksi runtime dan validasi untuk metode [DataRow] dan [TestMethod] sinkron biasa. Pengujian asinkron, atribut metode pengujian kustom, DynamicData, implementasi kustom ITestDataSource , dan bentuk pengujian ambigu menggunakan jalur fallback. VSTest juga mempertahankan jalur yang ada.

Mode bebas refleksi melaporkan diagnostik ini:

ID Bentuk pengujian yang tidak didukung
AOTSG0001 Kelas pengujian statis
AOTSG0002 Buka kelas pengujian generik, termasuk kelas yang disarangkan dalam jenis generik
AOTSG0003 Kelas yang tidak dapat diakses oleh kode yang dihasilkan, termasuk kelas lokal pada file atau nested private atau private-protected
AOTSG0004 Metode pengujian generik
AOTSG0005 Metode pengujian dengan refparameter , in, atau out

Fitur Eksperimen

Fitur MSTest 4.3 berikut bersifat eksperimental. API publik mereka dapat berubah, dan hanya diekspos melalui fitur diagnostik eksperimental. Untuk ikut serta, konfirmasikan ID diagnostik terkait.

Penyaringan pengujian secara terprogram dengan ITestFilter

Catatan

Diperkenalkan dalam MSTest 4.3.0 (eksperimental).

Titik ekstensi eksperimental ITestFilter , yang didaftarkan melalui [TestFilterProviderAttribute], memungkinkan Anda memutuskan secara terprogram apakah setiap pengujian berjalan, sebelum kelas pengujian dimuat. Ini berguna untuk logika pemilihan kustom yang tidak dapat diekspresikan dengan filter baris perintah.

Terapkan ITestFilter.Filter(TestFilterContext) untuk memeriksa metadata tanpa memuat kelas pengujian:

public sealed class MyFilter : ITestFilter
{
    public TestFilterResult Filter(TestFilterContext context) =>
        context.DisplayName.Contains("Nightly", StringComparison.Ordinal)
            ? TestFilterResult.Run : TestFilterResult.Drop;
}

Kembali TestFilterResult.Run untuk menjalankan pengujian, Drop untuk menghilangkannya tanpa hasil, atau Skip(reason) untuk melaporkan hasil yang dilewati. MSTest dapat memanggil satu instance filter secara bersamaan, sehingga implementasinya harus aman untuk digunakan oleh beberapa utas. Filter baris perintah dan test-explorer berjalan sebelum ITestFilter, sementara [Ignore] dievaluasi setelahnya.

Mulai dari MSTest 4.4, proyek .NET dapat menggunakan bentuk pendaftaran generik yang aman tipe [assembly: TestFilterProvider<MyFilter>]. Kompilator kemudian memastikan bahwa MyFilter mengimplementasikan ITestFilter dan memiliki konstruktor publik tanpa parameter. Atribut generik tidak tersedia untuk .NET Framework. Untuk proyek multi-target, pilih formulir generik atau non-generik dengan simbol praprosedur kerangka kerja target.

#if NET
[assembly: TestFilterProvider<MyFilter>]
#else
[assembly: TestFilterProvider(typeof(MyFilter))]
#endif

Dimulai dengan MSTest 4.4, penganalisis MSTEST0081 sepenuhnya memvalidasi formulir pendaftaran non-generik. Untuk formulir generik, ia masih melaporkan jenis filter generik dan rakitan yang mendaftarkan lebih dari satu penyedia.

TestRun.Current dan pengujian yang direncanakan

Catatan

Diperkenalkan dalam MSTest 4.3.0 (eksperimental).

API eksperimental TestRun.Current (dari RFC 014) memaparkan informasi tentang eksekusi saat ini, termasuk serangkaian pengujian yang direncanakan, sehingga ekstensi dan perlengkapan dapat memeriksa apa yang dijadwalkan untuk dijalankan.

Batasan yang diketahui

MSBuild SDK yang disediakan oleh NuGet (termasuk MSTest.Sdk) memiliki dukungan alat yang terbatas dalam pembaruan versinya, yang berarti bahwa pembaruan NuGet yang biasa dan UI Visual Studio untuk mengelola paket NuGet tidak berfungsi sebagaimana mestinya. Anda harus memperbarui versi secara manual dalam file global.json dan dalam file project. (Ini berlaku bahkan jika Anda menggunakan Dependabot karena masalah dependabot-core#12824 dan dependabot-core#8615.)

Lihat juga