SilkTest 技術情報(FAQ)


カスタムコントロールのテスト- Silk4Net (C#) のチュートリアル(32bit)


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

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



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

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


情報の準備

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


基本的な操作の記録

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

using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using SilkTest.Ntf;
using SilkTest.Ntf.WindowsForms;

namespace Silk4NETProject2
{
	[SilkTestClass]
	public class UnitTest1
	{
		private readonly Desktop _desktop = Agent.Desktop;

		[TestInitialize]
		public void Initialize()
		{
			BaseState baseState = new BaseState();
			baseState.Execute();
		}

		[TestMethod]
		public void TestMethod1()
		{
			FormsWindow form1 = _desktop.FormsWindow("Form1");
			form1.SetActive();
			form1.TextField("txtUnitPrice").SetPosition(new TextPosition(0, 4));
			form1.TextField("txtUnitPrice").SetText("1980");
			form1.TextField("txtUnitPrice").TypeKeys("<Tab>");
			form1.TextField("txtCount").SetText("22");
			form1.PushButton("button1").Select();
		}
	}
}

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


テストプロジェクトに必要なアセンブリを追加する

ソリューションエクスプローラから、テストプロジェクトで右クリック、[参照の追加]を選択します。

  • 参照タブから、カスタムコントロールのDLLを指定します。今回の例では、JPNumBoxCtrl.dllです。
  • .NET タブから、System.windows.Formsを選択します。
  • カスタムコントロールが参照しているその他のDLLをすべて、参照設定に追加します。

参照設定が不足していると、ビルド時に次のようなエラーが発生します。

基本クラス 不足しているクラスの名前 を含むアセンブリ 推定されるアセンブリの名称 への参照が必要です。参照をプロジェクトに追加してください。

このエラーが出た場合、参照設定を確認してください。


スクリプトに、追加したカスタムコントロールの名前空間をImportsで追加しておきます。

using JPNumBoxCtrl

スクリプト資産にアクセッサのクラスとstaticメソッドを追加する

スクリプト資産の先頭(usingの後ろ)に、カスタムコントロールの値を取得するためのクラスと静的メソッドを定義します。Public Sharedで関数を定義することに注意してください。

 :
namespace Silk4NETProject2
{
    public class  JPNumBoxUtil {
        public static int GetValue( JPNumBoxCtrl.JPNumLabel jpNum) {
            return jpNum.Value;
        }

        public static int SetValue( JPNumBoxCtrl.JPNumLabel jpNum, int i){
            jpNum.Value = i;
            return jpNum.Value;
        }
        public static string GetText(JPNumBoxCtrl.JPNumLabel jpNum) {
            return jpNum.Text;
        }
    }
    :
    :

このクラスは、テスト対象のアプリケーションにロードされて実行されます。


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

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

 :
	[SilkTestClass]
	public class UnitTest1
	{
		private readonly Desktop _desktop = Agent.Desktop;
                :
                :
		[TestMethod]
		public void TestMethod1()
		{
			FormsWindow form1 = _desktop.FormsWindow("Form1");
			form1.SetActive();
            form1.LoadAssembly(Type.GetType("Silk4NETProject2.JPNumBoxUtil").Assembly.Location);
			form1.TextField("txtUnitPrice").SetText("1980");
          :

formオブジェクトに対して、LoadAssembryを使用する点は、ワークベンチでの実行と同じです。C#では、GetType の引数が異なること、GetTypeで指定しているクラス名には、ネームスペースの修飾が必要な点に注意してください。


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

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

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

       :
			form1.TextField("txtCount").SetText("22");
			form1.PushButton("button1").Select();
            SilkTest.Ntf.Control myJPNum = form1.Control(@"@automationId='lblPrice'");
            string objText = (string)form1.Invoke("Silk4NETProject2.JPNumBoxUtil.GetText", myJPNum);

            Assert.AreEqual("四万三千五百六十", objText);
		}

この例では、Assertを使用し、取得した値の検査を行っています。

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


TrueLogで結果の確認

実行した結果はTrueLogから確認することができます。下の図は、スクリプトを改変し、故意にAssert.AreEqual で失敗するようにしたときの実行例です。