メインコンテンツまでスキップ

Eggplant Functionalによるデータ駆動型テスト

データ駆動型のテストアプローチは、テストデータのセットを使用した繰り返しテストを効率的に、簡単に管理する方法を提供します。Eggplant FunctionalとSenseTalkは、データ駆動型テストを簡単に行うさまざまな機能を含んでいます。

Eggplant Functionalは、プレーンテキストファイル、Microsoft Excelファイル、データベースなどのさまざまなデータソースからのテストデータの使用をサポートし、SenseTalkには、データにアクセスし、操作し、解析するためのコマンドと関数が含まれています。この記事では、スクリプトにデータ駆動型テストを組み込むためにEggplant Functionalをどのように使用するかを示します。

また、Eggplant FunctionalのTables機能を使用し、テーブルテストにデータファイルを関連付けることによってデータ駆動型テストを実行することもできます。

キーワード駆動型フレームワークを作成するためにデータファイルを使用する方法については、カスタムキーワード駆動型フレームワークの作成を参照してください。

データ駆動型テストとは何ですか?

データ駆動型テストとは、外部データセットをテスト入力として使用する概念です。テストでは、入力データをさまざまな方法で使用することがあります。たとえば、テスト対象のアプリケーションのフォームに入力されるテキストを指定したり、表示される値を期待される値と比較して検証したり、テスト定数のセットを確立したりします。

テストは、データソースからデータを受け取ることができるように、パラメータ化を使用して一般的に記述されます。テストが使用するデータは、元のデータソースを手動で編集する、テストを新しいデータソースに向ける、データソースへの更新を自動化することにより変更することができます。

以下のデータソースへの接続に関するセクションでは、サンプルのSenseTalkコードがデータ駆動型テストのための外部データの使用例を示しています。

データソース

自動化で使用するテストデータを含むデータソースは、データ駆動型テストに必要です。Eggplant Functionalは以下のタイプのデータソースをサポートしています:

使用するデータソースは、SenseTalkをどのように使用してデータソースにアクセスし、データを解析するかを決定します。

データソースの保管

プレーンテキストまたはExcelのデータソースを使用する場合、ファイルはEggplant Functionalマシンのローカルファイルシステムにアクセス可能でなければなりません。これにはネットワーク化されたドライブや共有ドライブも含まれます。

ノート

Eggplant FunctionalをWindowsで使用している場合、共有ドライブは文字にマップされている必要があります(例:D:\)。UNCパスはサポートされていません。

スイートのResources paneは、スイート内にプレーンテキストとExcelのデータファイルを保管するための簡単な方法を提供します。その後、ResourcePath()関数を使用してスクリプトからこれらのファイルを簡単に参照することができます。

データベースの場合、Eggplant Functionalとデータベースとの間の通信は、Eggplant Functionalマシンに設定されたODBC Administratorによって管理されます。

プレーンテキストファイルとのインタラクション

Eggplant Functionalを使用してデータ駆動型テスト戦略を実装するための最も簡単な方法は、プレーンテキストファイルを使用することです。

ファイルアクセス

プレーンテキストファイルの内容にアクセスする背景については、File and Folder InteractionおよびAccessing a File as a Containerのドキュメンテーションを参照してください。

プレーンテキストファイルの内容にアクセスするとき、open fileおよびclose fileコマンドを使用することは必要ありません。ただし、ファイルに対して多数の高速な読み書きイベントを行っている場合は、open fileおよびclose fileコマンドの使用が推奨されます。データ駆動型テストのほとんどのケースでは、ファイルは一度だけ、または稀にアクセスされるため、これらのコマンドは必要ありません。

プレーンテキストファイルと対話する最も簡単な方法は、putまたはsetコマンドを使用してファイルをコンテナとしてアクセスすることです。ファイルを参照するときは、ファイル拡張子(例:.txt、.csv)を含めてください。例えば:

Set MyPrices to file ResourcePath("prices.txt") -- データファイルはスイートのリソースに保存されています
Set MyProducts to file "C:\Users\Carrie\Desktop\products.csv" -- データファイルはEggplantマシンの他の場所に保存されています

