ささいなことですが。

Windowsアプリテスト自動化ライブラリFriendly開発者の日記です。

Frienldy いまさら概要と学習計画

これは「Friendly Advent Calendar 2014 - Qiita」の記事です。

いまさらですが、概要と学習計画を書こうかなーと思いました。
きっかけは、@fuku518さんのエントリーですね。
Codeer Friendlyなら何でもできる! - C#でプログラミングあれこれ
あと、そろそろハンズオンでも上位ライブラリとか使って実践的なことやっていくので、この辺で整理しておこうかなーと。

とっつきにくい?

(・д・`)えー
こんなにシンプルで分かりやすく作ったのにw
まあ、その気持ちも分かります。ということで、少しでも習得しやすくなるように整理してみました。

Friendly系のライブラリ群

f:id:ishikawa-tatsuya:20141218214608p:plain
結構多いですねー。
大きくは基本と、上位ライブラリに分かれます。緑が基本部分で、青が上位ライブラリですね。
矢印は依存を表しています。

習得にあたって

順を追って学習する必要があります。

最初にまとめて使うと混乱するようです。はい。初期のころは私の説明の仕方が悪かったです。上位ライブラリと基本部分とツールをまとめて説明していた時期がありました。そうすると上位ライブラリの情報量と、ある種のパラダイムシフトを強いるような実装方法がまとめて、グワーっとくるわけですね。で、混乱する。さらに実行時例外とかね。
だから「基本部分」→「上位ライブラリ」の順で覚えもらうとよいかなーと。
ていうか、実際僕が現場で教えるときは、その順番で教えています。その時は、特に問題なく導入できる。でも仕事以外で教えるときは、勉強会とかで短い時間でパーっと説明してたので・・・、それがまずかったですね。

超シンプル!でもパラダイムシフトを強いる基本部分。

基本部分は本当にシンプルなのです。信じてください。まずはこれだけ覚えましょう。FriendlyとFriendly.Windowsだけです。(ストアアプリ用は一旦置いといてください)
ていうか、ポイントはたったこれだけなのです。(まあDLLインジェクションとかもう少しありますが、Friendlyの思想の根幹をなす部分はこれです。)

アタッチ

var app = new WindowsAppFriend(process);

static操作

//var form = Application.OpenForms[0]と同じ
dynamic form = app.Type<Application>().OpenForms[0];

インスタンス操作

//全く同じ
form.Close();

覚えることは本当に少ない。これだけで、staticな操作、インスタンスの操作が実行できる。つまり.Netの全てのAPIを操作対象プロセスに実行させることができるのです!
ただ、頭の使い方を切り替えてもらわなければなりません。
二つのプロセスを同時に操っているということです。処理がどちらで行われているか、インスタンスはどちらにあるか、それを意識してください。すぐに慣れます。ハンズオンの1~5までやったらもう完璧です。
ハンズオン1, ハンズオン2, ハンズオン3, ハンズオン4, ハンズオン5

あ、でもdynamicは・・・、まあこれは受け入れてください。いつか補助ツールとか出すかもしれませんが。まあ、気休め程度ですがコツを

//最初に普通に書いて(これならインテリセンス効く)
Application.OpenForms[0];
//型をapp.Typeで包んで書き換える
app.Type<Application>().OpenForms[0];

基本部分はGUI操作ではない

そうなのです。基本部分は相手プロセスのプログラムを別プロセスから操作するというものです。GUI操作は全く関係ないんですね。だからここを覚えるときには一旦GUI操作のことは忘れてください。

上位ライブラリ

基本部分を覚えたら、相手プロセスにすべての.NetのAPIを実行させることができるので、どんな操作でもできます。でもdynamicだし、操作によっては大量にコード書かなければならないので非常に手間です。
と言うことで、世界的に共通で使いそうなものはFriendlyコミュニティーで作成したので、それを使ってください。
これは、何があるかざっと一覧を眺めて、必要なものを使うというものですね。
クラスの中に操作対象の参照が入っていて、面倒な処理をラップしたシンプルなインターフェイスが提供されています。

//相手プロセスにあるボタンの参照をラップする
var grid = new FormsDataGridView(_form._grid);
//面倒なグリッドのテキスト変更処理が提供されている
grid.EmulateChangeCellText(0, 0, "text");

基本部分を理解していれば、直感的に使えます。このクラスのラッパーないかなーって探してあったらそれでラップする。標準のコントロールのは大体用意されています。
昨日も書きましたが、これにもFriendlyの基本部分の思想が入っています。それ故強力になるので、上位ライブラリを使う場合もある程度は基本部分を意識してもらう設計です。
これらはハンズオンで少しずつ解説していきます。

アプリケーションドライバ

Friendlyの機能ではなく、一般的な設計思想なのですが、テスト自動化をするにあたって必須です。極端に言えばFriendlyの目的はこれを作ってもらうことです。テストシナリオ自体はこのアプリケーションドライバを使って書くのです。これも後のハンズオンで紹介する予定です。
こちらの書籍に詳しく書いていますね。
継続的デリバリー

例外に関して

動的な解決の部分があるので、仕方ないんですが、これは分かりにくい部分もありますよね。改善できるところはやっていこうと思っています。トラブルシューティング的なブログも書こうかなー。一応こんなページもあるんですけどね。
例外メッセージ - 株式会社Codeer (コーディア)
現状はトラブった場合、連絡くれればお答えします。

まとめ

ポイントは覚える順番と、頭の切り替えと、慣れです。
覚えることは本当に少ないんですよー。

明日は

明日はまた@fuku518さんです。また凄いことをやってくれるみたいです。
よろしくお願いします!