クライアントのスクリプト作成

Platform 4.2.2以上が必要


テストスクリプト API

Nexaweb Platform 4.2.2 には、自動機能テストの記述に使用できる Test Script API が含まれています。Test Script API は、Nexaweb アプリケーションの UI コンポーネントをスクリプト可能なオブジェクトとして公開するので、自動機能テストの構築が簡素化されます。Test Script API には次の機能があります。
  • コンポーネントを識別する
  • マウスのクリック操作や座標に依存せずに、コンポーネントを操作する
  • コンポーネントから意味のある値を容易に取得する
  • 記録を使用せずに、有用なテスト スクリプトを記述する
このドキュメントでは、Mercury の Quick Test Professional (QTP) を使用した、Test Script API の使用方法を示していますが、この API に他の製品を使用することもできます。

はじめに

Test Script API は、難読化されていないテスト JAR ファイルに構築されるため、このAPIを使用するのに追加の設定を行う必要はありません。「Nexaweb アプリケーションクライアントのコンフィギュレーションファイルの設定」で説明されている手順で、特に <ui-test> エントリを true に設定する手順は不要です。

テストスクリプトオブジェクトを取得する方法

QTP の記録機能によって生成されるテストスクリプトでは、ラベルやボタンなど、実際の UI コンポーネントの QTP オブジェクトラッパーが使用されます。QTP では、オブジェクトラッパーがそのオブジェクトリポジトリ内に保存されます。デフォルトで、このリポジトリ内のオブジェクトには、NRichLabel や NButton など、実際のクラスに基づいて名前が付けられます。ただし、オブジェクトリポジトリダイアログに表示されるオブジェクト名を右クリックして、リポジトリ内 のオブジェクト名を変更できます。オブジェクトリポジトリで表示されるオブジェクトの名前は、QTP オブジェクトラッパーを検索する際にQTP スクリプト内のメソッドによって使用されます。

次のスクリプトは、"Some Label" という名前の QTP ラッパーオブジェクトからテストスクリプトオブジェクトを取得する方法を示します。

Set labelObj = Browser("Welcome To Nexaweb").Page("Welcome To Nexaweb").JavaApplet("DefaultJvmDetector").JavaObject("Some Label").Object.getScriptObject()

Set labelObj =
スクリプト内でテストスクリプトオブジェクトを後で使用するために、変数の形で保存します。

Browser("Welcome To Nexaweb")
Browser は、テスト対象のQTP ブラウザオブジェクトの検出に使用される QTP メソッドです。この例のWelcome To Nexawebは、オブジェクトリポジトリで定義されているブラウザオブジェクトの名前を表します。

Page("Welcome To Nexaweb")
Page は、テスト対象のQTP ページオブジェクトの検出に使用される QTP メソッドです。この例のWelcome To Nexawebは、オブジェクトリポジトリで定義されているページオブジェクトの名前を表します。

JavaApplet("DefaultJvmDetector")
JavaApplet は、テスト対象のQTP アプレットオブジェクトの検出に使用される QTP メソッドです。この例のDefaultJvmDetectorは、オブジェクトリポジトリで定義されているアプレットオブジェクトの名前を表します。

JavaObject("Some Label")
JavaObject は、テスト対象のQTP JavaObject ラッパーの検出に使用される QTP メソッドです。この例のSome Labelは、オブジェクトリポジトリで定義されているアプレットオブジェクトの名前を表します。

.Object
QTP JavaObject ラッパーの Object プロパティは、Nexaweb の基本 UI コンポーネント (例: ラベル) にアクセスします。

getScriptObject()
getScriptObject() メソッドは、Nexaweb の基本 UI コンポーネントに関連付けられているテストスクリプトオブジェクトを返します。Test Script API メソッドは、このテストスクリプトオブジェクトに適用されます。

また、アプリケーションスクリプトオブジェクトの findObjectById()findObject()、および findObjects() メソッドを使用して、UI コンポーネントのテストスクリプトオブジェクトを取得することもできます。findObjectById()は、一致する ID 属性を持つ UI コンポーネントを検出し、findObject()および findObjects() メソッドは XPath クエリに基づいてオブジェクトを検出します。
たとえば、次のスクリプトでは、
Test Buttonというテキストのボタンを検出して、このボタンをクリックします。

Set appObj = Browser("Welcome To Nexaweb").Page("Welcome To Nexaweb").JavaApplet("DefaultJvmDetector").Object.getScriptObject()
Set buttonObj = appObj.findObject("\\button[@text='Test Button']" )
buttonObj.click

findObject() メソッドを使用すると、このスクリプトを実行するためにボタン オブジェクトをオブジェクト リポジトリに追加する必要はありません。ただし、スクリプトでは QTP メソッドの JavaApplet() を使用してアプレットを検出し、.Object を使用してアプレット オブジェクトにアクセスするため、リポジトリにアプレットを追加する必要があります。

Test Script API の使用:

テスト スクリプト オブジェクトを取得したら、それを使用して基本 UI コンポーネントのコンテンツを操作およびテストできます。

Test Script API には、次の複合コンポーネント用のテスト スクリプト オブジェクトが含まれています。

  • コンボボックス
  • リストボックス
  • テーブル
  • ツリー
  • ツリーテーブル
また、1 回の API 呼び出しで次のタスクを実行できます。
  • コンボボックス内のアイテムの選択
  • テーブル内のセルの編集
  • リストボックスのアイテムの取得
  • テキストフィールドへの文字列の入力
  • ドラッグ&ドロップによるオブジェクトの移動