chunk expressionsを使用して、ファイル内容の一部をコンテナとしてアクセスすることができます。例えば:

Set MyPrice to line 3 of file ResourcePath("prices.txt")

ファイル内容の解析

プレーンテキストファイルの内容をパースするためのSenseTalkメソッドは、データがCSV形式であるかそれ以外の形式であるかによります。

CSV形式のファイル

ヘッダー行を含むCSV形式に従うプレーンテキストファイルの場合、CSVValue() Functionは、ファイルの内容を操作するための最も簡単な方法を提供します。これはヘッダー行を自動的にパースするためです。SenseTalkスクリプト内でヘッダー名に基づいてデータにアクセスするためにCSVValue()を使用することができます。

CSV形式に従う基本的なプレーンテキストファイルであるLoginCredentials.csvの内容は次のようになる可能性があります:

username,password
admin,adminpass
user,userpass

CSVValue()は、ファイルのCSV形式の内容をproperty listslistに変換します。ここで、内容のヘッダー行はプロパティ名を指定するために使用され、その後の行はプロパティ値を指定するために使用されます。ヘッダーの下の各行は、プロパティリストのリスト内に独自のプロパティリストを持っています。

put CSVValue(file resourcePath("LoginCredentials.csv"))

次のプロパティリストのリストを作成します:

((password:"adminpass", username:"admin"),(password:"userpass", username:"user"))

プロパティ値は、ヘッダー、またはプロパティ名と一緒に所有形を使用するなど、さまざまな方法でアクセスすることができます:

Set Credentials to CSVValue(file resourcePath("LoginCredentials.csv"))
Log the first item of Credentials -- ログ '(password:"adminpass", username:"admin")'

個々のプロパティリストはlist item chunk typeを使用してアクセスすることができます:

Set FirstLogin to the first item of CSVValue(file resourcePath("LoginCredentials.csv"))
Log FirstLogin's password -- ログ 'adminpass'

repeat with eachを使用してリスト内の項目に基づいて繰り返しを行い、プロパティにアクセスします:

Set Credentials to CSVValue(file resourcePath("LoginCredentials.csv"))
repeat with each item CredentialSet of Credentials
Set Username to CredentialSet's username
Set Password to CredentialSet's password
Click "UsernameField"
TypeText Username
Click "PasswordField"
TypeText Password
end repeat

CSV形式以外のファイル

以下のSmokeTest.txtの例のようなプレーンテキストファイルも、lines and text itemチャンクタイプに基づいてパースすることができます。

TestName,Smoke
RemoteWorkInterval,.3
MouseClickDelay,.1
ImageUpdate,auto

デフォルトのthe lineDelimiterおよびthe wordDelimiterローカルプロパティの値によれば、SenseTalkはこのファイルを4行あり、各行に2つのテキストアイテムがあると見ています。これらはカンマで区切られています。チャンク表現を使用して個々の行やテキストアイテムにアクセスすることができます。例えば:

log the first item of line 3 of file resourcePath("smoketest.txt") -- ログ 'MouseClickDelay'

ファイルの内容全体を繰り返し処理できるように、通常は代わりにコンテナが繰り返しループでパースされます。repeat with each繰り返しループは、行のようなチャンクに基づいてファイルを簡単に繰り返し処理することを可能にします。例えば:

set SmokeTest to file ResourcePath("SmokeTest.txt")
repeat with each line myline of SmokeTest
log myline
end repeat

繰り返しループを使用して、ファイルの各行からテキストアイテムにアクセスすることができます:

set SmokeTest to file resourcePath("smoketest.txt")
repeat with each line myLine of line 2 to -1 of SmokeTest -- ファイルの2行目から始めて最後の行まで繰り返し処理します
set SettingName to the first item of myLine
set SettingValue to the second item of myLine
Set the (SettingName) to SettingValue -- Eggplantのグローバルプロパティ値を、ファイルの現在の行で指定されたグロルプロパティ名と値に基づいて設定します
end repeat

Excelファイルとのインタラクション

