Windows アプリ SDKでビルドされた WinUI アプリをテストする

このトピックでは、ユーザー インターフェイス (UI) 機能を使用して、Windows アプリ SDKWinUI 3 を使用して作成されたアプリの機能をテストおよび検証する方法について、いくつかの推奨事項を示します。 テストは、アプリ開発プロセスの不可欠な部分です。これは、バグを早期にキャッチし、コードの品質を維持し、アプリの進化に合わせて信頼性の高いユーザー エクスペリエンスを確保するのに役立ちます。 単体テストをワークフローに組み込むことで、コードを自信を持ってリファクタリングし、新機能を追加し、既存の機能が引き続き期待どおりに動作することを知って更新プログラムを配布できます。

チュートリアル: WinUI 3 単体テスト プロジェクトを作成します。

Microsoft.UI.Xaml 名前空間のほとんどのオブジェクト型は、XAML アプリケーション プロセスの UI スレッドから使用する必要があります。 (WinUI 3 を使用しないWindows アプリ SDKで作成されたアプリのテストの詳細については、次のセクション「 WinUI 以外の機能のテストを参照してください。

テストするコードをリファクタリングするには、メイン アプリ プロジェクトからコードをプルしてライブラリ プロジェクトに配置することをお勧めします。 アプリ プロジェクトと単体テスト プロジェクトの両方で、そのライブラリ プロジェクトを参照できます。 このセクションでは、組み込みの単体テスト プロジェクト テンプレートを使用して、Visual Studioで WinUI 3 アプリの単体テストを作成する方法について説明します。

ここで説明する単体テスト アプリは、WinUI 3 アプリケーションのコンテキストで記述されています。 これは、XAML ランタイムを必要とするコードを実行するすべてのテストに必要です。 このプロジェクトでは、XAML UI スレッドを作成し、テストを実行します。

このチュートリアルでは、以下の内容を学習します。

  • Visual Studioで WinUI 単体テスト アプリ プロジェクトを作成します。
  • Visual Studio Test Explorer を使用します。
  • テスト用の WinUI クラス ライブラリ プロジェクトを追加します。
  • Visual Studio テスト エクスプローラーを使用してテストを実行します。

前提条件

WinUI 開発のために Visual Studio をインストールしてセットアップする必要があります。 「クイック スタート: 環境を設定し、WinUI 3 プロジェクトを作成する」を参照してください

WinUI 単体テスト アプリ プロジェクトを作成する

まず、単体テストプロジェクトを作成します。 このプロジェクト タイプには、必要なテンプレート ファイルがすべて用意されています。

  1. Visual Studioを開き、[スタート] ウィンドウで [新しいプロジェクトの作成 を選択します。

    Visual Studioの開始ウィンドウのスクリーンショット.

  2. 新しいプロジェクトの作成 ウィンドウで、プロジェクトをフィルター処理して C#WindowsWinUIWinUI 単体テスト アプリ テンプレートを選択し、Next

    Visual Studio '新しいプロジェクトの作成' ウィンドウのスクリーンショット。

  3. [オプション] [新規プロジェクトを構成] ウィンドウで、プロジェクトの [プロジェクト名][ソリューション名] ([同じディレクトリにソリューションとプロジェクトを配置する] チェックボックスをオフにします)、および [場所] を変更します。

  4. を選択してを作成します。

テスト エクスプローラーを使用してテストを実行する

テスト プロジェクトを作成する際、テストは、単体テストの実行に使用される Test Explorer に表示されます。 また、テストをカテゴリにグループ化したり、テスト リストをフィルター処理したり、テストのプレイリストを作成、保存、実行したり、単体テストをデバッグしたり、(Visual Studio Enterprise で) コード カバレッジを分析したりすることもできます。

UnitTests.cs ファイルには、Test Explorer で使用される単体テストのソース コードが含まれています。 既定では、次のような基本的なサンプル テストが自動的に作成されます。

namespace WinUITest1
{
   [TestClass]
   public class UnitTest1
   {
      [TestMethod]
      public void TestMethod1()
      {
         Assert.AreEqual(0, 0);
      }

      // Use the UITestMethod attribute for tests that need to run on the UI thread.
      [UITestMethod]
      public void TestMethod2()
      {
         var grid = new Grid();
         Assert.AreEqual(0, grid.MinWidth);
      }
   }
}
  1. まだ行っていない場合は、ソリューションをビルドします。 これにより、Visual Studioが使用可能なすべてのテストを "検出" できるようになります。

  2. テスト エクスプローラーを開きます。 表示されな場合は、[テスト] メニューで、[Test Explorer] を選択します (または Ctrl + E、T キーを押します)。

    Visual Studio の [テスト メニュー] のスクリーンショット

  3. テストを表示します。 [Test Explorer] ウィンドウで、すべてのノードを展開します (この時点ではサンプル テストのみが存在します)。

    Visual Studioのテスト エクスプローラー ウィンドウに表示される、既定のサンプルテストのスクリーンショット

  4. テストを実行します。

    • 個々のテスト ノードを右クリックし、[実行] を選択します。
    • テストを選択し、[再生] ボタンを押すか、Ctrl + R、T キーを押します。
    • [ビューですべてのテストを実行] ボタンを押すか、Ctrl Ctrl + R、V を押します。

    実行コマンドが強調表示されたテスト コンテキスト メニューを示すVisual Studioのテスト エクスプローラー ウィンドウのスクリーンショット。

  5. 結果を確認します。 テストが完了すると、[Test Explorer] ウィンドウに結果が表示されます。

    テストの実行結果を示すVisual Studioのテスト エクスプローラー ウィンドウのスクリーンショット。

テスト用のクラス ライブラリ プロジェクトを追加する

  1. 単体テスト ソリューションに新規プロジェクトを追加します。 ソリューション エクスプローラー で、ソリューションを右クリックし、 Add -> New Project...

     [ソリューション] コンテキスト メニューのスクリーンショットで、Visual Studio の [追加]/[新しいプロジェクト] が強調表示されています。

  2. この例では、WinUI 3 クラス ライブラリ プロジェクトを追加します。 [新しいプロジェクト] ウィンドウで C#/Windows/WinUI をフィルター処理し、WinUI クラス ライブラリ を選択>。

    Visual Studio.

  3. [ 次へ ] を選択し、プロジェクトの名前を入力し (この例では WinUIClassLibrary1使用します)、 作成キーを押します。

    ソリューション エクスプローラーで強調表示された新しい 'WinUI クラス ライブラリ' プロジェクトのスクリーンショット。コード エディターでClass1.cs ファイルが開きます。

  4. プロジェクトに新しい UserControl を追加します。 ソリューション エクスプローラーで、追加した WinUI 3 クラス ライブラリ プロジェクトを右クリックし、コンテキスト メニューから Add -> New Item を選択します。

    Visual Studio の [ソリューション] コンテキスト メニューのスクリーンショットで、[追加]/[新しい項目] が強調表示されています。

  5. [新しい項目の追加] ウィンドウで、[インストールされている項目] ボックスの一覧で WinUI ノードを選択し、結果から [ユーザー コントロール] を選択します。 コントロールに UserControl1という名前を付けます。

    WinUI\/User Control (WinUI) が強調表示された、新しい項目の追加ウィンドウのスクリーンショット in Visual Studio。

  6. UserControl1.xaml.cs コードビハインド ファイルを開きます。 この例では、単に整数を返す GetSeven という新しいパブリック メソッドを追加します。

    namespace WinUIClassLibrary1
    {
      public sealed partial class UserControl1 : UserControl
      {
         public UserControl1()
         {
             this.InitializeComponent();
         }
    
         public int GetSeven()
         {
             return 7;
         }
      }
    }
    
  7. WinUI 3 クラス ライブラリ プロジェクトの型を使用できるように、WinUI 3 クラス ライブラリ プロジェクトを単体テスト プロジェクトの依存関係として設定します。 ソリューション エクスプローラー のクラス ライブラリ プロジェクトで、Dependencies を右クリックし、 [プロジェクト参照の追加を選択します。

    Visual Studio で、[依存関係] コンテキスト メニューの [プロジェクト参照の追加] が強調表示されたスクリーンショット

    [WinUIClassLibrary1] ボックスの一覧から項目を選択します。

    [参照マネージャー] ダイアログのスクリーンショット。'WinUIClassLibrary1' プロジェクトが選択されています。

  8. UnitTests.cs で新しいテスト メソッドを作成します。 このテスト ケースでは XAML UI スレッドを実行する必要があるため、標準の[UITestMethod]属性ではなく[TestMethod]属性でマークします。

    [UITestMethod]
    public void TestUserControl1()
    {
       WinUIClassLibrary1.UserControl1 userControl1 = new WinUIClassLibrary1.UserControl1();
       Assert.AreEqual(7, userControl1.GetSeven());
    }
    

    この新しいテスト メソッドは、単体テストの 1 つとして Test Explorer に表示されるようになりました。

    新しい単体テストを含む既定のサンプル テストを示すVisual Studioのテスト エクスプローラー ウィンドウのスクリーンショット。

  9. テストを実行します。

  • 新しいテスト・ノードを右クリックし、[実行] を選択します。
  • 新規テストを選択し、[再生] ボタンを押すか、Ctrl + R、T キーを押します。
  • [ビューですべてのテストを実行] ボタンを押すか、Ctrl Ctrl + R、V を押します。

既定のサンプル テストと新しい単体テストの完了したテスト実行を示すVisual Studioのテスト エクスプローラー ウィンドウのスクリーンショット。

WinUI 以外の機能のテスト

多くの場合、アプリには Microsoft.UI.Xaml 型に依存しないが、テストが必要な機能が含まれています。 .NETコードのテストには、MSTestNUnitxUnit など、さまざまなツールを使用できます。 .NET アプリのテストの詳細については、「Testing in .NET」を参照してください。

Visual Studio では、ソリューション エクスプローラー でソリューションを右クリックし、コンテキストメニューから Add -> New Project を選択して、これらのテストツール用の新しいプロジェクトを作成できます。すべての言語セレクターでC# を選択し、Windows を選び、すべての言語セレクターからテストを選択します。続いて、すべてのプロジェクトの種類セレクターから適切なテストツールを選択します (MSTest テストプロジェクト, NUnit テストプロジェクト または xUnit テストプロジェクト)。

WinUI 3 プロジェクトを参照する新しい MSTest、NUnit、または xUnit プロジェクトを作成する場合は、次の手順を実行する必要があります。

  1. テスト プロジェクトの .csproj ファイルで TargetFramework を更新します。 この値は、WinUI 3 プロジェクトの TargetFramework と一致する必要があります。 既定では、MSTest、NUnit、および xUnit プロジェクトは、.NETでサポートされているプラットフォームの全範囲を対象としていますが、WinUI 3 プロジェクトはWindowsのみをサポートし、より具体的な TargetFramework を備えています。

    たとえば、.NET 8 をターゲットとする場合は、単体テスト プロジェクトの TargetFramework を <TargetFramework>net8.0</TargetFramework> から <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework> に更新します。

  2. テスト プロジェクトの RuntimeIdentifiers を更新します。

    <RuntimeIdentifiers Condition="$([MSBuild]::GetTargetFrameworkVersion('$(TargetFramework)')) &gt;= 8">win-x86;win-x64;win-arm64</RuntimeIdentifiers>

    <RuntimeIdentifiers Condition="$([MSBuild]::GetTargetFrameworkVersion('$(TargetFramework)')) &lt; 8">win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>

  3. テスト プロジェクトの .csproj ファイルの PropertyGroup に次のプロパティを追加して、テストで Windows アプリ SDK ランタイムが読み込まれるようにします:<WindowsAppSdkBootstrapInitialize>true</WindowsAppSdkBootstrapInitialize>

  4. テストを実行しているコンピューターにWindows アプリ SDK ランタイムがインストールされていることを確認します。 Windows アプリ SDKの展開について詳しくは、フレームワーク依存アプリが外部ロケーションと共にパッケージ化された(あるいは未パッケージ化の)場合のWindows アプリ SDK展開ガイドを参照してください。

UI テストの自動化

アプリのユーザー インターフェイスのエンド ツー エンド テストでは、ボタンのクリック、テキストの入力、表示状態の確認など、ユーザーが行う方法でアプリと対話する自動化された UI テスト ツールを使用できます。

Appium と WinAppDriver

WinAppDriver は、Windows UI オートメーション テスト用の元のMicrosoft ツールでしたが、現在はアクティブな開発中ではありません。 推奨される後継は、AppiumWindows Application Driver プラグイン (appium-windows-driver) を使用した構成です。 Appium は同じ WebDriver プロトコルを使用し、Windows UI オートメーション フレームワークを介してデスクトップ アプリWindowsサポートします。

WinUI 3 デスクトップ アプリの Appium を設定するには:

これらの手順には Node.js が必要です (LTS をお勧めします)。

  1. Appium をインストールします。 npm install -g appium
  2. Windows ドライバーをインストールします。appium driver install windows
  3. ドライバーがインストールされていることを確認します: appium driver list (インストールされている windows が表示されます)
  4. Appium サーバーを起動します。 appium
  5. WebDriver クライアント ライブラリ (C#、Python、Java、JavaScript で使用可能) を使用してテストを記述します。

ヒント

app機能を、パッケージ アプリのアプリのアプリケーション ユーザー モデル ID (AUMID) またはパッケージ化されていないアプリの実行可能パスに設定します。

Accessibility Insights とUI オートメーション

Windowsの Accessibility Insights は、アプリのUI オートメーション ツリーを検査および検証するのに役立ちます。 UI オートメーションによって公開される要素は、自動テスト ツールが操作するのと同じ要素です。 アプリに適切に構造化された自動化ツリーがあることを確認すると、アクセシビリティとテスト容易性の両方が向上します。

Microsoft Playwright (WebView2 の Web UI)

アプリで Web コンテンツに WebView2 を使用している場合は、Microsoft Playwright を使用して Web 部分をテストできます。 Playwright は、自動化されたブラウザー テストをサポートし、エンドツーエンドのシナリオ検証のために WebView2 インスタンスに接続できます。

コード品質と静的分析

静的分析ツールは、実行時前にバグ、セキュリティの問題、およびコード品質の問題をキャッチします。 これらを開発ワークフローと CI パイプラインに統合して、一貫した品質を実現します。

.NET アナライザー (Roslyn)

.NETプロジェクトには、正確性、パフォーマンス、信頼性、およびセキュリティの問題をチェックする Roslyn アナライザーが組み込まれています。 プロジェクトで推奨されるすべてのルールを有効にするには:

<PropertyGroup>
  <AnalysisLevel>latest-recommended</AnalysisLevel>
  <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
</PropertyGroup>

ルールの重大度は、 .editorconfig ファイルで構成することも、プロジェクト ファイルで <NoWarn> を使用して構成することもできます。 詳細については、「 .NET ソース コード分析の概要」を参照してください。

C++ 静的分析 (/analyze)

C++ Windows アプリ SDK および Win32 プロジェクトの場合は、プロジェクトのプロパティまたは MSBuild で/analyzeを設定して、Microsoftの静的分析を有効にします。

<PropertyGroup>
  <EnableMicrosoftCodeAnalysis>true</EnableMicrosoftCodeAnalysis>
  <CodeAnalysisRuleSet>CppCoreCheckRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>

C++ コア ガイドライン チェッカーでは、 最新の C++ ベスト プラクティスが適用されます。 Win32 API の使用パターンの場合、 SAL 注釈/analyze フラグは、一般的な有効期間、バッファー、コンカレンシーの問題をキャッチします。

CI 統合

コード品質チェックがすべてのプル要求で実行されるように、CI ワークフローに静的分析を追加します。 GitHub Actions ワークフローでは、次の操作を行います。

    - name: Build with analysis
      run: dotnet build --configuration Release /p:AnalysisLevel=latest-recommended /p:TreatWarningsAsErrors=true

MSBuild を使用する C++ プロジェクトの場合:

    - name: Build with /analyze
      run: msbuild MySolution.sln /p:Configuration=Release /p:EnableMicrosoftCodeAnalysis=true /p:RunCodeAnalysis=true

テレメトリとクラッシュ レポート

運用環境からテレメトリとクラッシュ データを収集すると、アプリが実際にどのように実行されるかを理解し、回帰を特定し、修正の優先順位を付けるのに役立ちます。

Application Insights

Azure アプリケーション Insights は、デスクトップ アプリのクラッシュ レポート、パフォーマンス監視、使用状況分析を提供します。 Windows アプリ SDK プロジェクトに追加するには:

Azure サブスクリプションと Application Insights リソースが必要です。 接続文字列を取得するには、「Application Insights リソースの作成」を参照してください。

  1. NuGet パッケージをインストールします。 Microsoft.ApplicationInsights
  2. 接続文字列を使用してアプリの起動時に TelemetryClient を初期化する
  3. 例外、イベント、ページ ビューを追跡する

詳細なセットアップ手順については、コンソール アプリとデスクトップ アプリの Application Insights .NET参照してください。

OpenTelemetry

OpenTelemetry は、ログ、メトリック、および分散トレースを収集するためのベンダーに依存しない標準です。 .NET OpenTelemetry SDK は、Azure Monitorやその他のバックエンドと統合されます。

必要なパッケージをインストールします。

dotnet add package OpenTelemetry
dotnet add package Azure.Monitor.OpenTelemetry.Exporter

次に、トレーサー プロバイダーを構成します。

var activitySource = new System.Diagnostics.ActivitySource("MyApp");
// OpenTelemetry SDKs can listen to ActivitySource instances like this one.
using var activity = activitySource.StartActivity("Startup");
activity?.SetTag("app.version", "1.0.0");

OpenTelemetry は、マルチバックエンド サポートまたは分散トレースを必要とする新しいプロジェクトに推奨されるアプローチです。 application Insights は、Azure Monitorのみを使用し、ターンキー ダッシュボードが必要な場合に適した選択肢です。

Windows エラー報告 (WER)

ネイティブクラッシュ収集の場合、Windowsエラー報告は、アプリが予期せず終了したときにクラッシュ ダンプを自動的にキャプチャします。 パッケージ アプリ (MSIX) は、 パートナー センターの品質レポートを通じてクラッシュ データを表示します。 組織 (LOB) アプリの場合は、ローカル分析のためにミニダンプを保存するように WER ローカル ダンプ コレクション を構成できます。

その他のリソース