ささいなことですが。

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

Friendlyハンズオン 2.アタッチ

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

昨日は操作対象プロセスをテストフレームワークから起動して終了するところまでやりました。
今日はアタッチするところまで行ってみようと思います。
引き続き、詳細なドキュメントは公式ページも参照しながらでお願いします。
テスト自動化 Friendly - 株式会社Codeer (コーディア)

今日やること

1.FriendlyをNuGetから取得
2.プラットフォームを合わせる
3.アタッチ

FriendlyをNuGetから取得

実は、Friendly関連のライブラリって、いっぱいあります。
今回は以下の二つを使います。

Friendly
Friendly.Windows

これらは、Windowsアプリを操作するときには必ず使うライブラリです。
ここでの詳細な紹介は逆に混乱を呼ぶので、慣れてきたらこちらのドキュメントを参照してください。

[Friendly]
Codeer.Friendly.dll - 株式会社Codeer (コーディア)
Codeer.Friendly.Dynamic.dll - 株式会社Codeer (コーディア)
[Friendly.Windows]
Codeer.Friendly.Windows.dll - 株式会社Codeer (コーディア)

Friendly.WindowsはFriendlyに依存しているので、これをダウンロードするとFriendlyもついてきます。
今は、ここでは「Friendly.Windowsを使うのかー」ぐらいでOKです。

まずはTestプロジェクトの「参照設定」の上で右クリックしてメニューから「NuGetパッケージの管理」を選択します。
f:id:ishikawa-tatsuya:20141209065615p:plain

左のツリーから「オンライン」→「nuget.org」を選択、
右上の「オンラインの検索」テキストボックスに「Friendly.Windows」と入力、
検索結果から「Friendly.Windows」を選択し「インストール」ボタンを押します。
f:id:ishikawa-tatsuya:20141209065630p:plain

そうすると、参照に以下のdllが追加されます。
Codeer.Friendly
Codeer.Friendly.Dynamic
Codeer.Friendly.Windows
Microsoft.CSharp
f:id:ishikawa-tatsuya:20141209065639p:plain

プラットフォームを合わせる

で、次はコードと行きたいところなんですが、もうひとつ、やることがあります。
操作対象とテストの実行時のプラットフォームを合わせる必要があります。
x64x86かですね。
実行時のと言ったのは、ビルドオプションを単に合わせたら良いというものでもないからです。
Testのプロジェクトは「クラスライブラリ」になっていますね。
つまり単なるdllです。
これを使うexeによって実行時のプラットフォームは変わります。
VSTestの場合、そのexeはVSTestです。
その実行時のプラットフォームは
「テスト」→「テスト設定」→「既定のプロセッサのアーキテクチャ
から選びます。
f:id:ishikawa-tatsuya:20141209065654p:plain

exeの方は普通にビルドオプションを設定すればいいですね。でも当たり前ですけどAnyCPUを選択した場合は環境依存で変わりますよ。
実行時に合えば、なんでもいいのですが、今回はハンズオンということで、x86で実行します。
(32bitパソコンでも同じになるように)

対象をx86にする
f:id:ishikawa-tatsuya:20141209065901p:plain

テストもx86にする
(Target.exeを参照させているので、合わせないとワーニングが出る)
f:id:ishikawa-tatsuya:20141209065910p:plain

テストホストもx86にする
f:id:ishikawa-tatsuya:20141209070131p:plain

ちなみに合ってないと、こんなエラーが出ますよー。
f:id:ishikawa-tatsuya:20141209071448p:plain

アタッチ

では、準備が整ったところで、いよいよアタッチします。
昨日のコードをこんな感じで書き換えます。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Diagnostics;
using System.Threading;
using Codeer.Friendly.Windows;

namespace Test
{
    [TestClass]
    public class TargetFormTest
    {
        WindowsAppFriend _app;

        [TestInitialize]
        public void TestInitialize()
        {
            _app = new WindowsAppFriend(Process.Start("Target.exe"));
        }

        [TestCleanup]
        public void TestCleanup()
        {
            var process = Process.GetProcessById(_app.ProcessId);
            process.CloseMainWindow();
            process.WaitForExit();
        }

        [TestMethod]
        public void TestMethod1()
        {

        }
    }
}

WindowsAppFriendのコンストラクタに指定のプロセスを渡すだけでアタッチできるのです。
あれ?
例の待合が消えていますね。
はい、WindowsAppFriendのコンストラクタにプロセスを渡したときは、メインウィンドウが取得できるまで待ちます。
だからいらないんです。
昨日と同様に実行してみましょう。

開始
f:id:ishikawa-tatsuya:20141209070212p:plain

アプリ起動→アタッチ
f:id:ishikawa-tatsuya:20141209070220p:plain

終了
f:id:ishikawa-tatsuya:20141209070226p:plain

実行結果は昨日と同じですね。
(まだ処理書いてないから、そらそうだ)
でも、この後は _app を使えば、対象プロセスを好き放題に操作できるのです!

明日へ続く・・・