Microsoft Excelファイルはデータの保存に非常に柔軟性と拡張性があるため、データ駆動型のテストシナリオに適しています。

ファイルアクセス

Excel(.xlsx)ファイルは、スイートのResources paneに保存するか、またはEggplant Functionalマシンのファイルシステムの他の場所に保存することができます。

Excelファイルには2つの方法でアクセスできます:

選択した方法によって、取得したExcelファイルの内容の形式が変わり、したがってSenseTalkを使用して内容をパースする方法が変わります。

Excelファイルの内容の例は以下のとおりです:

An example of an Excel data file with a header row and two rows of data

ファイルの内容にデータベースとしてアクセスするには、次のようなコードを使用します:

set myExcelDB to (type: "excel", file: ResourcePath("LoginCredentials.xlsx"))
Set Credentials to the records of myExcelDB

レコードは、リストプロパティリストの形式で返されます:

((password:"adminpass", username:"admin"),(password:"userpass", username:"user"))

Excelファイルのヘッダー行がプロパティ名(パスワードとユーザ名)を決定する方法に注意してください。

whereを使用して、Excelファイルから収集するレコードを制限することができます:

Set Credentials to the records of myExcelDB where "username" is "admin" -- プロパティリストのリスト ((password:"adminpass", username:"admin")) をCredentialsに格納する

Excelファイルの内容をExcelファイルとしてアクセスするためには、次のようなコードを使用します。workBook()workSheet()、およびcellRange()関数を組み合わせて使用します:

set Credentials to WorkBook(ResourcePath("LoginCredentials.xlsx"))
set myCredentials to Credentials.Worksheet("LoginSet")
set CredentialList to cellRange("A:B") of myCredentials
log CredentialList

行はnested listとも呼ばれるlist of listsの形で返されます:

((username,password),(admin,adminpass),(user,userpass)).

ヘッダー行がリストの最初のアイテムとして返される内容に含まれていることに注意してください。

ファイル内容の解析:データベースとしてのExcel

Excelファイルをデータベースとして接続すると、返されたレコードのリスト内での位置に基づいて特定のレコードにアクセスしたり、プロパティ名に基づいて個々の列値にアクセスしたりすることができます:

set myExcelDB to (type: "excel", file: ResourcePath("LoginCredentials.xlsx"))
set Credentials to the records of myExcelDB
set secondRecord to the second item of Credentials
log secondRecord's password -- 'userpass'をログに記録

repeat with eachを使用して、リストのアイテムに基づいて反復処理を行い、プロパティにアクセスします:

set myExcelDB to (type: "excel", file: ResourcePath("LoginCredentials.xlsx"))
set Credentials to the records of myExcelDB
repeat with each item CredentialSet of Credentials
Set Username to CredentialSet's username
Set Password to CredentialSet's password
Click "UsernameField"
TypeText Username
Click "PasswordField"
TypeText Password
end repeat

ファイル内容の解析:ExcelファイルとしてのExcel

Excelファイルを直接Excelファイルとして開く場合、返された行のリスト内での位置に基づいて特定の行にアクセスし、特定の行を表すリスト内の位置に基づいて行の特定のセルからの値もアクセスすることができます:

set Credentials to WorkBook(ResourcePath("LoginCredentials.xlsx"))
set myCredentials to Credentials.Worksheet("LoginSet")
set CredentialList to cellRange("A:B") of myCredentials
Set secondRecord to the third item of CredentialList
Log the second item of secondRecord -- 'userpass'をログに記録

repeat with eachを使用して、ネストされたリストのアイテムに基づいて繰り返します。

set CredentialList to cellRange("A:B") of myCredentials
repeat with each item CredentialSet of item 2 to -1 of CredentialList
set Username to the first item of CredentialSet
set Password to the second item of CredentialSet
Click "UsernameField"
TypeText Username
Click "PasswordField"
TypeText Password
end repeat

ODBCデータベース統合

SenseTalkを使用して、データ駆動型のテストのためにOpen Database Connection(ODBC)データベースにアクセスすることができます。データベースとのやり取りについての背景情報は、データベースとの作業を参照してください。ODBCデータベースとのやり取りについての詳しい情報は、ODBC 管理を参照してください。

