HOME > Document > iTest TIPS

Spirent iTestテクニカル TIPS


このページでは、iTestに関するTechnical Tipsを掲載しています。

1. 内部Tclと外部Tclについて考えてみる

iTestはデフォルトでTclインタープリタを持っています。TestcaseのActionでevalを指定するとDescriptionでTclコマンドが記述できます。
しかし、このiTestが内蔵しているTclインタープリタはActiveTclなどの一般的なTclがそのまますべて使用できるわけではありません。
例) 
Action          Description
--------------------------------------
Procedure
1    eval       info patchlevel
2    ScriptEval info patchlevel
このTestcaseを実行すると、
Step1は、Unable to evaluate "info patchlevel" Command is not supported というエラーになります。
しかし、Step2では 8.4.19 というように正しくバージョン情報が返されます。

なぜ、このような結果になるのでしょうか。

Step1では、内部Tclを使用して Tclバージョンを表示するinfo patchlevelを実行しています。

しかし、iTestの内部Tclインタープリタはこのコマンドを知らないので、エラーとなります。

これに対して、Step2では外部Tclを使用するために、ScriptEvalを使用しています。

この場合iTestはDescriptionに書かれたコマンドを外部Tclに、そのまま渡します。(外部Tclを使用する場合ActiveTclがインストールされている必要があります)
また、外部Tclが実行した結果をそのままEditorに表示しているのです。

これらをどうやって使い分けるか?

iTestがサポートしていないTclコマンドを使いたい場合には、ScriptEvalを使って自由なTclでのScriptingが可能です。
しかし、1点だけ注意が必要です。 それは、ScriptEvalを使用した場合には、変数が保管される領域が異なるということです。

例) 
Action          Description
--------------------------------------
Procedure
1    eval       set var1 [info patchlevel]
2    ScriptEval set var2 [info patchlevel]

2. 内部変数 と 外部変数 保管されている領域

内部Tclを使用したと外部Tcl

iTestでは

evalを使って定義した変数を 内部変数
ScriptEvalを使った変数を 外部変数

という言いかたをします。


Action          Description
--------------------------------------
Procedure
1    ScriptEval  set var [info patchlevel] ===> 8.4.19
2    eval       puts $var ===> [ERROR]Variable $var does not exists
Step 2を実行するとエラーになります。 Variable "var" does not exist

これは、変数 var が、iTestの変数領域と異なる領域に保管されているためです。

では、どうやって この変数を参照するのか?

iTestにはScriptEvalで実行した変数を参照するために、ScriptGet というコマンドが用意されています。

以下のように参照します。

Action          Description
--------------------------------------
Procedure
1    ScriptEval  set VAR1 [info patchlevel]
2    ScriptGet  VAR2 {$VAR1}
書き方は、ScriptGet 内部変数名 {$外部変数名} です。

外部変数として定義されている VAR1 という変数を 内部変数名 VAR2 に取り込んでいます。
外部変数名の前後にあるニョロカッコと$はおまじないだと思ってください。

このあと、以下のように VAR2 という内部変数を eval で puts してみると、正しく参照できています。
Action          Description
--------------------------------------
3    eval       puts $VAR2   ===> 8.4.19

次回は少し内容を変えてExcelシートを読んでみたいと思います。

3. Excelシートを読んでみる

iTestはTclだけではなく、様々な外部システムと連携ができます。

例えばExcelシートを読むこともできます。
Excelであれば、VBScriptがてっとり早いので、以下のように input.xlsx というExcelファイルの中の Sheet1 というシートを読み込んで
列1から列3までを、カンマ区切りのTextファイルとして出力し、iTestからは、出力されたCSVを読み込むことができます。

[ input.xlsx というExcelファイル の Sheet1 ]

---------------------------------------
Col1            Col2            Col3
---------------------------------------
192.168.1.1     HostnameA       user1
192.168.1.2     HostnameB       user2
192.168.1.3     HostnameC       user3
...
---------------------------------------
[ VB Script ]
Option Explicit

Dim objADO
Dim objRS
Dim objFSO
Dim objLOG

Set objADO = CreateObject("ADODB.Connection")

