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
1 2 3 4 5 6 7 8 9 10 11 12 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
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はテストケースをコーディングする手間がかかるけどオープンソースなので無料で使える。役立つシーンはありそうだ。