使用Azure Pipelines实现持续集成

使用Azure Pipelines实现持续集成

写在开头

之前我已经使用了github action实现了,但实际上那并不能算是持续集成。

所以什么是持续集成?

  1. 每个人每天将自己的代码多次推送至主分支上

  2. 拥有自测试代码验证

  3. 当出现错误时,使其恢复正常是第一任务

注意:大多数情况下,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分。

注意,不要纯粹为了追求测试覆盖率而不写断言!!!!!!

posted @ 2025-05-26 19:26  ssz0312  阅读(12)  评论(0)    收藏  举报