FriendlyでWinformsのテストをやってみた
テストするためにポチポチ入力するのは辛いなーと思いこんな事をつぶやいてみると
MS的にはAppium推しのようです(参考:https://t.co/b2qzZCEOTj)
— piyosi (@piyo_esq) November 11, 2019
私は使用したことありませんが、国産だとCodeerさんのFriendlyとかが有名な気がします。。
@piyo_esqさんにWinformsで利用できるUIテストのツールに関して教えて頂きました!ありがとうございます!
今回は導入が手軽なFriendlyでUIのテストを作成してみたいと思います。
テストコード
導入方法
下記のパッケージをインストール。
www.nuget.org
テストするWinformsアプリケーション
名前を入力し登録ボタンをクリックするとCSVファイルを出力するようなアプリケーションを題材にテストを作成してみます。
テスト対象を操作するクラスを準備する
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上でソースコードも公開されているので、時間があるときにどのように動いているのかを追ってみたいと思います。