Tutorial: Menguji tugas kustom
Anda dapat menggunakan fungsionalitas pengujian unit di Visual Studio untuk menguji tugas kustom MSBuild sebelum distribusi untuk memastikan kebenaran kode. Untuk informasi tentang manfaat melakukan pengujian dan alat pengujian dasar, lihat dasar-dasar tentang pengujian unit. Dalam tutorial ini, Anda menggunakan contoh kode yang digunakan dalam tutorial tugas kustom MSBuild lainnya. Proyek berikut yang digunakan dalam tutorial tersebut tersedia di GitHub dan menyertakan pengujian unit dan integrasi untuk tugas kustom MSBuild:
Pengujian unit
Tugas kustom MSBuild adalah kelas yang mewarisi dari Task (secara langsung atau tidak langsung, karena ToolTask mewarisi dari Task). Metode yang melakukan tindakan yang terkait dengan tugas tersebut adalah Execute()
. Metode ini mengambil beberapa nilai input (parameter) dan memiliki parameter output yang dapat Anda gunakan pernyataan untuk menguji validitas. Dalam hal ini, beberapa parameter input merupakan jalur ke file, jadi contoh ini memiliki file input pengujian dalam folder yang bernama Sumber Daya. Tugas MSBuild ini juga menghasilkan file, sehingga pengujian menegaskan file yang dihasilkan.
Diperlukan mesin build, yang merupakan kelas yang mengimplementasikan IBuildEngine. Dalam contoh ini, terdapat tiruan yang menggunakan Moq, tetapi Anda dapat menggunakan alat tiruan lainnya. Contoh mengumpulkan kesalahan, tetapi Anda dapat mengumpulkan informasi lain lalu menegaskannya.
Tiruan Engine
diperlukan pada semua pengujian, sehingga disertakan sebagai TestInitialize
(dijalankan sebelum setiap pengujian dan setiap pengujian memiliki mesin build sendiri).
Untuk kode lengkapnya, lihat AppSettingStronglyTypedTest.cs di repositori sampel .NET di GitHub.
Buat tugas dan atur parameter sebagai bagian dari pengaturan pengujian:
private Mock<IBuildEngine> buildEngine; private List<BuildErrorEventArgs> errors; [TestInitialize()] public void Startup() { buildEngine = new Mock<IBuildEngine>(); errors = new List<BuildErrorEventArgs>(); buildEngine.Setup(x => x.LogErrorEvent(It.IsAny<BuildErrorEventArgs>())).Callback<BuildErrorEventArgs>(e => errors.Add(e)); }
Buat tiruan parameter ITaskItem (menggunakan Moq) dan arahkan ke file yang akan diurai. Kemudian, buat tugas kustom
AppSettingStronglyTyped
beserta parameternya. Terakhir, atur mesin build ke tugas kustom MSBuild://Arrange var item = new Mock<ITaskItem>(); item.Setup(x => x.GetMetadata("Identity")).Returns($".\\Resources\\complete-prop.setting"); var appSettingStronglyTyped = new AppSettingStronglyTyped { SettingClassName = "MyCompletePropSetting", SettingNamespaceName = "MyNamespace", SettingFiles = new[] { item.Object } }; appSettingStronglyTyped.BuildEngine = buildEngine.Object;
Kemudian, jalankan kode tugas untuk melakukan tindakan tugas yang sebenarnya:
//Act var success = appSettingStronglyTyped.Execute();
Terakhir, tegaskan hasil tes yang diharapkan:
//Assert Assert.IsTrue(success); // The execution was success Assert.AreEqual(errors.Count, 0); //Not error were found Assert.AreEqual($"MyCompletePropSetting.generated.cs", appSettingStronglyTyped.ClassNameFile); // The Task expected output Assert.AreEqual(true, File.Exists(appSettingStronglyTyped.ClassNameFile)); // The file was generated Assert.IsTrue(File.ReadLines(appSettingStronglyTyped.ClassNameFile).SequenceEqual(File.ReadLines(".\\Resources\\complete-prop-class.txt"))); // Assenting the file content
Tes lainnya mengikuti pola ini dan memperluas semua kemungkinan.
Catatan
Ketika ada file yang dihasilkan, Anda perlu menggunakan nama file yang berbeda untuk setiap pengujian untuk menghindari tabrakan. Ingatlah untuk menghapus file yang dihasilkan sebagai pembersihan pengujian.
Pengujian integrasi
Pengujian unit penting, tetapi Anda juga perlu menguji tugas MSBuild kustom dalam konteks build yang realistis.
Kelas System.Diagnostics.Process menyediakan akses ke proses lokal dan jarak jauh serta memungkinkan Anda memulai dan menghentikan proses sistem lokal. Contoh ini menjalankan build pada pengujian unit menggunakan file MSBuild pengujian.
Kode pengujian perlu menginisialisasi konteks eksekusi untuk setiap pengujian. Perhatikan untuk memastikan jalur ke perintah
dotnet
akurat untuk lingkungan Anda. Contoh selengkapnya tersedia di sini.public const string MSBUILD = "C:\\Program Files\\dotnet\\dotnet.exe"; private Process buildProcess; private List<string> output; [TestInitialize()] public void Startup() { output = new List<string>(); buildProcess = new Process(); buildProcess.StartInfo.FileName = MSBUILD; buildProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; buildProcess.StartInfo.CreateNoWindow = true; buildProcess.StartInfo.RedirectStandardOutput = true; }
Saat pembersihan, pengujian perlu menyelesaikan proses:
[TestCleanup()] public void Cleanup() { buildProcess.Close(); }
Sekarang, buat setiap pengujian. Setiap pengujian akan membutuhkan definisi file MSBuild sendiri untuk dijalankan. Misalnya testscript-success.msbuild. Untuk memahami file, lihat Tutorial: Membuat tugas kustom.
<Project Sdk="Microsoft.NET.Sdk"> <UsingTask TaskName="AppSettingStronglyTyped.AppSettingStronglyTyped" AssemblyFile="..\AppSettingStronglyTyped.dll" /> <PropertyGroup> <TargetFramework>netstandard2.1</TargetFramework> </PropertyGroup> <PropertyGroup> <SettingClass>MySettingSuccess</SettingClass> <SettingNamespace>example</SettingNamespace> </PropertyGroup> <ItemGroup> <SettingFiles Include="complete-prop.setting" /> </ItemGroup> <Target Name="generateSettingClass"> <AppSettingStronglyTyped SettingClassName="$(SettingClass)" SettingNamespaceName="$(SettingNamespace)" SettingFiles="@(SettingFiles)"> <Output TaskParameter="ClassNameFile" PropertyName="SettingClassFileName" /> </AppSettingStronglyTyped> </Target> </Project>
Argumen pengujian memberikan instruksi untuk membangun file MSBuild ini:
//Arrange buildProcess.StartInfo.Arguments = "build .\\Resources\\testscript-success.msbuild /t:generateSettingClass";
Jalankan dan dapatkan output:
//Act ExecuteCommandAndCollectResults();
Di mana
ExecuteCommandAndCollectResults()
didefinisikan sebagai:private void ExecuteCommandAndCollectResults() { buildProcess.Start(); while (!buildProcess.StandardOutput.EndOfStream) { output.Add(buildProcess.StandardOutput.ReadLine() ?? string.Empty); } buildProcess.WaitForExit(); }
Terakhir, nilai hasil yang diharapkan:
//Assert Assert.AreEqual(0, buildProcess.ExitCode); //Finished success Assert.IsTrue(File.Exists(".\\Resources\\MySettingSuccess.generated.cs")); // the expected resource was generated Assert.IsTrue(File.ReadLines(".\\Resources\\MySettingSuccess.generated.cs").SequenceEqual(File.ReadLines(".\\Resources\\testscript-success-class.txt"))); // asserting the file content
Kesimpulan
Pengujian unit berguna karena Anda dapat menguji dan men-debug kode untuk memastikan kebenaran setiap bagian kode tertentu, tetapi pengujian integrasi penting untuk memastikan tugas dijalankan dalam konteks build yang realistis. Dalam tutorial ini, Anda mempelajari cara menguji tugas kustom MSBuild.
Langkah berikutnya
Buat tugas kustom yang lebih kompleks yang melakukan pembuatan kode REST API.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk