使用Azure Pipelines实现持续集成
使用Azure Pipelines实现持续集成
写在开头
之前我已经使用了github action实现了,但实际上那并不能算是持续集成。
所以什么是持续集成?
-
每个人每天将自己的代码多次推送至主分支上
-
拥有自测试代码验证
-
当出现错误时,使其恢复正常是第一任务
注意:大多数情况下,
TDD是编写自测试代码的最佳方式
OK,让我们进入主题。
实现
创建新的pipeline,链接至github仓库地址,选择Asp.Net Core模版,默认会生成以下:
trigger:
- master
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: VSTest@2
inputs:
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
接下来,让我们配置测试覆盖率:
- task: VSTest@2
inputs:
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
codeCoverageEnabled: true # ✅ 启用测试覆盖率
testRunTitle: '单元测试覆盖率'
runSettingsFile: 'coverage.runsettings'
# 上传代码覆盖率报告
- task: PublishCodeCoverageResults@2
inputs:
summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'
上文中的
coverage.runsettings用于配置包含或者排除哪些项目
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<DataCollectionRunSettings>
<DataCollectors>
<DataCollector friendlyName="Code Coverage">
<Configuration>
<CodeCoverage>
<ModulePaths>
<Exclude>
<!-- 🚫 排除测试代码 -->
<ModulePath>.*Tests.dll</ModulePath>
<!-- 🚫 排除系统和第三方库 -->
<ModulePath>.*FluentValidation.dll</ModulePath>
<ModulePath>.*Shouldly.dll</ModulePath>
<ModulePath>.*diffengine.dll</ModulePath>
<ModulePath>.*ssz.infrastructure.dll</ModulePath>
</Exclude>
</ModulePaths>
</CodeCoverage>
</Configuration>
</DataCollector>
</DataCollectors>
</DataCollectionRunSettings>
</RunSettings>
运行后,可以得到以下:

通过上述步骤我们可以执行自测试代码,并计算测试覆盖率,如果有一个测试错误,则流水线会直接退出
是否还有可优化的空间?
NuGetCommand命令消耗了大量的时间,查阅微软官方文档,可以进行nuget包缓存
variables:
NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages
- task: Cache@2
displayName: Cache v2 task
inputs:
key: 'nuget | "$(Agent.OS)" | **/packages.lock.json,!**/bin/**,!**/obj/**'
restoreKeys: |
nuget | "$(Agent.OS)"
nuget
path: '$(NUGET_PACKAGES)'
cacheHitVar: 'CACHE_RESTORED'
- task: NuGetCommand@2
condition: ne(variables.CACHE_RESTORED, true)
inputs:
command: 'restore'
restoreSolution: '**/*.sln'
注意:如果出现
project.assets.json not found错误,删除condition: ne(variables.CACHE_RESTORED, true)这一行即可
写在最后
通过自测试代码,我们能够更容易发现代码中的错误,同时能够更加自信的进行重构。
关于测试覆盖率的问题:
我们是否应该追求高测试覆盖率?
答案是肯定的,毕显而易见的道理,当目标是100分时,才能达到90分。
注意,不要纯粹为了追求测试覆盖率而不写
断言!!!!!!

浙公网安备 33010602011771号