friendlyによるwindowsアプリテスト自動化手法 基礎技術編
DESCRIPTION
Asian Automation Alliance ~自動化を語り合おう!(2014/06/28) でデモを交えながら話した元ネタです。(20分)TRANSCRIPT
![Page 1: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/1.jpg)
FriendlyによるWindowsアプリテスト自動化手法
基礎技術解説編
![Page 2: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/2.jpg)
自己紹介
福本健治
職業:プログラマー C# で WPF のデスクトップアプリケーション 開発をしています
![Page 3: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/3.jpg)
Windows アプリテスト自動化
こんなことをやりたいんです。
→デモ
![Page 4: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/4.jpg)
テスト設計技術
アプリ操作技術
テスト自動化に必要な技術は大きくは二つ
![Page 5: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/5.jpg)
テスト設計技術
アプリ操作技術
今日は Windows アプリ操作技術に関して話します。
![Page 6: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/6.jpg)
Windows アプリ操作プログラム作成時に最も困ったこと。それはインターフェイス。
・足りない。
・不安定。
・調整困難だって、 GUI って人間用じゃん・・・。
![Page 7: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/7.jpg)
GUI 操作をエミュレートするライブラリはいくつか存在します。
まあ、それはそれで良いのですが、テストを作りこんでいくともう一手欲しかったりします。
![Page 8: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/8.jpg)
で、 Friendly
http://www.codeer.co.jp/AutoTest
![Page 9: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/9.jpg)
Codeer で検索e が一個多い
Nuget で無料で入手できます!
![Page 10: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/10.jpg)
Friendly
他のとは根本的に違います。対象プロセスと、友達になって、プログラムを直で触らせてもらうのです。
最強
![Page 11: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/11.jpg)
① 君のものは僕のもの
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);}
そ、そんな・・・
![Page 12: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/12.jpg)
② 僕のものは君のもの
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() { /* テスト用 */ }
え !? 勝手に ?
![Page 13: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/13.jpg)
信じられない?では、デモやります。
![Page 14: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/14.jpg)
実用例
![Page 15: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/15.jpg)
安定した GUI 操作
//プログラム時に使う操作を直接呼び出しているんだから//確実に動作して当然だよね♪
form._comboBox.SelectedIndex = 2;
form._checkBox.CheckState = CheckState.Indeterminate;
form._trackBar.Value = 100;
*GUI 操作は後で紹介する上位ライブラリを使うとさらに便利です。
![Page 16: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/16.jpg)
操作困難な 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 });
![Page 17: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/17.jpg)
内部データを抜き出して検証
//リストアイテムに格納されているデータ[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);
![Page 18: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/18.jpg)
複雑な処理、アトミックに実行したい処理は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();}
対象プロセス内で実行!
![Page 19: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/19.jpg)
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 //処理内容}
レガシーなネイティブアプリを操作!
![Page 20: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/20.jpg)
使い方色々。非常に応用が利くので、工夫して使ってみてください。
この自由度の高さはテスト自動化のコストダウンのお役に立つと思います。
![Page 21: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/21.jpg)
さらに、上位ライブラリもあるのです。
![Page 22: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/22.jpg)
Friendly は、インフラのみの提供です。
何でもできるのですが・・・。
何でも書く必要があります。
例えば・・・・。
![Page 23: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/23.jpg)
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 のテキスト変更処理// これをインジェクションして実行させる。
![Page 24: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/24.jpg)
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 のテキスト変更処理// これをインジェクションして実行させる。
面
倒
![Page 25: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/25.jpg)
// 実装しておきました!これ使ってください。WPFDataGrid grid(core);grid.EmulateChangeCellText(0, 1, “NewText”);
WPF の DataGrid のテキスト変更処理
![Page 26: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/26.jpg)
結局、 GUI 操作は、みんな使います。多くの方、コミュニティーの協力により、以下そろっておりますのでご利用ください。
・ネイティブ用・ WinForm 用・ WPF 用・ VSHTC.Friendly.PinInterface( 特殊 )
http://www.codeer.co.jp/AutoTest/api-reference
全部無料!
![Page 27: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/27.jpg)
ちなみに、GUI 操作は、似たようなライブラリがありますが、Friendly 系のライブラリの特徴は・・・
・シンプル。
・タイミング依存なし。
・高速。
・足りなければ、中身を使って簡単に拡張可能。
![Page 28: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/28.jpg)
お知らせ
![Page 29: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/29.jpg)
Windows アプリテスト自動化を希望している企業様がありましたら、株式会社 Codeer がお手伝いします。
【メリット】テスト自動化は立ち上げにコストがかかりますが、無料ライブラリの Friendly を使うことと、テスト自動化経験豊富な担当者のノウハウを使うことにより、無駄を省いた導入が可能となります。
![Page 30: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編](https://reader036.vdocuments.mx/reader036/viewer/2022081421/55661656d8b42a06318b4fba/html5/thumbnails/30.jpg)
ご清聴ありがとうございました。