FriendlyでWinformsのテストをやってみた

テストするためにポチポチ入力するのは辛いなーと思いこんな事をつぶやいてみると

@piyo_esqさんにWinformsで利用できるUIテストのツールに関して教えて頂きました!ありがとうございます!
今回は導入が手軽なFriendlyでUIのテストを作成してみたいと思います。

テストコード

github.com

導入方法

下記のパッケージをインストール。
www.nuget.org

テストするWinformsアプリケーション

名前を入力し登録ボタンをクリックするとCSVファイルを出力するようなアプリケーションを題材にテストを作成してみます。

f:id:KEI_0901:20191116124959p:plain
Form

テスト対象を操作するクラスを準備する

WindowsControlクラスから操作対象のButtonやTextBoxを取得しています。
FormsButtonクラスにはEmulateClick()など操作対象のコントロールの動きをエミュレートするメソッドが提供されているので、
そのメソッドを呼ぶだけでテスト対象アプリケーションを操作できます!すごい!

class TestDriver

    {

        public WindowControl WindowControl { get; }

        public FormsButton RegisterButton { get; }

        public FormsTextBox NameTextBox { get; }

        public FormsTextBox NameKanaTextBos { get;  }



        public TestDriver(WindowControl windowControl)

        {

            this.WindowControl = windowControl;

            this.RegisterButton = new FormsButton(windowControl.Dynamic().btnRegister);

            this.NameTextBox = new FormsTextBox(windowControl.Dynamic().txtName);

            this.NameKanaTextBos = new FormsTextBox(windowControl.Dynamic().txtNameKana);

        }

    }

テストを書いてみる

Initializeメソッド内でテストするアプリケーションを開始し、テストに必要となるクラスを作成 テストメソッド内で、テストしたい動作を実行し、実行結果を期待値と同じになるかを比較していくテストを記載しています。

[TestClass]
public class UnitTest1
{
    private WindowsAppFriend _app;
    private TestDriver _testDriver;

    [TestInitialize]
    public void Initialize()
    {
        var process = Process.Start("FrendlyPractice.exe");
        this._app = new WindowsAppFriend(process);
        var windowsControl = new WindowControl(this._app.Type<Application>().OpenForms[0]);
        this._testDriver = new TestDriver(windowsControl);
    }

    [TestMethod]
    public void TestMethod1()
    {
        this._testDriver.NameTextBox.EmulateChangeText("テスト 太郎");
        this._testDriver.NameKanaTextBos.EmulateChangeText("テスト タロウ");
        this._testDriver.RegisterButton.EmulateClick();
        using (var reader = new StreamReader("user.csv"))
        {
            var text = reader.ReadLine();
            var texts = text.Split(',');
            Assert.AreEqual(texts[0], "テスト 太郎");
            Assert.AreEqual(texts[1], "テスト タロウ");
        }

    }
    [TestCleanup]
    public void CleanUp()
    {
        this._app.Dispose();
    }
}

Friendlyを使ってみて

アプリケーションを操作できることにすごく驚きました。
とりあえず使ってみただけなので、複雑なテストを作成するにはまだまだ勉強が必要そうです。
GitHub上でソースコードも公開されているので、時間があるときにどのように動いているのかを追ってみたいと思います。

参考にさせてい頂いた記事

qiita.com