読者です 読者をやめる 読者になる 読者になる

ささいなことですが。

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

Friendly.UWP_α 0.0.1 をリリースしました!

Friendly.UWP_α 0.0.1 をリリースしました!
なんと、種も仕掛けもないUWPアプリのAPIを外部から呼べるのです!
(制限はあるw
www.nuget.org

まずは体験してみてください。
ここからサンプルをダウンロード
github.com

ダウンロードはこのボタンです。
f:id:ishikawa-tatsuya:20160103132353p:plain

解凍前にブロックを解除してくださいねー。
f:id:ishikawa-tatsuya:20160103132606p:plain

それで、Sample_UWP_1-master/Project/Sample/Sample.slnを開きます。
実行すると・・・
f:id:ishikawa-tatsuya:20160103134458p:plain

解説

コードは次のようになっています。

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Friendly.UWP;
using Codeer.Friendly.Dynamic;
using EnvDTE80;
using System.IO;
using VSHTC.Friendly.PinInterface;

namespace Sample
{
    [TestClass]
    public class Demo
    {
        [TestMethod]
        public void Test()
        {
            using (var app = new UWPAppFriend(new ByVisualStudio(Path.GetFullPath("../../../TargetApp/TargetApp.sln"))
            {
                //Visual Studio 2015のパス 違ったら変えてね。
                VisualStudioPath = @"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe",

                //ソリューションの構成
                //Debugのx86を選択
                ChangeVisualStudioSetting = (vs, dteSrc) =>
                {
                    var dte = dteSrc.Pin<DTE2>();
                    dte.Solution.SolutionBuild.SolutionConfigurations.Item(3).Activate();
                }
            }))
            {
                var current = app.Type("Windows.UI.Xaml.Window").Current;
                var mainPage = current.Content.Content;

                //定義したメソッドを呼びだし
                string ret = mainPage.Func(10);
                Assert.AreEqual("10", ret);

                //背景色変更
                var color = app.Type("Windows.UI.Colors").Blue;
                var brush = app.Type("Windows.UI.Xaml.Media.SolidColorBrush")(color);
                mainPage.Content.Background = brush;
            }
        }
    }
}

α0.01では対象のUWPをVisualStudioを使って起動するようにしています。対象のプロジェクトを開いたVisualStudioがあれば、それを使います。なければ、VisualStudioPathでパスを設定したものを起動して対象のソリューションを開きます。ChangeVisualStudioSettingは何かというと、ソリューションを開いた後のVisualStudioの設定を変えています。デバッグモードで実行する必要があるので、ソリューションの構成を変えています。これも開いた状態で期待のソリューション構成になっているなら、設定しなくてもOKです。
残りのコードは普通の(?)Friendlyのコードです。内部メソッドを呼び出せています。
あ、ちなみにChangeVisualStudioSettingは、Friendly.WindowsとFrinedly.PinInterfaceを使ってVisualStudioを外部から操作します。こちらを参照お願いします。
ishikawa-tatsuya.hatenablog.com

内部解説

Friendyはご存知の通り、操作したいプロセスの内側に、言うことを聞いてくれるモジュールを送り込み、それに指令を送って処理を実行させます。通常のデスクトップアプリ版はDLLインジェクションとCOMによるCLR操作でそれを実現していますが、UWPにはこの方法が効かないのです。
で、どうしたかと言うと、VisualStudioのイミディエイトの機能を使っています。App.InitializeComponentという関数でブレイクさせて、そこでイミディエイトでアセンブリのロードと指令を受信するモジュールの起動を実行しているのです。
あ、App.InitializeComponentという関数を消したり名前を変えている人はByVisualStudioのInjectionBreakPointというプロパティーでブレイクする関数を変更できます。

インジェクションしなくてもいいですよね?

今はインジェクションしてます。結構無理やりですw
でもここ以外には無理はないのですよね。
通信とリフレクションだけなので。
f:id:ishikawa-tatsuya:20160103141708p:plain

だから、そこは無理せずに対象のアプリにロードしておいてもらうのもいいかなーって思っています。
f:id:ishikawa-tatsuya:20160103141829p:plain

こんな構成ならいいでしょ?
f:id:ishikawa-tatsuya:20160103141856p:plain

次のバージョンからは

対象アプリに最初からロードしてもらう手法も詰めていきます。
それから、基本的なコントロールの操作のラッパークラスもこのライブラリに定義していこうかなー。
乞うご期待!

あ、それからOSSですので一緒に作ってくれる人も募集中です!