🐈

自動UIテストやってみた: Appium,Windows Application Drive,WPF,.NET Framework4.7.2

2023/05/25に公開

はじめに

以前バックエンドの自動テストをやってみて、今度はUIテストもやってみたくなったためやってみた。

目次

自動テスト動作環境

C#
.NET Framework4.7.2
WPF
MSTest
Appium
Windows Application Driver

テストの種類

8種類のシステムテスト

自動テストには種類があるようです。どんな種類があるか、それぞれどんな役割があるか、網羅的に教えてほしいです。

自動テストにはいくつかの種類があります。それぞれのテストは、異なる目的や役割を持っています。主要な自動テストの種類を以下にまとめました。

  1. ユニットテスト (Unit Test): ユニットテストは、コードの個々の部分(通常は関数やメソッド)が正しく動作することを確認するためのテストです。ユニットテストは、コードの変更やリファクタリングによって問題が発生しないことを確認するために実施されます。

  2. 統合テスト (Integration Test): 統合テストは、異なるコードモジュールやシステムコンポーネントが連携して正しく動作することを検証するためのテストです。統合テストは、ユニットテストだけではカバーできない、コンポーネント間のインタラクションに関する問題を検出することが目的です。

  3. システムテスト (System Test): システムテストは、ソフトウェア全体が要件に従って正しく動作することを確認するためのテストです。システムテストでは、ソフトウェアの機能、パフォーマンス、セキュリティ、およびユーザビリティなど、さまざまな側面を評価します。

  4. 受け入れテスト (Acceptance Test): 受け入れテストは、ソフトウェアが実際のユーザーやクライアントの要件を満たしていることを確認するためのテストです。受け入れテストは、一般的にはエンドユーザーまたはクライアントによって実施され、ソフトウェアが実際の環境で期待通りに動作することを検証します。

  5. レグレッションテスト (Regression Test): レグレッションテストは、コードの変更や新しい機能の追加が、既存の機能に悪影響を与えていないことを確認するためのテストです。レグレッションテストは、通常、リリース前やコード変更後に実施されます。

  6. UIテスト (User Interface Test): UIテストは、ユーザーインターフェイスの機能と外観を検証するためのテストです。UIテストは、アプリケーションがユーザー要件に従って正しく動作し、期待通りのユーザーエクスペリエンスを提供していることを確認するために行われます。UIテストでは、画面要素の配置やデザイン、ボタンやリンクの機能、フォームの入力検証、画面遷移などが検証されます。

  7. パフォーマンステスト (Performance Test): パフォーマンステストは、アプリケーションが特定のワークロードやストレス状況下で期待通りの性能を発揮することを確認するためのテストです。パフォーマンステストでは、レスポンスタイム、スループット、リソース使用率、スケーラビリティなどが評価されます。

  8. セキュリティテスト (Security Test): セキュリティテストは、アプリケーションがセキュリティ上の脆弱性やリスクに対して十分な防御を提供していることを検証するためのテストです。セキュリティテストでは、機密性、完全性、可用性、認証、認可、および監査などのセキュリティ要件が評価されます。

  9. ロードテスト (Load Test): ロードテストは、アプリケーションが同時に多数のユーザーに対応できるかどうかを検証するためのテストです。ロードテストは、アプリケーションの耐久性や安定性を評価し、パフォーマンスが一定の閾値を超えないことを確認するために行われます。

これらのテストは、ソフトウェア開発プロセスのさまざまな段階で実施され、互いに補完し合う役割を果たします。適切なテスト戦略を採用することで、ソフトウェアの品質と信頼性を向上させ、ユーザーにとって価値ある製品を提供することができます。

手動テストでも自動テストでも、上述の8種類のテストは行いますよね?人力でやるか、システムによって自動化するかの違いが、テストの手法の違いととらえて、やるべきことは同じと考えてよいですか?

はい、そのとおりです。手動テストでも自動テストでも、上述の8種類のテストは行われます。違いは、手動テストが人間が直接アプリケーションを操作してテストを実行するのに対し、自動テストはテストスクリプトやフレームワークを使ってシステムが自動的にテストを実行することです。

どちらの手法でも、目的はソフトウェアの品質を確保し、機能やパフォーマンス、セキュリティなどの要件を満たすことです。ただし、手動テストと自動テストは、それぞれの長所と短所があります。