objADO.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=D:\itest_workspace\Demo\Excel\input.xlsx"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objLOG = objFSO.CreateTextFile("D:\itest_workspace\Demo\Excel\sample1.csv")

objLOG.Write("col1," & "col2," & "col3" & vbCrLf)

Set objRS = objADO.Execute("select * from [Sheet1$]")

Do Until objRS.Eof = True

    objLOG.Write(objRS("col1") & "," & objRS("col2") & "," & objRS("col3") & vbCrLf)
    objRS.MoveNext

Loop

objRS.Close
objLOG.Close
objADO.Close

Set objADO = Nothing
Set objLog = Nothing
Set objFSO = Nothing
[ iTestテストケース ]
======================================================================================
Procedure
======================================================================================
Step	Action	Session	Description
--------------------------------------------------------------------------------------
1. 	eval		        set PATH [info workspacePath]\\My Project
--------------------------------------------------------------------------------------
2. 	eval		        regsub -all {\\} $PATH {\\\\} PATH2
--------------------------------------------------------------------------------------
3. 	command		dos		dos_session.profile
-------------------------------------------------------------------------------------
4. 	command		dos		$PATH2\\ReadExcel.vbs
-------------------------------------------------------------------------------------
5. 	command		dos		type $PATH2\\output.csv
--------------------------------------------------------------------------------------

Step 5 のレスポンスは、以下のように出力されます。

Col1            Col2            Col3
192.168.1.1     HostnameA       user1
192.168.1.2     HostnameB       user2
192.168.1.3     HostnameC       user3

[解説]

まず、iTest Step1では [info workspacepath]というiTest用コマンドを使って、現在の作業フォルダであるワークスペースを取得していますが
これは、実行したいVBScriptが、My Projectの中に存在するため、フルパスを取得するためです。

さらに、後ろにMy Projectというプロジェクト名を追加しています。バックスラッシュ(円マーク)を2つ付けて連結していますが、iTestではバックスラッシュ(円マーク)は
エスケープ文字であるため、ディレクトリ区切り文字を文字として使用する場合には、2つ連続させる必要があります。

$PATHの中には、C:\WORKSPACE\My Projectという値が入っていますが、Step4でコマンドプロンプトセッションからC:\WORKSPACE\My Project\ReadExcel.vbs
を実行させるために、Step2では、バックスラッシュ1個からバックスラッシュ2個に変換しています。

これは、Step1でバックスラッシュを2個書いたのと同じ原理です。
Step4では、VBScriptを実行していますが、今回はVBScriptの中に、CSV形式の出力ファイル名を固定で記述したため、Step5ではDOS Typeコマンドを使って標準出力させています。
この応用例として、検証開始前の事前コンフィグ用コマンド一覧をExcelに登録しておき、iTestからはExcelを直接読んで、Telnetから実行するというような
実行コマンドをExcelで管理するといった使用法が考えられます。

4. よく使う文字列の置き換え

今回は、よく使う文字列の置き換えを取り上げてみます。

何らかのコマンドを実行してMACアドレスを出力した結果 0009.0f50.2f08 という文字列が表示されたとします。

この文字列を 00 09 0f 50 2f 08というフォーマットに直して使いたい場合には、色々な方法での文字列置換が考えられますが
regsub と format を使ってみます。
======================================================================================
Procedure
======================================================================================
Step	Action	Description
--------------------------------------------------------------------------------------
1.      eval    set MAC "0009.0f50.2f08"      
--------------------------------------------------------------------------------------
2.      eval    set MAC2 [regsub -all {\.} { }]       ==> 0009 0f50 2f08
--------------------------------------------------------------------------------------
3.      eval    set MAC3 [scan $MAC2 "%2s %2s %2s %2s %2s %2s"] ==> 00 09 0f 50 2f 08
--------------------------------------------------------------------------------------


Step 2 では、regsub を使って すべての ドット を スペース に置換しています
Step 3 では、scan を使って 2文字スペース2文字スペース...というフォーマットに変換しています

