Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
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)); }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();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 contentDiğ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.
Test kodunun her test için yürütme bağlamını başlatması gerekir. Komutun yolunun
dotnetortamı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; }Temizleme sırasında testin işlemi tamamlaması gerekir:
[TestCleanup()] public void Cleanup() { buildProcess.Close(); }Ş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>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";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(); }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.