単体テスト

クロスプラットフォーム アプリは、品質、信頼性、パフォーマンスを向上させるために実際の世界で使用されるため、テストする必要があります。 単体テスト、統合テスト、ユーザー インターフェイス テストなど、多くの種類のテストをアプリで実行する必要があります。 単体テストは最も一般的な形式であり、高品質のアプリを構築するために不可欠です。

単体テストでは、アプリの小さな単位 (通常はメソッド) を受け取り、コードの残りの部分から分離し、期待どおりに動作することを確認します。 その目的は、機能の各ユニットが期待どおりに実行されることを確認することです。そのため、エラーはアプリ全体に伝達されません。 発生場所でバグを検出する方が、2 次障害点でバグの影響を間接的に観察するよりも効率的です。

単体テストでは、通常、arrange-act-assert パターンを使用する必要があります。

Step Description
Arrange オブジェクトを初期化し、テスト対象のメソッドに渡されるデータの値を設定します。
Act 必要な引数を使用して、テスト対象のメソッドを呼び出します。
Assert テスト対象のメソッドのアクションが期待どおりに動作することを確認します。

このパターンにより、単体テストが読み取り可能で、自己記述性があり、一貫性があることが確認されます。

単体テストは、ソフトウェア開発ワークフローに不可欠な部分である場合に、コード品質に最も大きな影響を与えます。 単体テストは、アプリの設計ドキュメントと機能仕様として機能できます。 メソッドが記述されたらすぐに、標準、境界、不正な入力データのケースに応答してメソッドの動作を検証し、コードによって行われた明示的または暗黙的な前提条件を確認する単体テストを記述する必要があります。 または、テスト駆動型開発では、単体テストはコードの前に記述されます。

Important

単体テストは回帰に対して非常に効果的です。 つまり、以前は機能していたが、障害のある更新によって妨げられている機能です。

xUnit は、.NET MAUI アプリに推奨されるテスト フレームワークです。

xUnit テストを .NET MAUI ソリューションに追加する

xUnit テストを .NET MAUI ソリューションに追加するには、次のいずれかを行います。

  • Visual Studio を使用して、新しい xUnit テスト プロジェクト をソリューションに追加します。

    OR

  • .NET CLI を使用して新しい xUnit テスト プロジェクトを作成し、ソリューションに追加します。 詳細については、 dotnet テストと xUnit を使用した .NET での C# の単体テストに関する説明を参照してください。

xUnit テスト プロジェクトのプロジェクト ファイル (.csproj) は、次の例のようになります。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>

    <IsPackable>false</IsPackable>
    <IsTestProject>true</IsTestProject>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="6.0.2" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
    <PackageReference Include="xunit" Version="2.9.2" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
  </ItemGroup>

  <ItemGroup>
    <Using Include="Xunit" />
  </ItemGroup>

</Project>

$(TargetFramework) ビルド プロパティは、テスト プロジェクトのターゲット フレームワークを指定します。 これは、コンピューターにインストールされている .NET の最新バージョンになります。

xunit パッケージには、テスト フレームワーク自体を含む子パッケージと、単体テストに関する一般的な問題を検出する Roslyn アナライザーが含まれています。 xunit.runner.visualstudio コマンドを使用して Visual Studio で単体テストを実行するには、Microsoft.NET.Test.Sdkパッケージとdotnet test パッケージが必要です。 coverlet.collector パッケージを使用すると、コード カバレッジを収集できます。 コード カバレッジを収集する予定がない場合は、このパッケージ参照を削除できます。 単体テストのコード カバレッジの詳細については、「単体テスト にコード カバレッジを使用する」を参照してください。

単体テスト用にアプリを構成するには、主に次の 2 つの方法があります。

  1. 単体テストするコードは、.NET MAUI クラス ライブラリ プロジェクトにあります。
  2. 単体テストするコードは、.NET MAUI アプリ プロジェクトにあります。

各アプローチには、特定の構成が必要です。

単体テスト用に .NET MAUI クラス ライブラリ プロジェクトを構成する

この方法では、単体テストするコードは、.NET MAUI アプリ プロジェクトによって使用される .NET MAUI クラス ライブラリ プロジェクトにあります。 .NET MAUI クラス ライブラリに対して単体テストを記述するには、プロジェクトで使用されるターゲット フレームワークを更新する必要があります。 これを実現するには、xUnit テスト プロジェクト ファイル ($(TargetFramework)) の ビルド プロパティの値を、.NET MAUI クラス ライブラリ プロジェクト ファイルの$(TargetFrameworks) ビルド プロパティに追加します。

<TargetFrameworks>net9.0;net9.0-android;net9.0-ios;net9.0-maccatalyst</TargetFrameworks>

この例では、.NET MAUI クラス ライブラリ プロジェクト ファイルの net9.0 ビルド プロパティに $(TargetFrameworks) の値が追加されています。

次に、xUnit テスト プロジェクトから .NET MAUI クラス ライブラリ プロジェクトへの参照を追加する必要があります。

単体テスト用に .NET MAUI アプリ プロジェクトを構成する

この方法では、単体テストするコードは .NET MAUI アプリ プロジェクトにあります。 .NET MAUI アプリ プロジェクトに対して単体テストを記述するには、プロジェクトで使用されるターゲット フレームワークを更新する必要があります。 これを実現するには、xUnit テスト プロジェクト ファイル ($(TargetFramework)) の ビルド プロパティの値を、.NET MAUI アプリ プロジェクト ファイルの$(TargetFrameworks) ビルド プロパティに追加します。