上記の例では、2ステップで変換していますが、これを1つのステップにまとめると以下のようになります。
===============================================================================================
Procedure
===============================================================================================
Step	Action	Description
-----------------------------------------------------------------------------------------------
1.      eval    set MAC "0009.0f50.2f08"      
-----------------------------------------------------------------------------------------------
2.      eval    set MAC3 [scan [regsub -all {\.} { }] "%2s %2s %2s %2s %2s %2s"] ==> 00 09 0f 50 2f 08
-----------------------------------------------------------------------------------------------


5. WireSharkパケットキャプチャ

WireSharkはGUIベースでのパケットキャプチャツールですが、コマンドライン版のtshark.exeが付属されています。

iTestからパケットキャプチャを行う場合には、WireSharkというセッションタイプが用意されていますので、tshark.exeをコマンドラインで使用するのと同じようにキャプチャ用のフィルタやディスプレイ用フィルタが使えます。
Wiresharkセッションからhelpを実行すると、以下のように使用できるコマンド一覧がリストされます。
Wireshark>help
capture load                    - Load captured packets from a file
capture run [-c ]              - Start capturing packets and wait for capture to finish
capture save                    - Save last capture to specified location
capture start [-c ]            - Start capturing packets in the background
capture status                               - Show the capture status
capture stop                                 - Stop any capture that is in progress
capture wait                                 - Wait for capture to finish
exit                                         - アプリケーションを終了します
filter reset                                 - Reset the display filter back to the value in the session properties
filter set []                        - Update the display filter controlling which packets will be visible
help []                              - Display command help information
query decode [-s ] [-c ]    - Show decoded list of packets received during this session
query details                            - Show the details of selected packet
query filter reset                           - Reset the display filter back to the value in the session properties
query filter set                     - Update the display filter controlling which packets will be visible
query interfaces                             - Show the network interfaces
query load                      - Load captured packets from a file
query packets [-s ] [-c ]   - List packets received during this session
show decode [-s ] [-c ]     - Show decoded list of packets received during this session
show details                             - Show the details of selected packet
show interfaces                              - Show the network interfaces
show packets [-s ] [-c ]    - List packets received during this session

フィルタなどのフォーマットは、tshark.exeのフォーマットがそのまま使えます。
あるいは、
・既にtshark.exeを使い慣れており、tsharkのコマンドをそのまま使いたい場合
・パケットキャプチャを実行する端末が、iTest以外の端末の場合


コマンドプロンプトセッションから直接tshark.exeを使用することも可能です。別端末でキャプチャを行いたい場合には、リモート端末へTelnet後、tshark.exeを実行できます


このサンプルでは、インターフェイス番号:3を使用(以下のコマンドでキャプチャするインターフェイスを確認できます)して

hostのIPでキャプチャフィルタしたうえで、UDPポート53(DNS)のみをディスプレイするように指定しています。
また、Advanced Optionでは tshark.exeで使用できる -c -t -r といった追加オプションを指定できますので、ディスプレイするパケット数を10個に限定しています。
Wireshark>show interface
ID | Name                                               | Description
----------------------------------------------------------------------------------------------------------
1  | \Device\NPF_{E394CC28-xxxxxxxxxxxxxxxxxxxxxxxxxxx} | Microsoft
2  | \Device\NPF_{D683A059-xxxxxxxxxxxxxxxxxxxxxxxxxxx} | VMware Virtual Ethernet Adapter
3  | \Device\NPF_{4137AAAD-xxxxxxxxxxxxxxxxxxxxxxxxxxx} | Intel(R) 82579LM Gigabit Network Connection
4  | \Device\NPF_{88279636-xxxxxxxxxxxxxxxxxxxxxxxxxxx} | VMware Virtual Ethernet Adapter

以下のように操作をキャプチャ、リプレイできます。
Spirent Communications Wireshark command interpreter. Copyright (c) 2005 - 2012, The Spirent Communications

Wireshark>capture start
Capture started on interface 3 using d:\Program Files (x86)\Wireshark\tshark.exe...
Capturing on Intel(R) 82579LM Gigabit Network Connection

Wireshark>capture stop
Capture finished, 32 packets captured
Loading ... done
Total of 6 packets loaded

