WindowsAppDriverで電卓アプリを自動テストする（Visual Studioで公式サンプルを動かすまで）

##はじめに
仕事で自動テストが必要になったのでWindowsAppDriverを触ってみました。
[microsoft公式](https://github.com/microsoft/WinAppDriver)の[電卓サンプル](https://github.com/microsoft/WinAppDriver/tree/master/Samples/C%23/CalculatorTest)で自動テストを行ってみます。
##環境
Windows 10 Version 1909
Visual Studio Community 2019 16.3.10
##手順
### Windowsの設定から開発者モードを有効にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/24835943-0c91-9d79-10cf-5db88c5e2a08.png)
### GitHub のリリースページ から WindowsApplicationDriver.msi をダウンロード
[リリースページ ](https://github.com/Microsoft/WinAppDriver/releases)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/c3a49427-65ca-2a75-6838-33106ce179e5.png)
###ダウンロードした WindowsApplicationDriver.msi を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/3b5daaa4-ae16-5fc8-48c1-52ef7ab98d4a.png)
###WinAppDriver.exeを実行
下記ディレクトリにWinAppDriver.exeがインストールされているので実行する
C:\Program Files (x86)\Windows Application Driver\WinAppDriver.exe
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/908368c7-ff24-bf60-9266-cb267ff8d390.png)
以下の画面が表示されると正常に起動されている
テスト実行時はこの画面を起動しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/2a220ed8-8128-0379-1893-7d44178c706d.png)
####[Windows Application DriverのGithub](https://github.com/microsoft/WinAppDriver)からサンプルをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/643e59f5-ab9e-ad1c-487d-53291b9703e6.png)
####Visual Studioからダウンロードしたサンプルを開く（今回は電卓アプリを使用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/c6ce717b-124e-f8a1-a242-780a248dfc0d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/af9fa22a-ebee-088d-b63a-93f02710f7d9.png)
####ビルドを行う（ビルドによって必要なNuGetパッケージがダウンロードされる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/e98003ed-8026-d305-0c02-98c1c091229f.png)
####ScenarioStandard.csのソースを修正
Githubのサンプルは英語に対応しているので日本語対応に修正
#####Additionメソッド
```c#:ScenarioStandard.cs
public void Addition()
        {
            // Find the buttons by their names and click them in sequence to perform 1 + 7 = 8
            //session.FindElementByName("One").Click();
            //session.FindElementByName("Plus").Click();
            //session.FindElementByName("Seven").Click();
            //session.FindElementByName("Equals").Click();
            //Assert.AreEqual("8", GetCalculatorResultText());
            session.FindElementByName("1").Click();
            session.FindElementByName("プラス").Click();
            session.FindElementByName("7").Click();
            session.FindElementByName("等号").Click();
            Assert.AreEqual("8", GetCalculatorResultText());
        }
```
#####Multiplicationメソッド
```c#:ScenarioStandard.cs
public void Multiplication()
        {
            // Find the buttons by their names using XPath and click them in sequence to perform 9 x 9 = 81
            // session.FindElementByXPath("//Button[@Name='Nine']").Click();
            // session.FindElementByXPath("//Button[@Name='Multiply by']").Click();
            // session.FindElementByXPath("//Button[@Name='Nine']").Click();
            // session.FindElementByXPath("//Button[@Name='Equals']").Click();
            session.FindElementByXPath("//Button[@Name='9']").Click();
            session.FindElementByXPath("//Button[@Name='乗算']").Click();
            session.FindElementByXPath("//Button[@Name='9']").Click();
            session.FindElementByXPath("//Button[@Name='等号']").Click();
            Assert.AreEqual("81", GetCalculatorResultText());
        }
```
#####Templatizedメソッド
```c#:ScenarioStandard.cs
[TestMethod]
        // [DataRow("One",   "Plus",      "Seven", "8")]
        // [DataRow("Nine",  "Minus",     "One",   "8")]
        // [DataRow("Eight", "Divide by", "Eight", "1")]
        [DataRow("1",   "プラス",      "7", "8")]
        [DataRow("9",  "マイナス",     "1",   "8")]
        [DataRow("8", "除算", "8", "1")]
        public void Templatized(string input1, string operation, string input2, string expectedResult)
        {
            // Run sequence of button presses specified above and validate the results
            session.FindElementByName(input1).Click();
            session.FindElementByName(operation).Click();
            session.FindElementByName(input2).Click();
            // session.FindElementByName("Equals").Click();
            session.FindElementByName("等号").Click();
            Assert.AreEqual(expectedResult, GetCalculatorResultText());
        }
```
#####ClassInitializeメソッド
```c#:ScenarioStandard.cs
public static void ClassInitialize(TestContext context)
            //中略

            // if (!header.Text.Equals("Standard", StringComparison.OrdinalIgnoreCase))
            if (!header.Text.Equals("標準", StringComparison.OrdinalIgnoreCase))
            {
                session.FindElementByAccessibilityId("TogglePaneButton").Click();
                Thread.Sleep(TimeSpan.FromSeconds(1));
                var splitViewPane = session.FindElementByClassName("SplitViewPane");
                splitViewPane.FindElementByName("Standard Calculator").Click();
                Thread.Sleep(TimeSpan.FromSeconds(1));
                Assert.IsTrue(header.Text.Equals("Standard", StringComparison.OrdinalIgnoreCase));
            }
            //中略
        }
```
#####Clearメソッド
```c#:ScenarioStandard.cs
public void Clear()
        {
            // session.FindElementByName("Clear").Click();
            session.FindElementByName("クリア").Click();
            Assert.AreEqual("0", GetCalculatorResultText());
        }
```
#####GetCalculatorResultTextメソッド
```c#:ScenarioStandard.cs
private string GetCalculatorResultText()
        {
            //return calculatorResult.Text.Replace("Display is", string.Empty).Trim();
            return calculatorResult.Text.Replace("表示は ", string.Empty).Replace(" です", string.Empty).Trim();
        }
```
####テスト実行
WinAppDriver.exeを起動しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/2a220ed8-8128-0379-1893-7d44178c706d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/72269a5f-c646-abf2-180b-90744d088d30.png)
テストが実行される
![ezgif-2-993f4a592af4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/e8e15d72-f3ad-2a07-b6cd-f644c5dc19d6.gif)