次の方法で共有


単体テスト

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

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

通常、単体テストでは準備 - 実行 - アサート パターンを使用する必要があります。

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

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

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

重要

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

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

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

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

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

    OR

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

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

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

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

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

  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="6.0.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
    <PackageReference Include="xunit" Version="2.5.3" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
  </ItemGroup>

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

</Project>

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

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

単体テスト用にアプリを構築するには、主に 2 つのアプローチがあります。

  1. 単体テスト対象のコードは .NET MAUI クラス ライブラリ プロジェクト内にある。
  2. 単体テスト対象のコードは .NET MAUI アプリ プロジェクト内にある。

各アプローチには固有の構成が必要です。

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

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

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

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

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

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

このアプローチでは、単体テスト対象のコードは .NET MAUI アプリ プロジェクト内にあります。 .NET MAUI アプリ プロジェクトに対する単体テストを作成するには、プロジェクトに使われるターゲット フレームワークを更新する必要があります。 これを実行するには、xUnit テスト プロジェクト ファイル (.csproj) の $(TargetFramework) ビルド プロパティの値を .NET MAUI アプリ プロジェクト ファイルの $(TargetFrameworks) ビルド プロパティに追加します。

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

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

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

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

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

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

単体テストを作成する

xUnit は 2 種類の単体テストをサポートしています。

テストの種類 属性 説明
ファクト 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 つのテストがあります。

ヒント

各単体テストで 1 つの操作をテストします。 テストの複雑さが増すと、そのテストの検証がより困難になります。 単体テストを 1 つの懸念事項に限定することで、テストの再現性と分離性を確保し、実行時間を短縮できます。 詳細については、単体テストのベスト プラクティスに関するページを参照してください。

単体テストを実行する

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

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

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

関連項目