Test Script API の詳細については、DevCenter の 「API および XML リファレンス」の [Test API] タブを選択してください。

例:

この例で は、コンボボックスから選択したアイテムの値に基づいて、ラベルの値を設定するアプリケーションをテストします。ラベルのテキストは、コンボボックスの onCommand() イベントを処理する MCO 呼び出し内で設定されます。このテストでは、最初にコンボボックスとラベルの初期状態を確認します。次に、コンボボックスの各アイテムを選択します。選択 が完了すると、コンボボックスのテキストを、選択されているアイテムのテキストと照らし合わせてチェックします。次に、ラベルのテキストを、選択されてい るアイテムの値と照らし合わせてチェックします。

XML UI

<nxml> 
   <mco:declarations xmlns:mco="http://nexaweb.com/mco"> 
      <mco:mco id="eventMco" src="ComboBoxHandler"/> 
   </mco:declarations> 
   <rootPane> 
      <comboBox id ="combobox" text="ComboBox"
            onCommand="mco://eventMco.handleComboBoxOnCommand( mylabel )"> 
         <listBox> 
            <listItem text="Tree Item 1" value="one"/> 
            <listItem text="Tree Item 2" value="two"/> 
            <listItem text="Tree Item 3" value="three"/> 
         </listBox> 
      </comboBox> 
      <label id = "mylabel" text="Label to Change"/> 
   </rootPane> 
</nxml>


MCO
import com.nexaweb.client.ClientEvent; 
import com.nexaweb.client.ClientSession; 
import com.nexaweb.client.mco.AbstractMco; 
import com.nexaweb.client.mco.McoContainer; 
import com.nexaweb.xml.Document; 
import com.nexaweb.xml.Element; 

public class ComboBoxHandler extends AbstractMco
{
   public void handleComboBoxOnCommand( Element label ) 
   {
      ClientSession clientSession = McoContainer.getClientSessionFromMco(this); 
      Document uiDocument = clientSession.getDocumentRegistry().getUiDocument(); 
      ClientEvent clientEvent = clientSession.getEventHandler().getClientEvent(); 
      synchronized ( uiDocument.getDomSynchronizationObject()) 
      {
         String value = clientEvent.getParameter( "value" ); 
         label.setAttribute( "text", value ); 
      }
   }
}

  テスト

' アプレットのスクリプトオブジェクトを取得します。

			Set appObj = Browser("Welcome To Nexaweb").Page("Welcome To 
Nexaweb").JavaApplet("DefaultJvmDetector").Object.getScriptObject()
			' コンボボックスのスクリプトオブジェクトを取得します。

			Set comboBox = appObj.findObjectById("combobox")

			' ラベルのスクリプトオブジェクトを取得します。

			Set label = appObj.findObjectByid("mylabel")

			' コンボボックスの初期状態をテストします。

text = comboBox.getText()
if( text <>"ComboBox") then
   result = "Expected 'ComboBox' Actual was '" + text + "'"
   Reporter.ReportEvent micFail,"ComboBox", result
Else
   Reporter.ReportEvent micDone,"ComboBox", 
   "Intial Text passed. was 'ComboBox'"
End If

			

			' ラベルの初期状態をテストします。

		]


text = label.getText()
if( text <>"Label to Change") then
   result = "Expected 'Label to Change' Actual was '" + text + "'"
   Reporter.ReportEvent micFail,"Label", result
Else
   Reporter.ReportEvent micDone,"Label",
   "Intial Text passed. was 'Label to Change'"
End If


' コンボボックスのアイテム数を取得します。

itemCount = comboBox.getItemCount()

' アイテムのベクトルと戻り値のサイズを取得します。

Set itemobjs = comboBox.getItems()
sizeItems = itemobjs.size()

' 戻り値のサイズが正しいことを確認します。

if( itemCount <> sizeItems ) then
   result = "Expected " +itemCount + " tiems Actual was '" + sizeItems + "'"
   Reporter.ReportEvent micFail,"Label", result
Else
   Reporter.ReportEvent micDone,"ComboBox", "Number of Items was "+itemCount
End If

' 選択内容を確認し、onStateChange() イベントが正しく発生したことを確認するために、
' 各アイテムを選択し、コンボボックスおよびラベルのテキストをテストします。
For i = 0 to itemCount - 1

   ' アイテムを選択します。
   comboBox.selectItemAt( i )

   ' コンボボックスのテキストと、選択されているアイテムのテキストを照らし合わせてチェックします。


   tag = "Selected Item #" + CStr(i) + " - ComboBox"
   expectedText = itemobjs.elementAt(i).getText()
   text = comboBox.getText()

   if( text <> expectedText ) then
      result = "Expected '" + expectedText + "' Actual was '" + text + "'"
      Reporter.ReportEvent micFail,tag, result
   Else
      Reporter.ReportEvent micDone, tag,
      "ComboBox text was '" + expectedText +"'"
   End If

   ' ラベルのテキストを、選択されているアイテムの値と照らし合わせてチェックします。
   tag = "Selected Item #" + CStr(i) + " - Label"
   expectedText = itemobjs.elementAt(i).getValue()
   text = label.getText()

   if( text <> expectedText) then
      result = "Expected '" + expectedText + "' Actual was '" + text + "'"
      Reporter.ReportEvent micFail,tag, result
   Else
      Reporter.ReportEvent micDone,tag, "Label Text passed. was '" 
      + expectedText +"'"
   End If
Next