Kurz: Testování vlastní úlohy
Pomocí funkcí testování jednotek v sadě Visual Studio můžete otestovat vlastní úlohu MSBuild před distribucí, abyste zajistili správnost kódu. Informace o výhodách provádění testů a základních testovacích nástrojů najdete v základních informacích o testech jednotek. V tomto kurzu použijete příklady kódu použité v jiných kurzech vlastních úloh NÁSTROJE MSBuild. Následující projekty použité v těchto kurzech jsou k dispozici na GitHubu a zahrnují testy jednotek a integrace pro vlastní úlohy NÁSTROJE MSBuild:
Test jednotek
Vlastní úloha MSBuild je třída, která dědí z Task (přímo nebo nepřímo, protože ToolTask dědí z Task). Metoda, která provádí akce přidružené k úkolu je Execute()
. Tato metoda přebírá některé vstupní hodnoty (parametry) a má výstupní parametry, které můžete použít k otestování platnosti. V tomto případě jsou některé vstupní parametry cestami k souborům, takže tento příklad obsahuje testovací vstupní soubory ve složce s názvem Resources. Tato úloha NÁSTROJE MSBuild také generuje soubory, takže test potvrzuje vygenerované soubory.
Je potřeba modul sestavení, což je třída, která implementuje IBuildEngine. V tomto příkladu je napodobení pomocí Moqu, ale můžete použít i jiné napodobení nástrojů. Tento příklad shromažďuje chyby, ale můžete shromáždit další informace a pak je uplatnit.
Napodobení Engine
je potřeba pro všechny testy, takže je zahrnuta jako TestInitialize
(provádí se před každým testem a každý test má vlastní buildový modul).
Úplný kód najdete v souboru AppSettingStronglyTypedTest.cs v úložišti ukázek .NET na GitHubu.
Vytvořte úlohu a nastavte parametry jako součást uspořádání testu:
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)); }
Vytvořte napodobení parametru ITaskItem (pomocí Moq) a nasměrujte na soubor, který se má analyzovat. Potom vytvořte
AppSettingStronglyTyped
vlastní úlohu s jeho parametry. Nakonec nastavte modul sestavení na vlastní úlohu 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;
Pak spusťte kód úkolu, který provede skutečnou akci úkolu:
//Act var success = appSettingStronglyTyped.Execute();
Nakonec otestujte očekávaný výsledek testu:
//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
Ostatní testy se řídí tímto vzorem a rozšiřují všechny možnosti.
Poznámka:
Když se vygenerují soubory, musíte pro každý test použít jiný název souboru, aby nedocházelo ke kolizím. Nezapomeňte odstranit vygenerované soubory jako testovací vyčištění.
Integrační testy
Testy jednotek jsou důležité, ale potřebujete také otestovat vlastní úlohu MSBuild v realistickém kontextu sestavení.
Třída System.Diagnostics.Process poskytuje přístup k místním a vzdáleným procesům a umožňuje spouštět a zastavovat místní systémové procesy. Tento příklad spustí sestavení na testu jednotek pomocí testovacích souborů MSBuild.
Testovací kód musí inicializovat kontext spuštění pro každý test. Věnujte pozornost tomu, aby cesta k
dotnet
příkazu byla pro vaše prostředí přesná. Tady je úplný příklad.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; }
Při vyčištění musí test dokončit proces:
[TestCleanup()] public void Cleanup() { buildProcess.Close(); }
Teď vytvořte každý test. Každý test bude potřebovat k provedení vlastní definice souboru MSBuild. Například testscript-success.msbuild. Informace o souboru najdete v tématu Kurz: Kréta vlastní úkol.
<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>
Testovací argument poskytuje pokyny k sestavení tohoto souboru MSBuild:
//Arrange buildProcess.StartInfo.Arguments = "build .\\Resources\\testscript-success.msbuild /t:generateSettingClass";
Spusťte a získejte výstup:
//Act ExecuteCommandAndCollectResults();
Kde
ExecuteCommandAndCollectResults()
je definován jako:private void ExecuteCommandAndCollectResults() { buildProcess.Start(); while (!buildProcess.StandardOutput.EndOfStream) { output.Add(buildProcess.StandardOutput.ReadLine() ?? string.Empty); } buildProcess.WaitForExit(); }
Nakonec vyhodnoťte očekávaný výsledek:
//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
Závěr
Testování jednotek je užitečné, protože můžete testovat a ladit kód, abyste zajistili správnost jednotlivých částí kódu, ale s integračními testy je důležité zajistit, aby se úloha prováděla v reálném kontextu sestavení. V tomto kurzu jste zjistili, jak otestovat vlastní úlohu NÁSTROJE MSBuild.
Další kroky
Vytvořte složitější vlastní úlohu, která vytváří generování kódu rozhraní REST API.