端くれプログラマの備忘録 C# [C#] テスト自動化ライブラリFriendlyを試す

[C#] テスト自動化ライブラリFriendlyを試す

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はテストケースをコーディングする手間がかかるけどオープンソースなので無料で使える。役立つシーンはありそうだ。