<TargetFrameworks>net9.0;net9.0-android;net9.0-ios;net9.0-maccatalyst</TargetFrameworks>

この例では、 net9.0 の値が.NET MAUI アプリ プロジェクト ファイルの $(TargetFrameworks) ビルド プロパティに追加されています。

また、xUnit テスト プロジェクトで使用されるターゲット フレームワークの実行可能ファイルを出力しないように、.NET MAUI アプリ プロジェクトを変更する必要もあります。 これは、.NET MAUI アプリ プロジェクト ファイルの $(OutputType) ビルド プロパティに条件を追加することで実現できます。

<OutputType Condition="'$(TargetFramework)' != 'net9.0'">Exe</OutputType>

この例では、.NET MAUI アプリ プロジェクトは、ターゲット フレームワークが net9.0されていない場合にのみ実行可能ファイルを生成します。

次に、xUnit テスト プロジェクトから .NET MAUI アプリ プロジェクトへの参照を追加する必要があります。

単体テストを作成する

xUnit では、次の 2 種類の単体テストがサポートされています。

テストの種類 Attribute Description
Facts Fact 常に true であるテスト。不変条件をテストします。
理論 Theory 特定のデータ セットに対してのみ true となるテスト。

単体テストは、xUnit テスト プロジェクトに配置し、 [Fact] または [Theory] 属性で修飾する必要があります。 次の例は、 [Fact] 属性を使用する単体テストを示しています。

namespace MyUnitTests
{
    public class MyTests
    {
        [Fact]
        public void PassingTest()
        {
            Assert.AreEqual(4, 2+2);
        }

        [Fact]
        public void FailingTest()
        {
            Assert.AreEqual(5, 2+2);
        }
    }
}

この例では、テストは意図的に合格したテストと失敗したテストを表しています。

次の例は、 [Theory] 属性を使用する単体テストを示しています。

namespace MyUnitTests
{
    public class MyTests
    {
        [Theory]
        [InlineData(3)]
        [InlineData(4)]
        [InlineData(5)]
        public void MyTheoryTest(int value)
        {
            Assert.True(value % 2 == 1);
        }
    }
}

この例では、テスト メソッドは 1 つだけですが、データの項目ごとに理論が 1 回実行されるため、実際には 3 つのテストがあります。

Tip

各単体テストで 1 つの操作をテストします。 テストの複雑さが増すと、そのテストの検証がより困難になります。 単体テストを 1 つの懸念事項に限定することで、テストが反復可能で分離され、実行時間が短くなっていることを確認できます。 詳細については、「 単体テストのベスト プラクティス」を参照してください。

単体テストの実行

単体テストは、Visual Studio のテスト エクスプローラーで、または dotnet test コマンドを使用して実行できます。 テスト エクスプローラーの詳細については、「テスト エクスプローラーを使用した単体テストの実行」を参照してください。 dotnet test コマンドの詳細については、dotnet テストと xUnit および dotnet テストを使用した .NET での C# の単体テストを参照してください。

デバイス ランナーを使用して単体テストを実行する

単体テストは、デバイス ランナーを使用してデバイスで実行することもできます。 デバイス ランナーは、 XHarness を使用して CLI からテストを実行するためのビジュアル ランナー シェルとフックを提供するテスト ランナー アプリです。 詳細については、テスト デバイス ランナー wikiを参照してください。

プラットフォーム アプリでテストを実行する

.NET 11 には、Android および Apple プラットフォーム向けの Microsoft.Testing.Platform (MTP) テスト プロジェクト テンプレートが含まれています:

Template Platform テスト プロセス
androidtest Android 接続されているデバイスまたはエミュレーター上のアプリ プロセス
iostest iOS 接続されているデバイスまたはシミュレーター上のアプリ プロセス
tvostest tvOS 接続されているデバイスまたはシミュレーター上のアプリ プロセス
macostest macOS デスクトップ アプリ プロセス
maccatalysttest Mac Catalyst デスクトップ アプリ プロセス

各テンプレートは、プラットフォーム アプリで実行される MSTest プロジェクトを作成します。 プラットフォーム テスト ツールは、MTP を介して dotnet test 結果を報告します。 MTP の詳細については、Microsoft.Testing.Platform (MTP) の概要を参照してください。

たとえば、次のコマンドを使用して、Android テスト プロジェクトを作成して実行します。

dotnet new androidtest -n MyAndroidTests
dotnet test --project ./MyAndroidTests/MyAndroidTests.csproj

テスト コマンドを実行する前に、Android エミュレーターを起動するか、Android デバイスを接続します。 このコマンドは、テスト アプリをビルドしてインストールし、Android インストルメンテーションを使用してアプリ プロセスでテストを実行します。

プラットフォーム テスト プロジェクトは、この記事で前述した xUnit プロジェクトとは異なります。 通常の xUnit プロジェクトは、ホスト .NET ランタイムを対象とし、プラットフォーム アプリ プロセスを必要としないコードをテストします。 テストで Android、iOS、tvOS、macOS、または Mac Catalyst API と動作を使用する必要がある場合は、プラットフォーム テスト プロジェクトを使用します。 テスト コマンドの MTP 形式の詳細については、dotnet testMicrosoft.Testing.Platform を使用する場合を参照してください。

こちらも参照ください