テストカバレッジが出力されない現象の解決方法についてはこちら
概要
コマンドラインから普通に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 が複数見つかったよ
という様な警告が出ている事で気がつきました。
ログを見るって大事ですね。