Bagikan melalui


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.

  1. 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));
         }
    
  2. 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();
    
  3. 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
    
  4. 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.

  1. 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;
         }
    
  2. Saat pembersihan, pengujian perlu menyelesaikan proses:

        [TestCleanup()]
         public void Cleanup()
         {
             buildProcess.Close();
         }
    
  3. 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>
    
  4. Argumen pengujian memberikan instruksi untuk membangun file MSBuild ini:

     //Arrange
     buildProcess.StartInfo.Arguments = "build .\\Resources\\testscript-success.msbuild /t:generateSettingClass";
    
  5. 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();
    }
    
  6. 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.