はじめに (対象読者・この記事でわかること)

この記事は、.NET開発者、特にNUnitを使用しているが、CI/CDパイプラインやDocker環境でのテスト実行に興味がある方を対象にしています。

この記事を読むことで、NUnitテストをVisual Studio以外の環境(コマンドライン、CI/CDツール、Dockerコンテナ)で実行する方法、必要なツールのセットアップ方法、実行時のトラブルシューティング方法を理解できます。これにより、テストの自動化と継続的インテグレーションがよりスムーズに行えるようになります。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 前提となる知識1: C#と.NETの基本的な知識 前提となる知識2: NUnitテストの基本的な書き方と実行方法 前提となる知識3: コマンドライン操作の基本的な知識

NUnitをVisual Studio以外で実行する背景と概要

NUnitは.NETプラットフォームで広く使用されているオープンソースのユニットテストフレームワークです。多くの.NET開発者はVisual Studio統合開発環境(IDE)を使用してNUnitテストを作成・実行しています。しかし、継続的インテグレーション/継続的デリバリ(CI/CD)パイプラインの構築や、Dockerコンテナでの実行、あるいは単純にコマンドラインからテストを実行したい場合があります。

Visual Studioに依存しないNUnitテストの実行は、以下のようなメリットがあります。 - CI/CDパイプラインとの統合 - 軽量なテスト環境の構築 - 異なるOS環境でのテスト実行 - 自動化テストの実行

本記事では、具体的な実行方法とトラブルシューティングについて詳しく解説します。

Visual Studio以外でのNUnitテスト実装方法

ステップ1: .NET CLIを使用したNUnitテストの実行

まずは最も基本的な方法である.NET CLIを使用したNUnitテストの実行方法を解説します。

  1. プロジェクトの準備 NUnitテストを実行するには、まずNUnitテストプロジェクトを作成する必要があります。以下のコマンドで新しいNUnitテストプロジェクトを作成します。
dotnet new nunit -n MyTestProject
cd MyTestProject
  1. テストの作成 作成されたプロジェクトに、簡単なテストクラスを追加します。例として、文字列を大文字に変換するメソッドのテストを作成してみましょう。