Wireshark>show packets
ID | Time  | Source       | Destination  | Protocol | Info
-----------------------------------------------------------------------------------------------------------
13 | 0.000 | 172.16.64.24 | 8.8.8.8      | dns      | Domain Name System (query)
14 | 0.003 | 8.8.8.8      | 172.16.64.24 | dns      | Domain Name System (response)
15 | 0.005 | 172.16.64.24 | 8.8.8.8      | dns      | Domain Name System (query)
16 | 0.094 | 8.8.8.8      | 172.16.64.24 | dns      | Domain Name System (response)
17 | 0.096 | 172.16.64.24 | 8.8.8.8      | dns      | Domain Name System (query)
18 | 0.181 | 8.8.8.8      | 172.16.64.24 | dns      | Domain Name System (response)

Wireshark>show details 13
Field                         | Value                                    | Description                                      | Raw Value
-----------------------------------------------------------------------------------------------------------------------------
geninfo                       |                                          | General information                              |
   num                        | 13                                       |    Number                                        | d
   len                        | 80                                       |    Frame Length                                  | 50
   caplen                     | 80                                       |    Captured Length                               | 50
   timestamp                  | Nov 29, 2012 12:14:19.730091000          |    Captured Time                                 | 1354158859.730091
frame                         |                                          | Frame 13 (80 bytes on wire, 80 bytes captured)   |
   frame.time                 | Nov 29, 2012 12:14:19.730091000          |    Arrival Time: Nov 29, 2012 12:14:19.730091000 |
   frame.time_delta           | 7.134006000                              |    Time delta from previous captured frame: 7.000|
   frame.time_delta_displayed | 11.130711000                             |    Time delta from previous displayed frame: 1110|
   frame.time_relative        | 11.130711000                             |    Time since reference or first frame: 11.13000 |
   frame.number               | 13                                       |    Frame Number: 13                              |
   frame.len                  | 80                                       |    Frame Length: 80 bytes                        |
   frame.cap_len              | 80                                       |    Capture Length: 80 bytes                      |
   frame.marked               | 0                                        |    Frame is marked: False                        |
   frame.protocols            | eth:ip:udp:dns                           |    Protocols in frame: eth:ip:udp:dns            |
eth
....省略
ip
....省略
udp
.....省略
Wireshark>

6. チャートデータをCSVに変換する

iTestではテスト実行中に任意の数値からグラフィカルなチャートグラフを作成できます。

これはテスト実行中にDUTからカウンターを定期的に取得して、状態の推移を観察する。また、テスト実行結果のログとして保管したりできるものです。

このグラフデータはCSV形式のデータに変換することができますので、別途 Excelで任意のグラフを生成するような使い道もあります。

CSVデータとして保管するには、以下のように操作します。

チャートを選択して、ファイルメニューからExportを選択


ExportのメニューからExport Chart Dataを選択


形式はXMLもしくはCSVとなります。

7. FTPでファイルのアップロード、ダウンロードを実行する

iTestからFTPを行う場合には、コマンドプロンプトセッションからインタラクティブなFTPコマンドは実行できません。

FTPを行うためには、2つの方法があります。

1.いったんローカルホストにTelnetしてからFTPを実行する
2.FTPをバッチ実行する

今回はFTPをバッチ実行する方法を紹介します。

まず、使用するセッションタイプはコマンドプロンプトです。

以下のようなテキストファイルを作成します。例えばファイル名をftpcmd.txtとします。
open 192.168.1.100
user001
user001password
ls
has
bin
get test.pdf
bye
これをバッチ実行するわけですが、以下のコマンドで実行します。


ftp -s:ftpcmd.txt

テストケースは以下のようになります。

======================================================================================
Procedure
======================================================================================
Step	Action	Description
-----------------------------------------------------------------
1.		open	project://my_project/session_profiles/cmd.ffsp
-----------------------------------------------------------------
2.		command	cd c:\\work
-----------------------------------------------------------------
3.		command ftp -s:ftpcmd.txt
-----------------------------------------------------------------
4.		command exit
-----------------------------------------------------------------


コマンドプロンプトセッションでの\は、\でエスケープする必要があるので、ディレクトリパスは、\\となります。

8. Flash(Flex) GUI操作を自動化する

Flex(Flash)のGUアプリケーションを操作するためには、事前に少し準備が必要です。

1. iTestがFlexをフックするためのファイルを準備

