テストカバレッジが出力されない現象の解決方法についてはこちら
概要
コマンドラインから普通にdotnet test --no-build
したらテストが実行されるのに、CIで自動テストをしようとするとなぜかテストが動かない現象の解決方法です。
再現方法
以下のファイルを用意します。
image: mcr.microsoft.com/dotnet/core/sdk:latest
stages:
- build
- test
build:
stage: build
script:
- "dotnet build"
artifacts:
expire_in: 10 min
paths:
- "*/bin/"
- "*/obj/"
only:
- branches
except:
- master
Web_test:
stage: test
script:
- dotnet test Web.Test --no-build
dependencies:
- build
only:
- branches
except:
- master
Web.Test
というテストプロジェクトがあるとします。
これをGitLabのmasterブランチ以外にPushすればbuidとtestが実行されます。
説明
buildステージでビルドが完了しているのでtestステージではビルドの必要がありませんね。
なので、--no-build
でビルドせずに実行したいと思いました。実際にはこのtestステージは複数のジョブに別れているので、ジョブ毎にビルドしなくて良くなるので高速化するはずでした。
しかし、この--no-build
無しならテストが実行されるのに、付けるとテストせず(常にパス)ジョブが終了してしまいます。
解決方法
テストプロジェクトのプロジェクトファイル~.csproj
に以下を追加します。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<IsPackable>false</IsPackable>
<IsPublishable>false</IsPublishable>
<IsTestProject>true</IsTestProject> ←これを追加!
</PropertyGroup>
~
IsTestProject
をtrue
で追加するだけで解決します。
そもそも論ですが、dotnet new xunit
でテストプロジェクト作ってるんだから、
_人人人人人人人人人人人_
> 初めから入れといて <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
解決に半日掛かりました・・・
(もしかしたらMicrosoftの偉い人がテンプレート直してくれるかもと期待してます)
余談1
問題を見つけるキッカケは-v d
で詳細ログを出した時に、
Task "Microsoft.TestPlatform.Build.Tasks.VSTestTask" skipped, due to false condition; ('$(IsTestProject)' == 'true')
という一文を見つけた事でした。
ログを見るって大事ですね。
余談2
IsPublishable
もテンプレートでは付いていませんでした。
これが無いと、dotonet publish
した時にテストプロジェクトも出力に含まれてしまいます。
厄介なのは、それをAzure app serviceに展開すると動かなくなるという事です。
これもサーバのログに
.runtimeconfig.json が複数見つかったよ
という様な警告が出ている事で気がつきました。
ログを見るって大事ですね。