在最近的一个基于微软现代跨平台技术栈的新项目中,原本打算讲述在计算一个看似基础的指标时所经历的诸多步骤的痛苦。但相反,将告诉,生活可以变得多么愉快。
新项目技术栈如下:
测试与ASP.NET Core
在安装了cake并编写了构建任务之后,非常高兴地发现,因为测试是一等公民,可以这样测试:
Task("Build")
.IsDependentOn("Restore")
.Does(() =>
{
var settings = new DotNetCoreBuildSettings {
Configuration = configuration
};
DotNetCoreBuild("./CakeCoverageTest.sln", settings);
});
这转化为:
dotnet.exe test "CakeCoverageTest.Test/CakeCoverageTest.Test.csproj" --no-build
它运行ASP.NET Core内置的测试基础设施,该基础设施原生识别XUnit和NUnit。
NoBuild = true
是因为否则.NET测试命令将尝试构建,喜欢让Cake处理依赖关系。这可以防止多次构建,例如,如果一个高层次的Deploy任务依赖于Test和Package,而这两个任务又都依赖于Build。
在这种情况下,Cake足够智能,如果运行Deploy,它只会构建一次。这与任何"AKE"工具(如Make, Psake, Rake,或MS Build)并没有太大的不同,但它比bash或Powershell脚本更好,因为需要使用全局状态。任务依赖管理++。
获取覆盖率
在Visual Studio 15.8之前,获取覆盖率将涉及切换到仅限Windows的vstest.console.exe替代方案,并需要Visual Studio Enterprise。然后,它将需要添加测试适配器,修复工具路径的错误,添加引用Microsoft.CodeCoverage NuGet包,添加--collect "Code Coverage"
。不幸的是,它仍然仅限于Windows,但他们已经取消了对Visual Studio Enterprise的要求。使其跨平台是议程上的事项,甚至可能在阅读本文时已经得到支持。
Cake目前还不支持覆盖参数,但有了ArgumentCustomization参数的灵活性,有一个简单的解决方案:
Task("Test")
.Description("Runs unit tests.")
.IsDependentOn("Build")
.Does(() =>
{
var testLocation = File("./CakeCoverageTest.Test/CakeCoverageTest.Test.csproj");
var settings = new DotNetCoreTestSettings {
Configuration = configuration,
NoBuild = true,
ArgumentCustomization = args => args
.Append("--collect").AppendQuoted("Code Coverage")
.Append("--logger").Append("trx")
};
DotNetCoreTest(testLocation, settings);
});
这转化为:
dotnet test "CakeCoverageTest.Test/CakeCoverageTest.Test.csproj" --configuration Release --no-build --collect "Code Coverage" --logger trx
并且有一点运气,它应该输出类似于以下内容:
Starting test execution, please wait...
Results File:
C:\dev\Cake\CakeCoverageTest\CakeCoverageTest.Test\TestResults\Lee_LEE-XPS_2018-10-21_17_34_47.trx
Attachments:
C:\dev\Cake\CakeCoverageTest\CakeCoverageTest.Test\TestResults\
3ba423f8-2f10-4bc2-8b53-b4fef907369e\Lee_LEE-XPS_2018-10-21.17_34_44.coverage
Total tests: 1. Passed: 1. Failed: 0. Skipped: 0.
Test Run Successful.
这是多么棒啊?!几乎完成了。