Flex SWFファイルが存在するディレクトリと同じディレクトリに以下のファイルを置きます。

・iTestAutomationEnvironment.xml
・iTestFlexWrapper.swf


これらのファイルは、iTestインストールフォルダの中のplugins\com.fnfr.itest.tools.flex.resources_4.2.0.64160\libというフォルダにインストールされています。

デフォルトでは以下のフォルダです。
C:\Program Files (x86)\Spirent Communications\iTest 4.2\plugins\com.fnfr.itest.tools.flex.resources_4.2.0.64160\lib

Flex(Flash)アプリケーションは、HTMLにembedタグで埋め込まれます。

例えば以下のようにHTMLページ内には、<object><>/object<というタグの中に実際に動作させる.SWFファイルが指定されています。

<html>
Flash Test Page
<hr>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 
	codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" 
	width="400" height="200" align="middle">
    <param name="allowScriptAccess" value="sameDomain" />
    <param name="movie" value="http://localhostash/test.swf" />
    <param name="quality" value="autolow" />
    <embed src="test.swf" quality="autolow" width="600" height="600" align="middle" allowScriptAccess="sameDomain" 
    type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</html>

このサンプルはメニューだけが表示されるActionScriptをSWF出力したものですが、ブラウザで表示すると以下のようになります。



さきほどの 1. で準備したファイル、HTMLファイル、SWFファイルを以下のようにWebサーバ上の同じディレクトリに格納します。



2. さて、準備が終わりましたので、iTestからGUI操作をキャプチャしてみます。

iTestにはFlexというセッションタイプがありますが、キャプチャする際には、FlexではなくWebを使用します。

以下のように、Webセッションプロファイルを作成します。



Session Propertiesの一番下にFlexという項目があります。このEnable Support for Flexをチェックします。

これをEnableにすることで、Webから起動したFlexのキャプチャ、リプレイが可能になります。

なお、上記画像には表示されていませんが、URLには、アクセスするURLを指定してください。例)http://serverip/flex/flexsample.html

3. iTestから操作をキャプチャしてみましょう。

以下のように、WebトップページへのアクセスとFlexオブジェクトの操作が記録されています。


9. Global Eventを使ってみる

何かの条件で処理分岐させる場面は良くあると思いますが、通常はAnalysys Ruleを使ってレスポンスデータを解析し、期待値の場合や期待値以外の場合に特別な処理をさせたりします。

ただし、複数のテストケースの色々な場所で、ある条件に合致した場合には、同じ特別な処理をさせるような場合には、影響範囲が記録なるため、数多くのテストケースに対して処理を入れないといけません。

例として、TelnetセッションでDUTに接続しているが、場合によっては1回のTelnet接続だけでは接続できないような場合があるが、2,3回リトライできれば、問題なくTelnet接続できるような状況下では
100本のテストケースすべてに同じ処理を入れるというのは苦痛でしかありません。

このような場面で便利なのが、Global eventです。

Global Eventとは名前の通り、グローバルなイベントに対する制御のしくみです。

グローバルの範囲とは、どこまでなのか?

これは1つのテストケース あるいは 1つのセッションプロファイルが範囲となります。

それでは100本のテストケースに対しては共通のGlobal Eventを使った共通の制御ができないのか?

いいえ。セッションプロファイルを共通化 あるいは 属性の継承をしていれば、1つのセッションプロファイル あるいは 大元のセッションプロファイルを継承したセッションプロファイルを使用する、すべてのテストケースが対象になります。
iTestにはオブジェクトや属性の継承という概念があるため、うまく使えば何らかの変更を1か所に集約できるのです。

さて、さきほどの具体例に戻ってみましょう。
1回のTelnetでセッションがオープンできなかった場合には、3回リトライしたい場合には、
On TerminalOpenConnectionFailというGlobal Eventが使えます

このイベントはTelnetでOpenしようとしたときにセッションがオープンできなかった場合に発生するイベントです。
つまり、1回のTelnetで接続できない場合には、このイベントが発生するので、このイベントが発生したら、リトライしてあげれば良いのです。

以下の画面はセッションプロファイルの下にあるGlobal Eventというタブです。


