Language

MSTest UI オートメーション を使用してデスクトップ アプリWindowsテストする

プレビュー MSTest.Windows.UIAutomation パッケージは、MSTest ライフサイクル管理と組み込みのWindows UI オートメーション API を統合します。 これを使用して、パッケージ化されていない完全信頼デスクトップ アプリケーションを起動し、そのウィンドウの 1 つを AutomationElementとして見つけ、各テストの後にアプリケーションを停止します。

このパッケージは、対話型のWindows セッションで Win32、Windows フォーム、およびWPF アプリケーションをサポートします。 MSIX、UWP、または WinUI のアクティブ化、昇格されたプロセスの自動化、ヘッドレス デスクトップ、ロケーター、自動待機、スクリーンショット、またはマルチウィンドウ オブジェクト モデルは提供されません。

Important

この機能には、MSTest 4.5 プレビュー パッケージとWindows固有のターゲット フレームワークが必要です。

Windows UI オートメーションを有効にする

MSTest.Sdk では、 EnableWindowsUIAutomation を true に設定します。

<Project Sdk="MSTest.Sdk/4.5.0">
  <PropertyGroup>
    <TargetFramework>net8.0-windows</TargetFramework>
    <EnableWindowsUIAutomation>true</EnableWindowsUIAutomation>
  </PropertyGroup>
</Project>

MSTest.Sdk は、一致する MSTest.Windows.UIAutomation パッケージを追加します。 MSTest.Sdk がない場合は、一致する MSTest バージョンで MSTest.Windows.UIAutomation、 MSTest.TestFramework、および MSTest.TestAdapter を参照します。 VSTest バージョン行に従うため、互換性のある Microsoft.NET.Test.Sdk バージョンを個別に参照します。

Linux または macOS 上で復元またはビルドするWindows対象プロジェクトの場合は、EnableWindowsTargetingを true に設定します。

基底クラスを選択する

次のいずれかのクラスから派生します。

  • ApplicationTest は、各テストの前にアプリケーションを起動し、破棄中に停止します。 CreateProcessStartInfoをオーバーライドして実行可能ファイルを識別します。
  • WindowTest は、ウィンドウが現れるのを待機し、MainWindow を介してそれを公開します。

MSTest テスト クラス属性は継承されないため、すべての具象テスト クラスで STATestClass を直接宣言します。

using System.Diagnostics;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.VisualStudio.TestTools.UnitTesting.Windows.UIAutomation;

[STATestClass]
public sealed class MyAppTests : WindowTest
{
    protected override ProcessStartInfo CreateProcessStartInfo()
        => new(@"C:\MyApp\MyApp.exe");
}
Imports System.Diagnostics
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports Microsoft.VisualStudio.TestTools.UnitTesting.Windows.UIAutomation

<STATestClass>
Public NotInheritable Class MyAppTests
    Inherits WindowTest

    Protected Overrides Function CreateProcessStartInfo() As ProcessStartInfo
        Return New ProcessStartInfo("C:\MyApp\MyApp.exe")
    End Function
End Class

テスト メソッドでMainWindowを使用して、Windows UI オートメーション パターンのクエリまたは呼び出しを行います。 パッケージは UIA2 System.Windows.Automation API を使用します。 より豊富な要素の相互作用が必要な場合は、公開された AutomationElement に対して、FlaUI などの別のライブラリを重ねて配置できます。

スタートアップとウィンドウの検出をカスタマイズする

既定値がアプリケーションに適合しない場合は、次のメンバーをオーバーライドします。

  • ApplicationShutdownTimeout は、基底クラスが正常なシャットダウンと強制終了を待機する時間を制御します。 既定値は 5 秒です。
  • WindowDiscoveryTimeout は、 WindowTest がウィンドウを待機する時間を制御します。 既定値は 10 秒です。
  • FindWindow は、ランチャー プロセスを使用するアプリケーション、スプラッシュ画面を表示する、または複数のトップレベル ウィンドウを作成するアプリケーションのウィンドウを選択します。
  • StopApplication は、選択したウィンドウが CreateProcessStartInfo が起動したプロセス以外のプロセスに属している場合、アプリケーションを終了します。

基底クラスは、スタートアップとウィンドウの検出中に TestContext.CancellationToken を観察します。 WindowTest は、ウィンドウが表示される前にアプリケーションが終了したとき、または検出がタイムアウトに達したときに失敗します。

ライフサイクルの動作を理解する

ApplicationTest は、テスト呼び出しごとに 1 つのアプリケーション プロセスを開始します。 WindowTest は、プロセスの開始後にウィンドウを検出します。 テストとそのクリーンアップ メソッドが完了すると、MSTest は基底クラスを破棄し、メイン ウィンドウを通じてグレースフル クローズを要求し、アプリケーションが構成されたタイムアウト内で終了しない場合はプロセス ツリーを終了します。

パラメーター化されたテストと再試行の場合、各呼び出しは独自のアプリケーション ライフサイクルを受け取ります。

こちらも参照ください