手動テストの利点:

  • ユーザーの視点からアプリケーションをテストできる。
  • テストケースの作成や実行が比較的容易である。

手動テストの欠点:

  • 時間がかかることがある。
  • 人間のミスが発生しやすい。
  • 繰り返し実行するのが困難である。

自動テストの利点:

  • 繰り返し実行が容易である。
  • 一度に多くのテストケースを実行できる。
  • 人間のミスを排除できる。

自動テストの欠点:

  • 自動化にはコストがかかることがある。
  • テストスクリプトの作成やメンテナンスが必要である。
  • ユーザーエクスペリエンスの評価が難しい。

適切なテスト戦略を選択することで、ソフトウェアの品質と信頼性を向上させ、ユーザーにとって価値ある製品を提供することができます。一般的には、手動テストと自動テストを組み合わせて使用することが、最も効果的なアプローチとされています。

WindowsアプリケーションのUIテストのためのフレームワーク

.NetFramework4.7.2でWPFを利用したアプリケーションを、VisualStudio2019Communityで開発をしています。この場合、どのフレームワークを選べばよいですか?

Visual Studio 2019 Communityを使用し、.NET Framework 4.7.2でWPFアプリケーションを開発している場合、次のフレームワークが適切な選択肢となります。

  1. Appium (Windows Application Driver): AppiumとWindows Application Driver (WinAppDriver) を組み合わせて使用することで、WPFアプリケーションのUIテストを自動化できます。このフレームワークは、Microsoftが公式にサポートしており、Visual Studio 2019と互換性があります。

  2. White Framework: Whiteは、.NETアプリケーション(WPF、Windows Forms、Silverlight、Win32)のUIテストを行うためのオープンソースフレームワークです。UIAutomationライブラリをベースにしており、Visual Studio 2019と互換性があります。

  3. FlaUInspect / FlaU: FlaUInspectは、MicrosoftのUI Automationを利用してWPFアプリケーションのUI要素を調べるためのツールです。FlaUは、UIテストの自動化を行うための.NETライブラリで、UIAutomationをベースにしています。Visual Studio 2019と互換性があります。

上記のフレームワークの中で、どれを選ぶかはプロジェクトの要件や開発チームのスキルセットによって異なります。しかし、Microsoftが公式にサポートしているWindows Application Driverを使用することで、今後のアップデートやサポートについても安心できるでしょう。そのため、まずはAppiumとWindows Application Driverの組み合わせを検討してみることをお勧めします。

なぜAppiumとWindows Application Driverの2つを組み合わせる必要があるのですか?一つでは足りないのですか?

私の説明が不十分でした。AppiumとWindows Application Driver(WinAppDriver)の関係性について説明します。

Appiumは、オープンソースのクロスプラットフォームテストフレームワークで、iOS、Android、WindowsアプリケーションのUIテストを自動化するために使用されます。Appium自体はプラットフォームに依存しないが、バックエンドのドライバーがプラットフォーム固有の機能を提供します。

Windows Application Driver(WinAppDriver)は、Microsoftが開発したAppium互換のWindowsアプリケーションテストドライバーです。これは、Windows 10のネイティブアプリケーション(UWP)やクラシックWindowsアプリケーション(WPF、Windows Formsなど)のUIテストを自動化するために使用されます。

AppiumとWinAppDriverを組み合わせる理由は、Appiumがテストフレームワークとして提供され、WinAppDriverがバックエンドのドライバーとしてWindowsアプリケーションのテスト機能を提供するからです。この組み合わせにより、WindowsアプリケーションのUIテストを効果的に自動化できます。

要するに、Appiumはテストフレームワークとして使用され、WinAppDriverはWindowsアプリケーションのテスト機能を提供するため、両方を組み合わせて使用することで、効果的なUIテストが実現できます。

前回MSTestでバックエンドの自動テストをしましたが、このフレームワークとは役割が違うのですか?

はい、その通りです。MSTestとAppium+Windows Application Driverは役割が異なります。

  1. MSTest:
    MSTestは、Microsoftが開発したユニットテストフレームワークで、.NET Frameworkや.NET Coreアプリケーションのバックエンドロジック(関数やメソッド)のテストを実行するために使用されます。これは主にアプリケーションの内部ロジックや関数のテストに焦点を当てており、UI部分は考慮されません。

  2. Appium+Windows Application Driver:
    AppiumとWindows Application Driverは、WindowsアプリケーションのUIテストを自動化するために組み合わせて使用されるフレームワークです。これはユーザーインターフェースの操作(クリック、入力、ドラッグ&ドロップなど)や表示内容の確認に焦点を当てており、アプリケーションのバックエンドロジックは直接テストしません。

