Windowsアプリのテスト自動化ツールを探していたらFriendlyというオープンソースのライブラリが見つかった。どういう仕組みで動くのか試してみたい。このライブラリに言及した記事を探したら以下がヒット。書かれたのは2014年と古い記事なので、この記事をなぞって自分で試してみる。
Friendlyエバンジェリストはミニスカサンタ – xin9le.net
http://blog.xin9le.net/entry/2014/12/22/000057
なお、本家リポジトリはこちら。
GitHub – Codeer-Software/Friendly
https://github.com/Codeer-Software/Friendly
SampleApp (ターゲットアプリ) 作成
– Windows Form App (.NET Framework)
– テスト用にプロパティとメソッドを追加
Form1.cs
namespace SampleApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private readonly string xMas = "Hello there!"; private static string GetNow() => "Current time is \{DateTime.Now}."; } }
TestApp (テストアプリ) 作成
– Console App (.NET Framework)
– Manage NuGet Packages…
– Codeer.Friendly by Codeer v.2.5.2
– Codeer.Friendly.Windows by Codeer v.2.9.0
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; using System.Drawing; using System.Reflection; using System.Windows.Forms; // Codeer // https://www.codeer.co.jp/ using Codeer.Friendly.Dynamic; using Codeer.Friendly.Windows; namespace TestApp { class Program { // Friendlyを使ったテスト自動化 // 参考サイト: // Friendlyエバンジェリストはミニスカサンタ - xin9le.net // http://blog.xin9le.net/entry/2014/12/22/000057 static void Main(string[] args) { //--- プロセス起動 var path = @"D:\\Visual Studio 2017\\Projects\\SampleApp\\SampleApp\\bin\\Debug\\SampleApp.exe"; var process = Process.Start(path); //--- プロセスにアタッチ var targetApp = new WindowsAppFriend(process); //--- staticメソッドの呼び出し var now = targetApp.Type("SampleApp.Form1").GetNow(); Console.WriteLine(now); //--- プロパティの参照 var form = targetApp.Type<Application>().OpenForms[0]; Console.WriteLine(form.Text); //--- プロパティの編集 form.BackColor = Color.LightPink; //--- private変数の参照 Console.WriteLine(form.xMas); //--- ComboBoxを動的に追加 //var comboBox = targetApp.Type<ComboBox>()(); //comboBox.Items.Add("xin9le"); //comboBox.Items.Add("ナオキ"); //comboBox.Items.Add("緑のタイツ"); //form.Controls.Add(comboBox); //--- 追加したComboBoxから値を取得 //Console.WriteLine(comboBox.SelectedItem); //--- dllインジェクション //WindowsAppExpander.LoadAssembly(targetApp, Assembly.GetExecutingAssembly()); //targetApp.Type(typeof(Program)).ShowMessageBox(); //--- 相手プロセス上で以下に定義したメソッドを呼び出す Console.ReadKey(); //--- 終了 process.CloseMainWindow(); process.WaitForExit(); } } }
ビルドして実行。TestAppからSampleAppのプロパティにアクセスしたり、メソッドを呼び出すことができた。そういう風にして外部アプリからターゲットアプリを操作して自動テストを行う仕組みらしい。
商用ツールにはテストケースをUIを使って定義できるものがあるが数十万円のコストがかかる。それに対して、Friendlyはテストケースをコーディングする手間がかかるけどオープンソースなので無料で使える。役立つシーンはありそうだ。