WinAppDriverによるテストをVisual Studioソリューションに追加してみる

[前記事](https://qiita.com/do-gugan/items/f65ddf44e45f34a2e201)でとりあえず電卓のサンプルを動かすところまでこぎつけたWinAppDriverですが、今度は自前のプロジェクトに組み込んで動かしてみました。Githubなどで本体プロジェクトと一緒に管理しやすくする目的です。正しい作法は不明ですが、とりあえず電卓サンプルをちまちま移植するアプローチになります。

# ソリューションにプロジェクトを追加する
ソリューションエクスプローラーで一番上位のソリューションを右クリックして、

`追加 -> 新しいプロジェクト`

を選びます。「新しいプロジェクトの追加」ダイアログが出るので、

`他の言語 -> Visual C# -> テスト`
とたどり「単体テスト プロジェクト（.NET Framework）」を選択肢、Hogeというアプリ本体のプロジェクト名に対し、HogeTestという感じで名前をつけました（実際はなんでもよいと思います）。これでソリューションエクスプローラー上に
- Properties
- 参照
- packages.config
- UnitTest.cs

などが含まれたプロジェクトができます。UnitTest.csを削除し、電卓サンプルにある２つのクラスファイルと同名の

- CalicuratorSession.cs
- ScenarioStandard.cs

にあわせ、

- HogeSession.cs
- ScenarioStandard.cs

というクラスファイルを追加し、中身をコピペします。またpackages.configの中身も移植。各行のtargetframework属性を適宜書き換えます（あるいはHogeTestのターゲットフレームワークを電卓サンプルにあわせて4.5にしてもいいかも）。

# 依存ライブラリの導入
「参照」を右クリックして「NuGetパッケージの管理」を開き、「復元」ボタンでpackages.configに書かれたライブラリがインストールされます。これだけだと「参照」ツリーに依存ライブラリが現れてこないので、手動で追加します。「参照」を右クリックして「参照の追加」を開き、右下の「参照...」ボタンから１つずつ選択していきます。各ライブラリのDLLファイルがソリューションフォルダの下のpackagesフォルダに作成されているので、ライブラリ名 -> lib -> net45などと辿って、DLLファイルを選択し、最終的に以下の５つを追加しチェックした状態で「OK」します。
![SharedScreenshot.png](https://qiita-image-store.s3.amazonaws.com/0/128639/a884dc46-fe84-8a5d-ac1d-d6f425576358.png)
これで参照ツリーの下は電卓サンプルと同じくこんな感じになったんじゃないかと思います
![SharedScreenshot2.png](https://qiita-image-store.s3.amazonaws.com/0/128639/45c05bdf-62be-30ed-c132-b68f647452c0.png)
これでHogeTestを右クリックして「ビルド」し、テストエクスプローラーを開けば、サンプルと同じAddition、Divisionといった５つのテストが見えるはずです。実行すれば電卓が起動してテストが行われるでしょう（WinAPpDriver.exeを実行し待機させておくのを忘れずに）。

# テストのカスタマイズをしていく
ここから電卓サンプルを自分のプロジェクト向けにカスタマイズしていきます。まず、HogeSession.csとScenarioStandard.csのnamespaceをHogeTestなどテストプロジェクト名に変更しておきます。連動してテストエクスプローラー上のツリーも更新されるはずです。

## 起動バイナリの変更
実行するexeファイルはHogeSession.csの27行目辺りの

```C#
private const string CalculatorAppId = "Microsoft.WindowsCalculator_8wekyb3d8bbwe!App";
```
で定義されています。AppIDの調べ方は色々あるみたいですが、ここではフルパスで.exeを直接指定しました。

```C#
private const string CalculatorAppId = @"c:\repos\hoge\hoge\bin\Debug\hoge.exe";
```
パス文字列なので最初の@をお忘れ無く。CaluculatorAppIDという名前が気になる場合は、こことすぐ下のSetup()メソッドの中の

```C#
    appCapabilities.SetCapability("app", CaluculatorAppID);
    //appCapabilities.SetCapability("appArguments", @"MyTestFile.txt"); //起動オプションの指定
    //appCapabilities.SetCapability("appWorkingDir", @"C:\MyTestFolder\"); //作業ディレクトリの指定
```
のところを変えれば良さそうです。AppIDとでもしておけば汎用的でしょう。

## テストスクリプトの変更
テスト内容はScenarioStandard.csの方で定義されています。

```C#
[TestMethod]
public void Addition() {
     // Find the buttons by their names and click them in sequence to peform 1 + 7 = 8
     session.FindElementByName("1").Click();
     session.FindElementByName("プラス").Click();
     session.FindElementByName("7").Click();
     session.FindElementByName("等号").Click();
     Assert.AreEqual("8", GetCalculatorResultText());
}
```
のようにメソッドとして手続きがまとめられています。Click()メソッドでクリック、AreEqual()メソッドで結果照合ですね。GetCalculatorResultText()は電卓の結果取得に特化した専用メソッドなので自分のアプリにあわせて修正が必要でしょう。
また[ClassCleanup]や[ClassCleanup]の部分もテスト前後に実行されるぽいので、ここら辺のカスタマイズが必要になりそう。

いずれにせよ、ここまでくれば後はinspect.exeでUIコンポーネントの名前を調べつつコードを書くか、[UIRecorder](https://github.com/Microsoft/WinAppDriver/tree/master/Tools/UIRecorder)で記録したC#コードを貼って使うなりすればマクロ操作が可能になるでしょう。