friendlyによるwindowsアプリテスト自動化手法 基礎技術編

30
Friendly ににに Windows ににににににににににに ににににににに

Upload: kenji-fukumoto

Post on 28-May-2015

1.992 views

Category:

Software


6 download

DESCRIPTION

Asian Automation Alliance ~自動化を語り合おう!(2014/06/28) でデモを交えながら話した元ネタです。(20分)

TRANSCRIPT

Page 1: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

FriendlyによるWindowsアプリテスト自動化手法

基礎技術解説編

Page 2: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

自己紹介

    福本健治

職業:プログラマー     C# で WPF のデスクトップアプリケーション     開発をしています

Page 3: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

Windows アプリテスト自動化

こんなことをやりたいんです。  

     →デモ

Page 4: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

テスト設計技術

アプリ操作技術

テスト自動化に必要な技術は大きくは二つ

Page 5: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

テスト設計技術

アプリ操作技術

今日は Windows アプリ操作技術に関して話します。

Page 6: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

Windows アプリ操作プログラム作成時に最も困ったこと。それはインターフェイス。

・足りない。

・不安定。

・調整困難だって、 GUI って人間用じゃん・・・。

Page 7: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

GUI 操作をエミュレートするライブラリはいくつか存在します。

まあ、それはそれで良いのですが、テストを作りこんでいくともう一手欲しかったりします。

Page 8: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

    で、 Friendly

http://www.codeer.co.jp/AutoTest

Page 9: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

Codeer で検索e が一個多い

Nuget で無料で入手できます!

Page 10: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

      Friendly

他のとは根本的に違います。対象プロセスと、友達になって、プログラムを直で触らせてもらうのです。

最強

Page 11: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

① 君のものは僕のもの

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アプリテスト自動化手法 基礎技術編

② 僕のものは君のもの

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アプリテスト自動化手法 基礎技術編

信じられない?では、デモやります。

Page 14: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

実用例

Page 15: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

安定した GUI 操作

//プログラム時に使う操作を直接呼び出しているんだから//確実に動作して当然だよね♪

form._comboBox.SelectedIndex = 2;

form._checkBox.CheckState = CheckState.Indeterminate;

form._trackBar.Value = 100;

*GUI 操作は後で紹介する上位ライブラリを使うとさらに便利です。

Page 16: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

操作困難な 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アプリテスト自動化手法 基礎技術編

内部データを抜き出して検証

//リストアイテムに格納されているデータ[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アプリテスト自動化手法 基礎技術編

複雑な処理、アトミックに実行したい処理は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アプリテスト自動化手法 基礎技術編

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アプリテスト自動化手法 基礎技術編

使い方色々。非常に応用が利くので、工夫して使ってみてください。

この自由度の高さはテスト自動化のコストダウンのお役に立つと思います。

Page 21: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

さらに、上位ライブラリもあるのです。

Page 22: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

Friendly は、インフラのみの提供です。

何でもできるのですが・・・。

何でも書く必要があります。

例えば・・・・。

Page 23: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

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アプリテスト自動化手法 基礎技術編

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アプリテスト自動化手法 基礎技術編

// 実装しておきました!これ使ってください。WPFDataGrid grid(core);grid.EmulateChangeCellText(0, 1, “NewText”);

WPF の DataGrid のテキスト変更処理

Page 26: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

結局、 GUI 操作は、みんな使います。多くの方、コミュニティーの協力により、以下そろっておりますのでご利用ください。

・ネイティブ用・ WinForm 用・ WPF 用・ VSHTC.Friendly.PinInterface( 特殊 )

http://www.codeer.co.jp/AutoTest/api-reference

全部無料!

Page 27: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

ちなみに、GUI 操作は、似たようなライブラリがありますが、Friendly 系のライブラリの特徴は・・・

・シンプル。

・タイミング依存なし。

・高速。

・足りなければ、中身を使って簡単に拡張可能。

Page 28: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

お知らせ

Page 29: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

Windows アプリテスト自動化を希望している企業様がありましたら、株式会社 Codeer がお手伝いします。

【メリット】テスト自動化は立ち上げにコストがかかりますが、無料ライブラリの Friendly を使うことと、テスト自動化経験豊富な担当者のノウハウを使うことにより、無駄を省いた導入が可能となります。

Page 30: FriendlyによるWindowsアプリテスト自動化手法 基礎技術編

ご清聴ありがとうございました。