データベースアクセス

Eggplant Functionalは、ODBC管理者を通じて、複数のデータベースと連携するために通信します。

以下は、logincredentialsという名前のデータベーステーブルの例です:

ヘッダ行と2つのデータ行を持つODBCデータベースファイルの例

特定のデータベーステーブルのレコードにアクセスするには、データベース接続を使用します:

set myDB to (type:"odbc", DSN:"mySQLDB", user:"root", password:"eggPlant")
set Credentials to table "logincredentials" of myDB
set CredentialList to the records of Credentials -- 変数CredentialListにテーブルからすべてのレコードを格納する

レコードは、listproperty listsの形式で返されます:

((password:"adminpass", username:"admin"),(password:"userpass", username:"user"))

whereを使用して、データベーステーブルから収集するレコードを限定できます:

set CredentialList to the records of Credentials where "password" contains "admin" -- '((password:"adminpass", username:"admin"))'を変数CredentialListに格納する

ファイル内容のパース

データベース接続では、返されたレコードのリストの位置に基づいて特定のレコードにアクセスし、プロパティ名に基づいて個々の列の値にアクセスします:

set myDB to (type:"odbc", DSN:"mySQLDB", user:"root", password:"eggPlant")
set Credentials to table "logincredentials" of myDB
Set CredentialList to the records of Credentials
set firstRecord to the first item of CredentialList
log firstRecord's username -- 'admin'をログに入れる

repeat with eachを使用して、リスト内のアイテムに基づいて繰り返し処理を行い、プロパティにアクセスします:

Set CredentialList to the records of Credentials
repeat with each item CredentialSet of CredentialList
Set Username to CredentialSet's username
Set Password to CredentialSet's password
Click "UsernameField"
TypeText Username
Click "PasswordField"
TypeText Password
end repeat

データ駆動型テスト:ユースケース例

ここにあるスクリプトは、ウェブブラウザでGoogle Financeのページを開き、様々な会社のティッカーシンボルを使用して検索し、その後OCRを使用してその会社の株価を読み取り、スクリプトの変数に格納するために連携して動作します。

メインスクリプトは、以下のデータをCSV形式で含むデータファイルを参照しています:

TickerSymbol,CompanyName
GOOG,Google
AAPL,Apple
RTN,Raytheon
FB,Facebook
F,Ford
UAL,United

メインスクリプト:DataDrivenTest.script

// Google Financeのページに移動するスクリプトを実行する OpenGoogleFinance

// データファイルを変数にロードする
set datafile to CSVValue(file resourcePath("tickersymbols.csv")) // データを変数'datafile'にロードする

// 各会社のティッカーシンボルを検索し、価格を出力のためにログに記録する
datafileの各Tickerで繰り返す // ヘッダ行をスキップして2行目から開始
DoubleClick global FinanceButton
TypeText Ticker's TickerSymbol // ティッカーシンボルを入力
Click "Magnifying Glass" // 検索を実行
WaitFor 10.0, "Refresh"
WaitFor 10.0, text: Ticker's CompanyName // OCRを使用して、シンボルを検索するときに予想される会社名が表示されることを確認
Put ReadText("Top Left", "Bottom Right", validcharacters: "1234567890.") into Price // OCRを使用して現在の株価を読み取る
Put Ticker's CompanyName && Price & return after output // 出力に会社名と価格を使用
End Repeat

// ブラウザを閉じる
Click "CloseBroswer"

// outputの内容をログに記録
Log output

呼び出しスクリプト: OpenGoogleFinance.script

このスクリプトは、Google Financeのページを開き、ティッカーシンボルの検索中に使用する検索ボックスの座標を収集します。

// ファイナンスページに移動
DoubleClick "ChromeIcon"
WaitFor 30.0, "LuckyButton"
Click "More"
Click "Finance"

// Googleの検索を繰り返すための検索ボックスの座標を収集
WaitFor 30.0, "SearchFinance"
Put FoundImageLocation() into global FinanceButton