要するに、MSTestはバックエンドの自動テストに使用され、Appium+Windows Application DriverはUIテストに使用されます。

両方のテストフレームワークを組み合わせることで、アプリケーションのバックエンドロジックとUIの両方をカバーする網羅的な自動テストが実現できます。

自動テストの全体像(流れ)

AppiumとWindows Application Driverを利用したUIテストを試してみたいです。どのように行えばいいか、ステップバイステップで教えていただけませんか?
アプリケーションは、C#、.NetFramework4.7.2、WPFを利用し、VisualStudio2019Communityで開発しているとします。

ステップ1: 必要なソフトウェアをインストールする

ステップ2: Windows Application Driverを実行する

ステップ3: Visual Studioでテストプロジェクトを作成する

ステップ4: テストコードを作成する

ステップ5: テストを実行する

これで、AppiumとWindows Application Driverを使ったUIテストの基本的な手順が完了しました。テストコードを追加・修正して、アプリケーションのさまざまな機能を網羅するようにしてください。

ステップ1: 必要なソフトウェアをインストールする

1. Appiumをインストール (http://appium.io/)

デスクトップGUI版をインストールする場合

https://github.com/appium/appium-desktop/releases/tag/v1.15.1
から対応するAppiumをダウンロードしてインストールします。

CLI版をインストールする場合

コマンドラインからAppiumを操作するには、別途Appium CLI(コマンドラインインターフェイス)をインストールする必要があります。これには、Node.jsとnpm(Node Package Manager)が必要です。
まず、Node.jsをインストールしていない場合は、Node.jsの公式ウェブサイト(https://nodejs.org/en )からインストールしてください。次に、コマンドプロンプトを開いて、以下のコマンドを実行してAppium CLIをインストールします。

npm install -g appium
# 結果
added 686 packages in 12s
npm notice
npm notice New minor version of npm available! 9.5.1 -> 9.6.5
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.6.5
npm notice Run npm install -g npm@9.6.5 to update!
npm notice
appium -v
# 結果
1.22.3

インストールが完了すると、コマンドプロンプトで appium コマンドを実行できるようになります。ただし、この場合も環境変数PATHにnpmのグローバルインストールフォルダが含まれていることを確認してください。

Node.jsをインストールする理由は何ですか

Node.jsをインストールする主な理由は、Appium CLI(コマンドラインインターフェイス)をインストールして実行するためです。Appiumは、Node.jsをベースにしたオープンソースのクロスプラットフォームテストフレームワークであり、Appium CLIはNode.jsのパッケージとして提供されています。

Node.jsは、JavaScriptをサーバーサイドで実行できるようにするプラットフォームです。これにより、JavaScriptを使用してサーバー上でアプリケーションを開発できるようになります。また、Node.jsにはnpm(Node Package Manager)というパッケージマネージャーが付属しており、これを使ってさまざまなNode.jsモジュールやパッケージを簡単にインストールできます。

Appium CLIをインストールするためにNode.jsが必要な理由は、以下の通りです。

  1. AppiumはNode.js上で動作するアプリケーションであるため、Node.jsのランタイムが必要です。
  2. npmを利用してAppium CLIをインストールするためには、Node.jsがインストールされている必要があります。npmはNode.jsに付属しているパッケージマネージャーであり、Appium CLIをインストールする際に使用されます。

したがって、Node.jsをインストールすることで、Appium CLIを利用するために必要な環境が整います。

Appiumがインストールされたフォルダ

CLI版のAppiumはどのフォルダにインストールされていますか?

CLI版のAppiumは、Node.jsを利用してインストールされるため、通常はNode.jsのグローバルパッケージがインストールされるディレクトリに配置されます。Windowsの場合、デフォルトのインストール先は以下のようなパスになることが多いです。

C:\Users\<ユーザー名>\AppData\Roaming\npm\node_modules\appium

ただし、環境によっては異なる場所にインストールされることがあります。インストール先の確認方法として、コマンドプロンプトで以下のコマンドを実行してみてください。

npm list -g --depth=0

これにより、インストールされているグローバルパッケージのリストが表示されます。appiumのパスが表示されれば、その場所にインストールされていることがわかります。

#結果
C:\Users\<ユーザー名>\AppData\Roaming\npm
`-- appium@1.22.3

npm list -g --depth=0について細かく解説してください

npm list -g --depth=0 は、Node.jsのパッケージマネージャであるnpmを使って、グローバルにインストールされているパッケージの一覧を表示するコマンドです。各オプションの意味は以下の通りです。

  • list: npmのサブコマンドで、インストール済みのパッケージのリストを表示します。
  • -g または --global: このオプションを指定することで、グローバルにインストールされたパッケージを対象とします。指定しない場合、現在のプロジェクトにインストールされたパッケージが対象となります。
  • --depth=0: このオプションは、表示するパッケージの依存関係の深さを制限します。0を指定することで、トップレベルのパッケージのみを表示します。指定しない場合、全ての依存関係が表示されるため、リストが非常に長くなることがあります。

このコマンドを実行すると、グローバルにインストールされているパッケージの一覧が表示されます。これにより、Appiumなどのインストール済みパッケージとそのインストール先が確認できます。

デスクトップGUI版のAppiumはどのフォルダにインストールされていますか?

デスクトップGUI版のAppiumは、インストーラによってインストールされるため、インストール先のフォルダが異なる場合があります。一般的には、以下のフォルダにインストールされることが多いです。

Windows: C:\Program Files (x86)\Appium または C:\Program Files\Appium
macOS: /Applications/Appium.app
ただし、インストーラでインストール先のフォルダを変更した場合、上記とは異なる場所にインストールされていることがあります。その場合は、インストーラで指定したフォルダを確認してください。

また、Appium Server GUIのインストールフォルダが既にわかっている場合、そのフォルダ内を確認してください。例えば、C:\Users\t.hayashi\AppData\Local\Programs\Appium Server GUI というフォルダが存在する場合、そこにインストールされている可能性があります。

2. Windows Application Driverをインストール

Windows Application Driverのバージョンはどれにするのがいいですか

Windows Application Driver (WinAppDriver) の最新バージョンを使用することをお勧めします。最新バージョンには、新しい機能やバグ修正が含まれており、最も安定したパフォーマンスが得られることが期待されます。

GitHubのリリースページ(https://github.com/microsoft/WinAppDriver/releases )で最新バージョンを確認し、それを使用してください。ただし、プロジェクトの要件や互換性の問題によっては、特定のバージョンを使用する必要がある場合があります。その場合は、適切なバージョンを選択してください。

.Net Framework 4.7.2なんですが最新バージョンで正しく動作するのでしょうか?

Windows Application Driver (WinAppDriver) は、主に UWP (Universal Windows Platform) および Classic Windows (Win32) アプリケーションの UI テストの自動化をサポートしています。WPF (Windows Presentation Foundation) アプリケーションも Classic Windows アプリケーションの一種であり、通常は WinAppDriver でサポートされています。

ただし、.NET Framework 4.7.2 で開発された WPF アプリケーションでも、WinAppDriver の最新バージョンで正しく動作するかどうかは、アプリケーションの実装や使用している機能によって異なります。

最新バージョンの WinAppDriver を使用してテストを実施し、問題が発生した場合は、過去のバージョンを試すか、問題を特定して解決策を見つけることができます。また、WinAppDriver のコミュニティや公式ドキュメントで情報を検索し、同様の問題に対処した他の開発者の経験を参考にすることができます。

ステップ2: Windows Application Driverを実行する

Windows Application Driverのインストールの確認

Windows Application Driverが適切にインストールされたか確認したいのですが、どうしたらよいですか

Windows Application Driverが正しくインストールされているかどうかを確認するには、以下の手順を実行します。

  1. インストールディレクトリ(デフォルトでは C:\Program Files (x86)\Windows Application Driver)に移動し、WinAppDriver.exeが存在することを確認します。

  2. コマンドプロンプトまたはPowerShellを管理者モードで開きます。

  3. 次のコマンドを実行して、Windows Application Driverを起動します。

"C:\Program Files\Windows Application Driver\WinAppDriver.exe"

Windows Application Driverが正常にインストールされていれば、次のようなメッセージが表示されます。

#結果
Windows Application Driver listening for requests at: http://127.0.0.1:4723/
  1. これで、Windows Application Driverが正常に動作していることが確認できました。テストが終わったら、コマンドプロンプトまたはPowerShellで Ctrl + C を押して、Windows Application Driverを停止してください。

これらの手順を実行して、AppiumとWindows Application Driverが正常にインストールされていることが確認できれば、UIテストを開始できます。

Developer mode is not enabled. Enable it through Settings and restart Windows Application Driver
Failed to initialize: 0x80004005
とエラーが出ています。どうしたらよいですか。

このエラーは、Windows 11のデベロッパーモードが有効になっていないことを示しています。Windows Application Driverを使用するには、デベロッパーモードを有効にする必要があります。以下の手順でデベロッパーモードを有効にしてください:

Windows 11でデベロッパーモードを有効にする手順は、Windows 10とほぼ同じです。

スタートメニューを開き、「設定」(歯車アイコン)をクリックします。
設定画面で「プライバシーとセキュリティ」をクリックします。
右側の画面で、「開発者向け」をクリックします。
右側の画面で、「開発者モード」のラジオボタンを選択し、有効にします。
デベロッパーモードを有効にした後、再び Windows Application Driver を起動してみてください。それで正常に起動します。

デベロッパーモードとはなんですか。デベロッパーモードを有効にすると何が起こりますか。

デベロッパーモードは、Windowsオペレーティングシステムにおいて、開発者がアプリケーションの開発やテストを容易に行えるように設計された特別なモードです。デベロッパーモードを有効にすると、以下のような機能が利用可能になります。

  1. サイドロードアプリ: 通常、Windowsストアからアプリケーションをインストールする必要がありますが、デベロッパーモードでは、ストア以外のソースからアプリケーションをインストール(サイドロード)することができます。

  2. デバッグツールの利用: デベロッパーモードでは、アプリケーションのデバッグや診断を行うための追加ツールや機能が利用可能になります。

  3. 高度な設定オプション: 開発者向けの高度な設定やカスタマイズが可能になります。これにより、開発プロセスが簡単かつ効率的になります。

デベロッパーモードを有効にすることで、開発者はアプリケーションの開発やテストに関する制限を緩和し、開発プロセスを効率化できます。ただし、セキュリティリスクが高まる可能性があるため、一般ユーザーには通常のモードを使用することが推奨されます。

インストールしたアプリは基本的には、C:\Users<ユーザー名>\AppData\Local\Programsのフォルダに格納されるのですか?

インストールされたアプリケーションは、通常、以下のディレクトリに格納されます。

  1. C:\Program Files または C:\Program Files (x86) - これらのディレクトリは、通常、システム全体で共有されるアプリケーションやツールに使用されます。32ビットアプリケーションは、通常 C:\Program Files (x86) にインストールされ、64ビットアプリケーションは C:\Program Files にインストールされます。

  2. C:\Users<ユーザー名>\AppData\Local\Programs - このディレクトリは、特定のユーザーのみが利用できるアプリケーションやツールに使用されます。これらのアプリケーションは、他のユーザーには影響を与えず、インストールや削除が可能です。

ただし、これらは一般的なディレクトリであり、アプリケーションによっては独自のインストールフォルダを選択することができます。インストール先は、インストールプロセス中に指定されるか、デフォルトで設定されている場合があります。

Windows Application Driver listening for requests at: http://127.0.0.1:4723/
Press ENTER to exit.
となりました。Windows Application Driverが動いているととらえてよいですか

はい、その通りです。このメッセージは、Windows Application Driverが正常に起動し、リクエストを受け付ける準備ができたことを示しています。表示されているアドレス(http://127.0.0.1:4723/)は、Windows Application DriverがリッスンしているローカルホストのIPアドレスとポート番号です。

これで、Appiumや他のテストフレームワークと連携して、UIテストを実行することができます。テストを終了するには、コマンドプロンプトでEnterキーを押してください。

利用フレームワークについて

Windows Application Driverがwindowsアプリケーションを動かすのですか?

Windows Application Driver自体はアプリケーションを直接動かしません。Windows Application Driverは、Appiumや他のテストフレームワークと連携して、WindowsアプリケーションのUIテストを実行するための中間層として機能します。

具体的には、Appiumやテストフレームワークから送られたコマンドを受け取り、それらのコマンドに従ってWindowsアプリケーションのUI要素とやりとりを行います。これにより、アプリケーションのUI操作や状態の検証を自動化することができます。

テストフレームワークが実行される際に、指定されたアプリケーションが起動され、テストシナリオに従って操作が実行されます。このプロセス全体によって、WindowsアプリケーションのUIテストが実行されます。

ステップ3: Visual Studioでテストプロジェクトを作成する

ステップ3の手順を教えてください。

  1. Visual Studioを開き、「新しいプロジェクトの作成」をクリックします。
  2. 「MSTest Test Project (.NET Framework)」テンプレートを選択し、プロジェクト名と保存先を指定して、「次へ」をクリックします。
  3. テストプロジェクトが作成されたら、必要なパッケージをインストールします。NuGetパッケージマネージャーを使って、「Appium.WebDriver」、「MSTest.TestAdapter」および、「MSTest.TestFramework」パッケージをインストールします。

必要となる3つのパッケージ、「Appium.WebDriver」、「MSTest.TestAdapter」および、「MSTest.TestFramework」は、それぞれどんなものですか?

それぞれのパッケージについて説明します。

Appium.WebDriver: Appium.WebDriver は、Appium と連携して Windows アプリケーションの UI テストを実行するための .NET バインディングです。これにより、C# で Appium と通信し、アプリケーションの UI 要素を操作したり、検証したりすることができます。

MSTest.TestAdapter: MSTest テストフレームワークを使ってテストを実行するためのアダプターです。このアダプターによって、Visual Studio やコマンドラインから MSTest を使ったテストを実行できるようになります。

MSTest.TestFramework: これは、MSTest テストフレームワークのコア機能を提供するライブラリです。テストメソッドやアサーションの作成に必要な基本的なクラスやメソッドが含まれています。

これらのパッケージを組み合わせることで、C# で Windows アプリケーションの UI テストを簡単に作成し、実行することができます。

ステップ4: テストコードを作成する

「ステップ4: テストコードを作成する」について詳しく教えてください。

ステップ4では、テストコードを作成して、AppiumとWindows Application Driverを使用してWPFアプリケーションのUIテストを行います。以下に詳細を説明します。

  1. WPFアプリケーションの実行可能ファイルのフルパスを取得します。
    テストコードでアプリケーションを起動するためには、実行可能ファイル(.exe)のフルパスが必要です。ビルド後に生成される実行可能ファイルを見つけ、そのフルパスをメモしておきます。

  2. テストプロジェクトにテストクラスを追加します。
    テストプロジェクトに新しいテストクラスを追加し、その中にUIテスト用のテストメソッドを記述します。

  3. AppiumとWindows Application Driverを使ってUIテストを記述します。
    ここでは、AppiumのC#クライアントを使用して、アプリケーションの起動、要素の選択、操作、および検証の処理を含めたUIテストを記述します。アプリケーションの要素にアクセスするために、要素の名前やIDを指定して、FindElementやFindElementsメソッドを使用します。また、要素を操作するために、Click、SendKeysなどのメソッドを使います。

  4. テストを実行します。
    テストエクスプローラーウィンドウやコマンドラインを使用して、テストを実行します。テストが正常に実行され、期待した結果が得られることを確認します。

このステップでは、実際のUIテストの記述に焦点を当てています。AppiumとWindows Application Driverを使って、アプリケーションの起動や要素の選択、操作、検証などの処理を行います。これにより、アプリケーションのUIが期待通りに動作するかどうかを自動的に確認できます。

コードのサンプルもいただけますか?

もちろんです。以下に、簡単なWPFアプリケーションのUIテストのサンプルコードを示します。この例では、アプリケーションにテキストボックスとボタンがあり、ボタンをクリックするとテキストボックスの内容がクリアされるという仕様をテストします。

まず、WPFアプリケーションのXAMLコードです。

<Window x:Class="UITestProject.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:UITestProject"
        mc:Ignorable="d"
        Title="MainWindow"  Height="200" Width="400">
    <Grid>
    <Grid>
      <TextBox x:Name="InputTextBox" AutomationProperties.AutomationId="InputTextBox" HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="350"/>

      <Button x:Name="ClearButton" AutomationProperties.AutomationId="ClearButton" Content="Clear" HorizontalAlignment="Left" Margin="10,38,0,0" VerticalAlignment="Top" Width="75" Click="ClearButton_Click"/>
    </Grid>
  </Grid>
</Window>

XAML.csのコードです。

using System.Windows;

namespace UITestProject
{
  /// <summary>
  /// MainWindow.xaml の相互作用ロジック
  /// </summary>
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
    }

    private void ClearButton_Click(object sender, RoutedEventArgs e)
    {
      InputTextBox.Text = string.Empty;
    }
  }
}

次に、テストプロジェクトのコードです。

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using OpenQA.Selenium.Appium.Windows;
using OpenQA.Selenium.Remote;
using OpenQA.Selenium.Appium;
using System.Threading;

namespace UnitTestProject1
{
  [TestClass]
  public class UnitTest1
  {
    private const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723"; // Windows Application DriverのURL
    private const string WpfAppId = @"D:\programing\UITestProject\UITestProject\UITestProject\bin\Debug\UITestProject.exe"; // WPFアプリケーションの実行可能ファイルのフルパス
    private static WindowsDriver<WindowsElement> _app; // AppiumのWindowsドライバインスタンス


    [ClassInitialize] // このメソッドがテストクラスの初期化メソッドであることを示す属性
    public static void Setup(TestContext context)
    {
      var appOptions = new AppiumOptions(); // AppiumOptionsオブジェクトを作成
      appOptions.AddAdditionalCapability("app", WpfAppId); // WPFアプリケーションの実行可能ファイルのフルパスを設定
      appOptions.AddAdditionalCapability("platformName", "Windows"); // プラットフォーム名を設定(Windows)
      appOptions.AddAdditionalCapability("deviceName", "WindowsPC"); // デバイス名を設定(WindowsPC)
      _app = new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), appOptions); // Windowsドライバインスタンスを作成し、_appに代入
      _app.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
    }


    [ClassCleanup] // このメソッドがテストクラスの終了メソッドであることを示す属性
    public static void TearDown()
    {
      _app?.Quit(); // ドライバインスタンスを終了(アプリケーションを閉じる)
    }

    [TestMethod] // このメソッドがテストメソッドであることを示す属性
    public void ClearButton_ClearsTextBoxContent()
    {



      Thread.Sleep(2000); //2秒待つ

      var inputTextBox = _app.FindElementByAccessibilityId("InputTextBox");// 名前で要素を検索し、テキストボックスの要素を取得
      inputTextBox.SendKeys("Sample Text"); // テキストボックスにテキストを入力

      Thread.Sleep(2000); //2秒待つ

      var clearButton = _app.FindElementByAccessibilityId("ClearButton"); // 名前で要素を検索し、クリアボタンの要素を取得
      clearButton.Click(); // クリアボタンをクリック

      Assert.AreEqual(string.Empty, inputTextBox.Text); // テキストボックスのテキストが空であることを検証(アサーション)
    }
  }
}

このサンプルでは、Setupメソッドでアプリケーションを起動し、TearDownメソッドで終了しています。テストメソッドClearButton_ClearsTextBoxContentでは、テキストボックスにテキストを入力し、クリアボタンをクリックしてから、テキストボックスの内容がクリアされていることを確認しています。

注意: WpfAppIdには、実際のWPFアプリケーションの実行可能ファイル(.exe)のフルパスを指定してください。また、Windows Application Driverが実行されていることを確認してください。

このサンプルコードを参考に、自分のアプリケーションに合わせてテストコードを作成し、UIテストを実行してみてください。各要素の選択や操作には、_app.FindElementByAccessibilityIdなどのメソッドを使用できます。また、検証のためにAssertクラスのメソッドを利用してください。

※記事執筆がめんどくさくなったため、ここからいろいろやってみたけど、これ以下は詳細略。。

ステップ5: テストを実行する

  1. Visual Studioの「テスト」メニューから、「テストエクスプローラー」を開きます。
  2. 「テストエクスプローラー」で、作成したテストケースを選択し、「実行」をクリックします。テストが実行され、結果が表示されます。

まとめ

UIテストのフレームワークを入れて、テストコードを書いて、テストを実行するとUIテストできる。
seleniumのように、各コントロールに対してメソッドで自動でシステムを動かす。(名前などでコントロールを指定)
動かすものは、実行ファイル(exeをパスで指定)。

UIテストとバックエンドテスト両方組み合わせることもできる。

Discussion