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


はじめに

仕事で自動テストが必要になったのでWindowsAppDriverを触ってみました。
microsoft公式電卓サンプルで自動テストを行ってみます。

環境

Windows 10 Version 1909
Visual Studio Community 2019 16.3.10

手順

Windowsの設定から開発者モードを有効にする

GitHub のリリースページ から WindowsApplicationDriver.msi をダウンロード

リリースページ 

ダウンロードした WindowsApplicationDriver.msi を実行

WinAppDriver.exeを実行

下記ディレクトリにWinAppDriver.exeがインストールされているので実行する
C:\Program Files (x86)\Windows Application Driver\WinAppDriver.exe

以下の画面が表示されると正常に起動されている
テスト実行時はこの画面を起動しておく

Windows Application DriverのGithubからサンプルをダウンロード

Visual Studioからダウンロードしたサンプルを開く(今回は電卓アプリを使用)


ビルドを行う(ビルドによって必要なNuGetパッケージがダウンロードされる)

ScenarioStandard.csのソースを修正

Githubのサンプルは英語に対応しているので日本語対応に修正

Additionメソッド
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メソッド
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メソッド
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メソッド
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メソッド
ScenarioStandard.cs
public void Clear()
        {
            // session.FindElementByName("Clear").Click();
            session.FindElementByName("クリア").Click();
            Assert.AreEqual("0", GetCalculatorResultText());
        }
GetCalculatorResultTextメソッド
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を起動しておく


テストが実行される