デフォルト」では
・エラーメッセージを出力
・テストケースをFailとする
・実行を停止する

というイベント発生時に何が行われるのかが登録されています。

ここには自分自身で何がしたいのかを追加できますので、テストケースを停止するアクションを削除して、代わりにリトライするアクションを登録できます。

以下のように、継承(Inherit)というチェックを外して処理を変更できます。この例では5秒間隔で10回リトライさせています。


上の画面上には、DeclareExecutionIssueでエラーメッセージ出力、FailTestが残っていますので、エラーメッセージをWARNINGに変更したり、テストケース実行結果をFailに したくない場合には、これらも変更します。
これで、このセッションプロファイルを継承するセッションプロファイルを使用したすべてのテストケースでは、Telnetが失敗しても一定間隔で、3回リトライしてくれます。

iTestは画面数や設定情報が多いので操作に慣れるまで時間がかかるという声を聞くこともありますが、実はこういった非常に繊細な部分も考慮されているためです。

10. fftz形式のテストレポートを出力する

iTestにはHTML形式やText形式のテストレポートが用意されていますが、これ以外にfftz形式のレポートというのがあります。

HTMLレポートは実行結果が記録されていますが、fftz形式のレポートには、テストケース実行時の各コマンドに対するレスポンスデータ、そのコマンド実行時のDUTのプロンプトなど、極めてテスト実行時に近い形で情報が記録されたレポートファイルなのです。

別のiTestで実行した結果期待通りに動作しなかったような場合には、このiTest上でfftz形式のレポートをファイルにExportしておけば、
別のiTest上で、このfftz形式のレポートをImportすることで、実際に何が起こったのか詳細に追跡できます。

チーム間で結果を参照、管理する場合には、HTMLレポートで十分ですが、別のiTest端末間で何かを追跡するような場合に効果を発揮します。

実際の手順は以下のようになります。

まず、iTest実行画面(Execution)画面 右側の対象レポートをクリックして選択します。(選択したレポートの色が反転します)
次にファイルメニューからExportを選択します。



次にExport画面から、テストレポートをエクスポート(Test Reports as Compressed File)を選択します。


すると、保存場所を聞いてくるので、ワークスペース内の場所を指定します。例えば My Projectを指定します。
My Projectを指定した場合には、My Projectの中に .fftz(拡張子がfftz)のファイルが作成されています。
これがfftz形式のテストレポートとなります。

11. Java Swingを操作

Java GUIアプリケーションには、いくつかの種類があります。

AWT,Swing,SWT,FXというようなキーワードは、Java GUIのライブラリーやフレームワークです。

AWTの後に軽量改良版Swingが登場し、最近ではFXと呼ばれるものが出ています。また、SWTはEclipseでのGUIに代表されるものです。
Windowsメインのビジネスアプリケーションであれば.NETが多いかも知れませんが。

ネットワーク機器や測定機のGUIとして非常に広く使われているのが、Swingです。Windows,Linux,Macどれでも動作して、外観も変わらないので
広く利用されているのではないでしょうか。

また、ブラウザ上で動作するJavaアプリとして、Swingが利用されたりします。

さて、このSwingを操作する場合には、以下のようにセッションプロファイルからSwingを選択し、アプリケーション起動方法を指定します。




この例では、Oracle Java JDKに付属されているサンプルアプリケーションのjarファイルを指定しています。

また、起動方法ではデフォルトのLaunch a jar file or java classを選択しています。
対象アプリケーションが、jarファイルから直接起動できるタイプの場合には、上記の指定をします。

実際に操作をキャプチャしてみましょう。



画面右のキャプチャViewにマウスでの操作と対象GUIコンポーネントがオブジェクトベースで記録されているのがわかります。

起動方法は、JNLP,Custom Application,起動中のアプリに対してなどいくつかありますが、例えばJava Web StartからJLNPファイルを 指定して起動するタイプのものにはJNLPを指定します。
JNLPというのはXMLファイルに起動するアプリ情報などを指定して、起動する方法です。この場合は、起動時に指定するJNLPと呼ばれるファイルがあります。

ここですべては紹介できませんが、起動方法は様々あるので、色んなバリエーションに対応していると思ってください。