LoginSignup
1
2

More than 1 year has passed since last update.

Azure PipelinesのYAMLでXamarin.Forms製アプリのCI環境を構築する方法(xUnit)

Last updated at Posted at 2021-11-30

「Azure PipelinesのYAMLでXamarin.Forms製アプリのCI/CD環境を構築する」は3部構成です。
記事を順番に読み進めると、Azure PipelinesでXamarin.Forms製アプリのCI/CD環境が構築できるようになります。

第1部: CI環境の構築 ←イマココ
第2部: App Center配布パイプラインの構築
第3部: ストア配布パイプラインの構築

はじめに

本記事は Xamarin / MAUI Advent Calendar 2021 の1日目の記事です。

Azure Pipelinesを使い、Xamarin.Forms製アプリの単体テストを行うCIを構築します。

本記事で説明しないこと

設定ファイルの構成

Azure PipelinesのYAMLでiOSアプリのCI環境を構築する方法 と同様なので省略します。

name

Azure PipelinesのYAMLでiOSアプリのCI環境を構築する方法 と同様なので説明は省略します。

trigger

Azure PipelinesのYAMLでiOSアプリのCI環境を構築する方法 と同様なので説明は省略します。

設定のみ紹介します。

ci.yml
trigger:
  batch: true
  branches:
    include:
    - main
    - develop
  paths:
    exclude:
    - Docs
    - README.md
    - LICENSE

schedules

Azure PipelinesのYAMLでiOSアプリのCI環境を構築する方法 と同様なので省略します。

設定のみ紹介します。

ci.yml
schedules:
- cron: "0 15 * * *"
  displayName: Daily midnight build
  branches:
    include:
    - main
    - develop
  always: true

variables

今回は使っていないので省略します。

jobs

ジョブを1つのみ用意しています。

test

単体テストを実行するジョブです。

dotnet test コマンドで単体テストを実行し、Azure DevOps上にテスト結果とコードカバレッジを表示します。
xUnitを使っているので、 testResultsFormatxUnit を指定しています。

ci.yml
  steps:
  # テスト
  - task: DotNetCoreCLI@2
    displayName: 'Dotnet test'
    inputs:
      command: test
      projects: '$(System.DefaultWorkingDirectory)/{単体テストのプロジェクト}.csproj'
      arguments: '--collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=json,cobertura,lcov,teamcity,opencover'

  # テスト結果のアップロード
  - task: PublishTestResults@2
    displayName: 'Publish test results'
    inputs:
      testResultsFormat: 'xUnit'
      testResultsFiles: '*.trx'
      searchFolder: '$(Agent.TempDirectory)'
      mergeTestResults: true

  # コードカバレッジのアップロード
  - task: PublishCodeCoverageResults@1
    displayName: 'Publish code coverage report'
    inputs:
      codeCoverageTool: 'Cobertura'
      summaryFileLocation: '$(Agent.TempDirectory)\*\coverage.cobertura.xml'
      reportDirectory: '$(Build.SourcesDirectory)\TestResults\Coverage\Reports'
      failIfCoverageEmpty: true

設定ファイルの全体図

最後に設定ファイルの全体図を載せます。

ci.yml
name: $(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r)

trigger:
  batch: true
  branches:
    include:
    - main
    - develop
  paths:
    exclude:
    - Docs
    - README.md
    - LICENSE

schedules:
- cron: "0 15 * * *"
  displayName: Daily midnight build
  branches:
    include:
    - main
    - develop
  always: true

jobs:
- job: test
  pool:
    vmImage: 'windows-2019'

  steps:
  # テスト
  - task: DotNetCoreCLI@2
    displayName: 'Dotnet test'
    inputs:
      command: test
      projects: '$(System.DefaultWorkingDirectory)/{単体テストのプロジェクト}.csproj'
      arguments: '--collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=json,cobertura,lcov,teamcity,opencover'

  # テスト結果のアップロード
  - task: PublishTestResults@2
    displayName: 'Publish test results'
    inputs:
      testResultsFormat: 'xUnit'
      testResultsFiles: '*.trx'
      searchFolder: '$(Agent.TempDirectory)'
      mergeTestResults: true

  # コードカバレッジのアップロード
  - task: PublishCodeCoverageResults@1
    displayName: 'Publish code coverage report'
    inputs:
      codeCoverageTool: 'Cobertura'
      summaryFileLocation: '$(Agent.TempDirectory)\*\coverage.cobertura.xml'
      reportDirectory: '$(Build.SourcesDirectory)\TestResults\Coverage\Reports'
      failIfCoverageEmpty: true

シンプルなYAMLファイルなので、慣れれば読みやすいと思います。

おまけ: PR時にCIを回す

Azure PipelinesのYAMLでiOSアプリのCI環境を構築する方法 と同様なので省略します。

おわりに

Azure PipelinesのYAMLで基本的なXamarin.Forms製アプリのCIを回すことができました!
本記事の内容はXamarin.Forms固有の技術を使っておらず、xUnitを使っているプロジェクトなら適用できます。

逆にいうとXamarin.*を使ったクラスは単体テストが書きづらいです。
詳細は私が昨年のAdvent Calendarで書いた記事をご参照ください。

以上 Xamarin / MAUI Advent Calendar 2021 の1日目の記事でした。
明日は @ytabuchi さんの記事です。

参考リンク

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2