Öğretici: Özel görevi test edin

Visual Studio'da birim testi işlevini kullanarak, kodun doğruluğundan emin olmak için dağıtımdan önce bir MSBuild özel görevini test edebilirsiniz. Test yapmanın avantajları ve temel test araçları hakkında bilgi için bkz . Birim testleri hakkında temel bilgiler. Bu öğreticide, diğer MSBuild özel görev öğreticilerinde kullanılan kod örneklerini kullanacaksınız. Bu öğreticilerde kullanılan aşağıdaki projeler GitHub'da mevcuttur ve MSBuild özel görevleri için birim ve tümleştirme testlerini içerir:

Birim Testi

MSBuild özel görevi, öğesinden Task devralan bir sınıftır (doğrudan veya dolaylı olarak, çünkü ToolTask öğesinden Taskdevralır). Görevle ilişkili eylemleri gerçekleştiren yöntem: Execute(). Bu yöntem bazı giriş değerleri (parametreler) alır ve geçerliliği test etmek için assert'i kullanabileceğiniz çıkış parametrelerine sahiptir. Bu durumda, bazı giriş parametreleri dosyaların yollarıdır, bu nedenle bu örnekte Kaynaklar adlı bir klasörde test giriş dosyaları vardır. Bu MSBuild görevi de dosya oluşturur, bu nedenle test oluşturulan dosyaları onaylar.

IBuildEngine uygulayan bir sınıf olan bir derleme altyapısı gereklidir. Bu örnekte, Moq kullanan bir sahte vardır, ancak diğer sahte araçları kullanabilirsiniz. Örnek hataları toplar, ancak diğer bilgileri toplayıp onaylayabilirsiniz.

Sahte Engine tüm testlerde gereklidir, bu nedenle olarak TestInitialize dahil edilir (her test öncesinde yürütülür ve her testin kendi derleme altyapısı vardır).

Kodun tamamı için GitHub'daki .NET örnekleri deposundaki AppSettingStronglyTypedTest.cs dosyasına bakın.

  1. Görevi oluşturun ve parametreleri test düzenlemesinin bir parçası olarak ayarlayın:

        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. sahte parametresini ITaskItem oluşturun (Moq kullanarak) ve ayrıştırılacak dosyanın üzerine gelin. Ardından, parametreleriyle özel görevi oluşturun AppSettingStronglyTyped . Son olarak, derleme altyapısını MSBuild özel görevine ayarlayın:

    //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;
    

    Ardından, gerçek görev eylemini gerçekleştirmek için görev kodunu yürütebilirsiniz:

     //Act
     var success = appSettingStronglyTyped.Execute();
    
  3. Son olarak, testin beklenen sonucunu onaylar:

    //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. Diğer testler bu deseni izler ve tüm olasılıkları genişletir.

Dekont

Oluşturulan dosyalar olduğunda, çakışmayı önlemek için her test için farklı bir dosya adı kullanmanız gerekir. Test temizleme olarak oluşturulan dosyaları silmeyi unutmayın.

Tümleştirme testleri

Birim testleri önemlidir, ancak özel MSBuild görevini gerçekçi bir derleme bağlamında da test etmeniz gerekir.

System.Diagnostics.Process Sınıfı , yerel ve uzak işlemlere erişim sağlar ve yerel sistem işlemlerini başlatmanızı ve durdurmanızı sağlar. Bu örnek, test MSBuild dosyalarını kullanarak birim testi üzerinde bir derleme çalıştırır.

  1. Test kodunun her test için yürütme bağlamını başlatması gerekir. Komutun yolunun dotnet ortamınız için doğru olduğundan emin olun. Tam örnek burada verilmiştir.

         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. Temizleme sırasında testin işlemi tamamlaması gerekir:

        [TestCleanup()]
         public void Cleanup()
         {
             buildProcess.Close();
         }
    
  3. Şimdi her testi oluşturun. Her testin yürütülmesi için kendi MSBuild dosya tanımı gerekir. Örneğin testscript-success.msbuild. Dosyayı anlamak için bkz . Öğretici: Özel görev girerek.

    <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. Test bağımsız değişkeni bu MSBuild dosyasını derleme yönergelerini verir:

     //Arrange
     buildProcess.StartInfo.Arguments = "build .\\Resources\\testscript-success.msbuild /t:generateSettingClass";
    
  5. Yürüt ve çıktıyı al:

    //Act
    ExecuteCommandAndCollectResults();
    

    Burada ExecuteCommandAndCollectResults() şu şekilde tanımlanır:

    private void ExecuteCommandAndCollectResults()
    {
         buildProcess.Start();
         while (!buildProcess.StandardOutput.EndOfStream)
         {
             output.Add(buildProcess.StandardOutput.ReadLine() ?? string.Empty);
         }
         buildProcess.WaitForExit();
    }
    
  6. Son olarak, beklenen sonucu değerlendirin:

    //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
    

Sonuç

Birim testi yararlıdır çünkü kodu test edip hata ayıklayarak belirli bir kod parçasının doğruluğunu sağlayabilirsiniz, ancak görevin gerçekçi bir derleme bağlamında yürütülmesini sağlamak için tümleştirme testlerine sahip olmak önemlidir. Bu öğreticide, MSBuild özel görevini test etme hakkında bilgi edindi.

Sonraki adımlar

REST API kod oluşturmayı yerine getiren daha karmaşık bir özel görev oluşturun.