View
1.992
Download
6
Category
Preview:
DESCRIPTION
Asian Automation Alliance ~自動化を語り合おう!(2014/06/28) でデモを交えながら話した元ネタです。(20分)
Citation preview
FriendlyによるWindowsアプリテスト自動化手法
基礎技術解説編
自己紹介
福本健治
職業:プログラマー C# で WPF のデスクトップアプリケーション 開発をしています
Windows アプリテスト自動化
こんなことをやりたいんです。
→デモ
テスト設計技術
アプリ操作技術
テスト自動化に必要な技術は大きくは二つ
テスト設計技術
アプリ操作技術
今日は Windows アプリ操作技術に関して話します。
Windows アプリ操作プログラム作成時に最も困ったこと。それはインターフェイス。
・足りない。
・不安定。
・調整困難だって、 GUI って人間用じゃん・・・。
GUI 操作をエミュレートするライブラリはいくつか存在します。
まあ、それはそれで良いのですが、テストを作りこんでいくともう一手欲しかったりします。
で、 Friendly
http://www.codeer.co.jp/AutoTest
Codeer で検索e が一個多い
Nuget で無料で入手できます!
Friendly
他のとは根本的に違います。対象プロセスと、友達になって、プログラムを直で触らせてもらうのです。
最強
① 君のものは僕のもの
public partial class MainForm : Form{ ComboBox _comboBox;
string MyFunc(int value) { return value.ToString(); }}
public void YourThingIsMine(){ var process= Process.GetProcessesByName("Target")[0]; //友達になると・・・ var app = new WindowsAppFriend(process); //別プロセスのオブジェクトを //自分のプロセスのもののように操作できる。 dynamic form = app.Type<Application>().OpenForms[0];
form._comboBox.SelectedIndex = 1;
string ret = form.MyFunc(3);}
そ、そんな・・・
② 僕のものは君のもの
void MyThingIsYours(){ var process= Process.GetProcessesByName("Target")[0]; var app = new WindowsAppFriend(process); //自分のコードを動的にインジェクション! WindowsAppExpander.LoadAssembly(app, GetType().Assembly); //挿入したコードを相手プロセスで実行 app.Type(GetType()). ForTest();}
static void ForTest() { /* テスト用 */ }
え !? 勝手に ?
信じられない?では、デモやります。
実用例
安定した GUI 操作
//プログラム時に使う操作を直接呼び出しているんだから//確実に動作して当然だよね♪
form._comboBox.SelectedIndex = 2;
form._checkBox.CheckState = CheckState.Indeterminate;
form._trackBar.Value = 100;
*GUI 操作は後で紹介する上位ライブラリを使うとさらに便利です。
操作困難な GUI 操作をスキップ
void DragDrop(object sender, DragEventArgs e){ DropCore( e.Data.GetData(DataFormats.FileDrop) as string[]);}
void DropCore(string[] files){ //ここから先のロジックの方が不安なんだよね。}
//クリップボード使う処理は//不安定になりがちだし、//自動テストではコア部分だけにしよっと♪//もちろん、抜かしたことは//チームで共有するよ。form.DropCore(new string[] { path1, path2, path3 });
内部データを抜き出して検証
//リストアイテムに格納されているデータ[Serializable]class MyItem{ string Name { get; set; } int Age { get; set; } string Address { get; set; }}
//データ取れるから、検証も簡単♪
MyItem item = form._listBox.Items[3];
Assert.AreEqual(“石川 ", item.Name);Assert.AreEqual(37, item.Age);Assert.AreEqual(“大阪” , item.Address);
複雑な処理、アトミックに実行したい処理はInjection void Test()
{ WindowsAppExpander.LoadAssembly(app, GetType().Assembly); //挿入した static関数を呼び出し。 app.Type(GetType()). Change(form._grid, 1, 1, 2);}
//割り込みなしで、確実に実行。//実装も簡単。 (^_^)vstatic void Change(DataGridView grid, int col, int row, int index){ grid.Focus(); grid.CurrentCell = grid[col, row]; grid.BeginEdit(false); ((ComboBox)grid.EditingControl).SelectedIndex = index; grid.EndEdit();}
対象プロセス内で実行!
void Test(){ //インジェクション! WindowsAppExpander.LoadAssembly( app, GetType().Assembly);
//DLL公開関数も呼び出せる! app.Type(GetType()). MyNativeFunction();}
[DllImport("MFCApplication.exe")]static extern void MyNativeFunction();
extern "C" __declspec(dllexport) void __cdecl MyNativeFunction(){ //みんな大好きMFC //処理内容}
レガシーなネイティブアプリを操作!
使い方色々。非常に応用が利くので、工夫して使ってみてください。
この自由度の高さはテスト自動化のコストダウンのお役に立つと思います。
さらに、上位ライブラリもあるのです。
Friendly は、インフラのみの提供です。
何でもできるのですが・・・。
何でも書く必要があります。
例えば・・・・。
static void EmulateChangeCellText(DataGrid grid, int itemIndex, int col, string text){ bool success = false; EventHandler<DataGridCellEditEndingEventArgs> hanlder = (s, e) => { TextBox textBox = e.EditingElement as TextBox; if (textBox != null) { textBox.Text = text; success = true; } }; grid.CellEditEnding += hanlder; EmulateChangeCurrentCell(grid, itemIndex, col); grid.BeginEdit(); grid.CommitEdit(DataGridEditingUnit.Row, true); grid.CellEditEnding -= hanlder; if (!success) { throw new NotSupportedException (ResourcesLocal4.Instance.DataGridErrorNotTextBoxCell); }}
WPF の DataGrid のテキスト変更処理// これをインジェクションして実行させる。
static void EmulateChangeCellText(DataGrid grid, int itemIndex, int col, string text){ bool success = false; EventHandler<DataGridCellEditEndingEventArgs> hanlder = (s, e) => { TextBox textBox = e.EditingElement as TextBox; if (textBox != null) { textBox.Text = text; success = true; } }; grid.CellEditEnding += hanlder; EmulateChangeCurrentCell(grid, itemIndex, col); grid.BeginEdit(); grid.CommitEdit(DataGridEditingUnit.Row, true); grid.CellEditEnding -= hanlder; if (!success) { throw new NotSupportedException (ResourcesLocal4.Instance.DataGridErrorNotTextBoxCell); }}
WPF の DataGrid のテキスト変更処理// これをインジェクションして実行させる。
面
倒
// 実装しておきました!これ使ってください。WPFDataGrid grid(core);grid.EmulateChangeCellText(0, 1, “NewText”);
WPF の DataGrid のテキスト変更処理
結局、 GUI 操作は、みんな使います。多くの方、コミュニティーの協力により、以下そろっておりますのでご利用ください。
・ネイティブ用・ WinForm 用・ WPF 用・ VSHTC.Friendly.PinInterface( 特殊 )
http://www.codeer.co.jp/AutoTest/api-reference
全部無料!
ちなみに、GUI 操作は、似たようなライブラリがありますが、Friendly 系のライブラリの特徴は・・・
・シンプル。
・タイミング依存なし。
・高速。
・足りなければ、中身を使って簡単に拡張可能。
お知らせ
Windows アプリテスト自動化を希望している企業様がありましたら、株式会社 Codeer がお手伝いします。
【メリット】テスト自動化は立ち上げにコストがかかりますが、無料ライブラリの Friendly を使うことと、テスト自動化経験豊富な担当者のノウハウを使うことにより、無駄を省いた導入が可能となります。
ご清聴ありがとうございました。
Recommended