概要‎ > ‎

ジェネレータ作成方法

GUIを操作するテストを作成する場合、誰もが思うのは、
「対象のアプリケーションを操作することで、コードを出力したい。」
ということです。

これは、よくキャプチャリプレイツールという形で提供されます。

TestAssitantでも1.7から「操作によるコード生成」というものを提供しています。
これは、TestAssistantに「ジェネレータ」をプラグインすることにより
対応する「ジェネレータ」のあるコントロールを操作することによりコードを出力できるようにするというものです。

Friendlyの機能を利用すると、ジェネレータは簡単に作成できます。


注意)
WPFのコントロールのジェネレータをプラグインする場合はTestAssistantの
CLRと.NetFrameworkのバージョンをConfigファイルによって変更してください。
デフォルトではTestAssistantは2.0で動作します。

備考 TestAssistantの実行ランタイムバージョンの変更


TestAssistantのインストールフォルダにConfigファイルを配置することにより実行ランタイムを切り替えることができます。
以下の4ファイル必要です。
 Codeer.TestAssistant.Script_x86.exe.config
 Codeer.TestAssistant.Script_x64.exe.config
 Codeer.TestAssistant.exe.config
 Codeer.TestAssistant_x64.exe.config

4.0に変更するConfigファイルをサンプルとして用意しました。
こちらからダウンロードしてインストールフォルダに入れてください。
また、configファイルの内容に関しましてはマイクロソフトのWebサイトを参照お願いします。
ランタイムのバージョンが変更になった場合はそちらを参照して書き換えてください。




サンプルとして、Ong.Friendly.FormsStandardControlsのボタン操作に関するコードを使います。
実は、以下のライブラリは、対応するジェネレータをそれぞれ実装しています。
そのコードは、それぞれ公開されていますので、そちらも参照お願いします。

System.Windows.Forms.Buttonの操作に関するコードを出力するクラスは以下のように簡単なものです。

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Codeer.TestAssistant.GeneratorToolKit;

namespace
Ong.Friendly.FormsStandardControls.Generator
{
    /// <summary>
    /// コード生成
    /// </summary>
    public class FormsButtonGenerator : GeneratorBase
    {
        Button _control;

        
/// <summary>
        /// アタッチ。
        /// </summary>
        protected override void Attach()
        {
            _control = (Button)ControlObject;
            _control.Click += ButtonClick;
        }

        
/// <summary>
        /// ディタッチ。
        /// </summary>
        protected override void Detach()
        {
            _control.Click -= ButtonClick;
        }

        
/// <summary>
        /// ボタン押下
        /// </summary>
        /// <param name="sender">イベント送信元</param>
        /// <param name="e">イベント内容</param>
        void ButtonClick(object sender, EventArgs e)
        {
            if (_control.Focused)
            {
                AddSentence(new TokenName(), ".EmulateClick(", new TokenAsync(CommaType.Non), ");");
            }
        }
    }
}


このクラスの定義されたdllをTestAssistantのexeと同じフォルダに入れ、
対応を書いたXMLをPluginフォルダに入れると、「操作からのコード生成」時に
対象アプリケーションにこのクラスが転送され、対応するコントロールごとにインスタンスが生成されます。
このオブジェクトは対象アプリケーションで実行されますので
普通にイベントハンドラに接続すると、ユーザ操作のタイミングを捕まえられます。
実装のポイントは以下のものです。

GeneratorBaseを継承する。
ジェネレータは全てこれを継承する必要があります。

②Attachを実装する。
生成されるとこれが呼び出されます。
ここで、必要なイベントに接続してください。

③Detachを実装する。
コード生成モードが終了すると呼び出されます。
ここでイベント接続を切ってください。

④コードを生成する(AddSentenceを呼び出します。)
ここがポイントです。
センテンスというのはコードの一文です。
トークンの集合という定義にしています。
トークンは任意のオブジェクトでToStringで文字列化されます。

単純にstringを入れても良いですし、ユーザ定義の型のオブジェクトでも構いません。
ユーザ定義のオブジェクトは場合によっては⑤の最適化で使うことができます。
ただ、以下のトークンはTestAssistantが解釈し、特別な置き換えをします。

TokenName
変数名称に置き換えられます。

TokenAsync
非同期処理が必要な場合、非同期オブジェクトに置き換えられます。

TokenSeparator
ワンセンテンスでTokenSeparatorのみの場合は改行に置き換えられます。

⑤場合によってはOptimizeを実装する。

/// <summary>
/// コードの最適化。
/// </summary>
/// <param name="list">コードリスト。</param>
public override void Optimize(List<Sentence> code)
{

    GenerateUtility.RemoveDuplicationFunction(this, code, "EmulateChangeText");
}
例えば、TextBoxのTextChangedイベントでコードを生成した場合、1文字変更するごとにコードが生成されます。
後で見直した場合、いくつかは不要であることが判断できます。
このメソッドはコード生成モードが終了するときに、TestAssistantで「追加時にコードを最適化する」
チェックボックスがONの場合に呼び出されますので、その時点で不要と思うコードは削除できます。

TestAssistantにプラグインするためのXMLファイルの書き方です。

<?xml version="1.0"?>
<PluginInfo>
  <AssemblyString>Ong.Friendly.FormsStandardControls.Generator, Version=1.7.0.0, Culture=neutral</AssemblyString>
  <Company>onigiri-soft</Company>
  <WebPage>http://www.onigiri-soft.com/</WebPage>
  <LoadDllInfos>
    <LoadDllInfo>
      <IsNative>false</IsNative>
      <LoadDllType>StartupPath</LoadDllType>
      <Name>Ong.Friendly.FormsStandardControls.dll</Name>
    </LoadDllInfo>
  </LoadDllInfos>
  <NetTypePairs>
    <PluginClassPair>
      <TargetType>System.Windows.Forms.Button</TargetType>
      <GeneratorType>Ong.Friendly.FormsStandardControls.Generator.FormsButtonGenerator</GeneratorType>
    </PluginClassPair>
  </NetTypePairs>
</PluginInfo>

AssemblyString
アセンブリのフルネームです。
署名している場合は、パブリックキーの情報も含めてください。

Company
作者名称を書いてください。

WebPage
ヘルプを記載したWebサイトなどある場合はそのURLを書いてください。

LoadDllInfos
事前に対象プロセスに読み込ませておくべきDLLです。

LoadDllInfo
DLLの情報です。

IsNative
ネイティブのDLLであるかを設定します。true/falseを指定します。

LoadDllType
DLLのロードタイプです。以下から選択します。
・StartupPath TestAssistant.exeと同一フォルダにあるDLLです。
・FullPath フルパスでロードさせます。
・System .Netの場合はGACフォルダ、ネイティブの場合はWindowsフォルダなど
       名前だけでロードできるフォルダに配置しているDLLです。

Name
DLLのファイル名称です。
LoadDllTypeがFullPathの場合はフルパスを指定してください。
それ以外はファイル名称を指定してください。

NetTypePairs
.Netのタイプのペアリングを記述するブロックです。

PluginClassPair
ペアリングブロックです。複数記述可能です。

TargetType
対象のウィンドウの.Netのタイプフルネームかウィンドウクラス名称を記述します。

GeneratorType
ジェネレータのタイプです。