SilkTest 技術情報(FAQ)


カスタムコントロールのテスト- Silk4J (Java) のチュートリアル


Silk4Netのチュートリアルを実行する前に、あらかじめカスタムコントロールのテスト-チュートリアルで機能の確認を行ってください。

本チュートリアルでは、すでにカスタムコントロールのテスト-チュートリアルを実行し、サンプルの入手や基本動作についての確認が済んでいるものとして説明されています。



サンプルプログラムのダウンロードと解説

サンプルプログラムはカスタムコントロールのテスト-チュートリアルで使用したものをそのまま使用します。

Silk4Jではインジェクションコード用のDLLを作成する必要があります。簡単なソリューションなので、手で作成しても構いません。

インジェクションクラスとEclipseプロジェクトからもダウンロードできます。


情報の準備

カスタムコントロールに関して、必要な情報を収集しておきます。カスタムコントロールのテスト-チュートリアルと同じです。

さらに、Silk4Jでカスタムコントロールの操作を行うには、ターゲットアプリケーションをビルドしたものと同じバージョンのVisual Studioが必要です。

今回のチュートリアルで使用するアプリケーションは Visual Studio 2010でビルドされています。Visual Studio 2010が使用できる環境を用意しておきます。


基本的な操作の記録

Silk4J で、操作の記録を行います。スクリプトは次のようになります。(環境や操作により異なることがあります)

import com.borland.silktest.jtf.Desktop;
import com.borland.silktest.jtf.TestObject;

import org.junit.Before;
import com.borland.silktest.jtf.BaseState;
import org.junit.Test;
import com.borland.silktest.jtf.windowsforms.FormsWindow;
import com.borland.silktest.jtf.TextField;
import com.borland.silktest.jtf.common.types.TextPosition;
import com.borland.silktest.jtf.PushButton;

public class mytest1 {

	private Desktop desktop = new Desktop();

	@Before
	public void baseState() {
		BaseState baseState = new BaseState();
		baseState.execute(desktop);
	}

	@Test
	public void method1() {
		desktop.<FormsWindow>find("Form1").setActive();
		desktop.<TextField>find("Form1.txtUnitPrice").setPosition(new TextPosition(0, 0));
		desktop.<TextField>find("Form1.txtUnitPrice").setText("1980");
		desktop.<TextField>find("Form1.txtUnitPrice").typeKeys("<Tab>");
		desktop.<TextField>find("Form1.txtCount").setText("");
		desktop.<TextField>find("Form1.txtCount").setText("22");
		desktop.<PushButton>find("Form1.button1").select();
	}
}

インジェクションコードのDLLをビルド

ターゲットアプリケーションに注入するコードを、DLLとして作成します。 Visual Studioで.NET クラスライブラリのソリューションを作成し、DLLとしてインジェクションコードをビルドしておきます。

プロジェクトには、カスタムコントロールのDLLを参照設定しておく必要があります。

Public Class JPNumBoxUtil
    Public Shared Function GetValue(ByVal jpNum As JPNumBoxCtrl.JPNumLabel) As Integer
        Return jpNum.Value
    End Function

    Public Shared Function SetValue(ByVal jpNum As JPNumBoxCtrl.JPNumLabel, ByVal i As Integer) As Integer
        jpNum.Value = i
        Return jpNum.Value
    End Function

    Public Shared Function GetText(ByVal jpNum As JPNumBoxCtrl.JPNumLabel) As String
        Return jpNum.Text
    End Function
End Class


ビルドが完了すると、JPNumBoxUtil.dllというDLLファイルが入手できます。このファイルはわかりやすい場所に置いておきます。


カスタムコントロール用のスクリプト変更


アクセッサのクラスをテスト対象のアプリケーションに読み込ませる

テストスクリプトの先頭など(アプリケーションのメインウインドウが取得できたあと)で、そのメインウインドウに前の手順で作ったクラスを無理矢理ロードさせます。

 :
public class mytest1 {

	private Desktop desktop = new Desktop();

	@Before
	public void baseState() {
		BaseState baseState = new BaseState();
		baseState.execute(desktop);
	}

	@Test
	public void method1() {
		desktop.<FormsWindow>find("Form1").setActive();
		desktop.<FormsWindow>find("Form1").loadAssembly("C:\\Users\\dev\\Documents\\JPNumBoxUtil.dll");
		desktop.<TextField>find("Form1.txtUnitPrice").setPosition(new TextPosition(0, 0));
		desktop.<TextField>find("Form1.txtUnitPrice").setText("1980");
		desktop.<TextField>find("Form1.txtUnitPrice").typeKeys("<Tab>");
          :

Silk4Jでは、loadAssemblyにリテラル値として前の手順で作成した、インジェクションコードのDLLをフルパスを指定します。(カスタムコントロールのDLLでは無い点にご注意ください)


テスト対象アプリケーションに強制的にメソッドを実行させて結果を取得する

メソッドの実行には、Invokeメソッドを使用します。ここでも、引数に指定する関数名は、名前空間を含めて完全に修飾してある必要があります。

"JPNumBoxUtil.GetText"などを指定すると、クラスをみつけることができずにSystem.Exceptionが発生します。例外メッセージは次のようなテキストになります。「クラス 'JPNumBoxUtil' が見つかりませんでした。 完全修飾クラス名が正しいことを、およびテスト対象アプリケーションでロードされるクラスを含むアセンブリを確認してください。"」

インジェクションDLLをVB.NETで作成した場合、名前空間はソースコード中に示されず、プロジェクトファイルに含まれています。プロジェクトのプロパティを確認してください。

       :
		desktop.<TextField>find("Form1.txtCount").setText("22");
		desktop.<PushButton>find("Form1.button1").select();
		TestObject myJPNum = desktop.<FormsWindow>find("Form1").find("Control[@automationId='lblPrice']");
		
		String strObjText = (String)desktop.<FormsWindow>find("Form1").invoke("JPNumBoxUtil.JPNumBoxUtil.GetText",myJPNum);
		assertEquals("四万三千五百六十",strObjText);
		
		
	}

この例では、assertEqualsを使用し、取得した値の検査を行っています。assertEqualsを使用するためのimportsも追加します。

これで、テストスクリプトから、カスタムコントロールから値を取得するという操作が完了します。