Csharp
using NUnit.Framework; namespace MyTestProject { [TestFixture] public class StringHelperTests { [Test] public void ToUpperCase_InputLowercaseString_ReturnUppercaseString() { // Arrange string input = "hello"; string expected = "HELLO"; // Act string result = StringHelper.ToUpperCase(input); // Assert Assert.AreEqual(expected, result); } } public class StringHelper { public static string ToUpperCase(string input) { return input.ToUpper(); } } }
  1. テストの実行 プロジェクトのルートディレクトリで以下のコマンドを実行すると、テストが実行されます。
dotnet test

このコマンドは、プロジェクト内のすべてのテストを検出し、実行して結果を表示します。

  1. テスト結果のカスタマイズ テスト結果をより詳細に表示したい場合は、オプションを追加します。
dotnet test --logger "console;verbosity=detailed"

これにより、各テストの詳細な実行結果が表示されます。

ステップ2: CI/CDツールとの連携

次に、CI/CDツール(GitHub ActionsやAzure DevOpsなど)とNUnitテストを連携させる方法を解説します。

  1. GitHub Actionsを使用した例 GitHubリポジトリに.github/workflows/dotnet.ymlというファイルを作成し、以下の内容を記述します。
Yaml
name: .NET CI on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup .NET uses: actions/setup-dotnet@v3 with: dotnet-version: 6.0.x - name: Restore dependencies run: dotnet restore - name: Build run: dotnet build --no-restore - name: Test run: dotnet test --no-build --verbosity normal --collect:"XPlat Code Coverage"

このワークフローは、コードがプッシュまたはプルリクエストされたときに自動的に実行され、依存関係の復元、ビルド、テストを実行します。

  1. Azure DevOps Pipelinesを使用した例 Azure DevOpsプロジェクトで、以下のyaml定義を使用してパイプラインを設定します。
Yaml
trigger: - main pool: vmImage: 'ubuntu-latest' variables: buildConfiguration: 'Release' steps: - task: DotNetCoreCLI@2 inputs: command: 'restore' projects: '**/*.csproj' feeds: 'my-nuget-feed' - task: DotNetCoreCLI@2 inputs: command: 'build' projects: '**/*.csproj' arguments: '--configuration $(buildConfiguration)' - task: DotNetCoreCLI@2 inputs: command: 'test' projects: '**/*.csproj' arguments: '--configuration $(buildConfiguration) --collect:"XPlat Code Coverage"' publishTestResults: true

このパイプラインは、コードがmainブランチにプッシュされたときに自動的に実行され、依存関係の復元、ビルド、テストを実行し、テスト結果を公開します。

ステップ3: DockerコンテナでのNUnitテスト実行

次に、Dockerコンテナ内でNUnitテストを実行する方法を解説します。

  1. Dockerfileの作成 プロジェクトのルートに以下の内容でDockerfileを作成します。
Dockerfile
# .NET SDKイメージを使用 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src # 依存関係を復元 COPY ["MyTestProject/MyTestProject.csproj", "MyTestProject/"] RUN dotnet restore "MyTestProject/MyTestProject.csproj" # ソースコードをコピー COPY . . WORKDIR "/src/MyTestProject" RUN dotnet build "MyTestProject.csproj" -c Release -o /app/build # テストを実行 FROM build AS test WORKDIR "/src/MyTestProject" RUN dotnet test "MyTestProject.csproj" -c Release --no-build -o /app/test # 発行 FROM build AS publish RUN dotnet publish "MyTestProject.csproj" -c Release -o /app/publish # ランタイムイメージを使用 FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "MyTestProject.dll"]
  1. Dockerイメージのビルドと実行 以下のコマンドでDockerイメージをビルドします。
docker build -t mytestproject .

テストを実行するには、以下のコマンドを使用します。

docker run --rm mytestproject dotnet test

ハマった点やエラー解決

NUnitテストをVisual Studio以外の環境で実行する際には、いくつかの問題が発生することがあります。

  1. テストアセンブリの参照不足 エラーメッセージ: "テストが見つかりません" 原因: テストプロジェクトが正しくビルドされていない、またはテストアセンブリが参照されていない。 解決策: プロジェクトファイル(.csproj)に必要なパッケージ参照が含まれていることを確認します。特に、NUnitとNUnit3TestAdapterの参照が必要です。
Xml
<ItemGroup> <PackageReference Include="NUnit" Version="3.13.3" /> <PackageReference Include="NUnit3TestAdapter" Version="4.5.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" /> </ItemGroup>
  1. 依存関係の問題 エラーメッセージ: "System.IO.FileNotFoundException"や"Could not load file or assembly" 原因: テスト実行環境に必要なアセンブリや依存関係が存在しない。 解決策: プロジェクトの発行時に依存関係を含めるか、Dockerコンテナ内でテストを実行する際にはランタイム環境を正しく設定します。

  2. テストランナーの互換性問題 エラーメッセージ: "テストアダプターが見つかりません" 原因: テストランナー(例: dotnet test)がNUnitテストアダプターを見つけられない。 解決策: テストプロジェクトにNUnit3TestAdapterパッケージが正しくインストールされていることを確認します。また、dotnet testコマンドを実行する前に、プロジェクトの依存関係が復元されていることを確認します。

解決策

これらの問題を解決するための一般的なアプローチは以下の通りです。

  1. プロジェクトファイルの確認 プロジェクトファイル(.csproj)に必要なパッケージ参照が含まれていることを確認します。NUnit、NUnit3TestAdapter、Microsoft.NET.Test.Sdkのバージョンが互換性があることを確認します。

  2. 依存関係の復元 テストを実行する前に、必ず依存関係を復元します。

dotnet restore
  1. クリーンビルド 問題が解決しない場合は、クリーンビルドを試みます。
dotnet clean
dotnet restore
dotnet build
dotnet test
  1. テストランナーの更新 最新の.NET SDKとテストランナーを使用していることを確認します。
dotnet --version
dotnet tool list -g
  1. ログの詳細化 問題の特定には、詳細なログを出力することが有効です。
dotnet test --logger "console;verbosity=detailed"

まとめ

本記事では、Visual Studioに依存しないNUnitテストの実行方法について解説しました。

  • .NET CLIを使用した基本的なテスト実行方法
  • CI/CDツール(GitHub Actions、Azure DevOps)との連携方法
  • Dockerコンテナ内でのテスト実行方法
  • よくある問題とその解決策

この記事を通して、読者はNUnitテストを多様な環境で実行できるようになり、CI/CDパイプラインの構築やDockerコンテナでのテスト実行が可能になるでしょう。これにより、テストの自動化と継続的インテグレーションがよりスムーズに行えるようになります。

今後は、テストカバレッジの測定方法や、パフォーマンステストの実行方法についても記事にする予定です。

参考資料