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

ダイナミックデータ生成

スクリプトを書きながらデータを動的に生成したいと思ったことはありませんか? もっと多くのデータを使用したいと思ったことはありませんか?

テストを作成するときには、事前に指定されたデータセットが与えられることがよくあります。しかし、ランダムなテストを行うために、あるいはスクリプト内からテストを駆動するために、進行中にデータを作成すると便利なことがあります。これにより、外部ファイルを使用する代わりにスクリプト内からテストを駆動することができます。

ダイナミックコンテンツ生成の応用例は多岐にわたります。たとえば、フォームに対するテストのために電子メールアドレスを動的に生成することができます。あるいは、Eggplant Functionalマシン上でファイルを動的に作成し、テストを行う際にそのファイルからデータを引き出すこともできます。この記事では、これらのシナリオの両方をカバーします。

スクリプト内の動的要素の使用; データ生成と動的変数作成

スクリプト内でデータコンテンツを動的に生成する方法はいくつかあります。その一つはAnyを使用する方法です。もう一つはRandom()関数を使用する方法です。これらはスクリプトでランダム化テストを行ったり、データ駆動型テストを行ったりする際の最も一般的なアプローチとなります。以下の例では、これらの両方がカバーされています。

Anyの使用

Anyは、既存のリストや範囲からランダムにデータを選択することを可能にするチャンク式です。例えば、1から20までの範囲の数字を変数に格納し、Anyを使用してその数字の一つを選択する場合、コードは次のようになります。

例:

put 1..20 into NumberRange
Log any item of NumberRange

ログされる数字は1から20の間の任意の数字で、スクリプトが実行時にランダムに選択します。以下は、このアプローチを使用したより詳細な例です。

例:

#これはランダムな5文字の名前の空のファイルを作成します。この方法は、さまざまなタイプのファイルの命名に適応できます。#
Put "~/Temp/" into Path -- ファイルパスを指定する

put a..z as list into alphas -- 文字の範囲を作成する
put 1..5 as list into nums -- 数字の範囲を作成する

put (any item of alphas for each item of nums) joined by empty into Name -- anyを使用して名前を動的に作成する。これは最初にリストを作成しますが、リストのアイテムを空で結合します。これによりリストアイテムから文字列が作成され、その文字列が変数Nameに格納されます。

put path & Name into filePath -- パスと名前を完全に組み立てたファイルパスに格納する
put filePath & ".txt" into myFile -- ファイル拡張子付きのファイルを組み立てる
if there is not a file myFile then -- ファイルを作成する前に、そのファイルが既に存在しないことを確認する
create file myFile -- ファイルを作成する
log "Created file " & myFile -- ファイルが作成されたこととその完全なパスをメッセージとしてログに記録する
end if

Anyコマンドを使用してデータを作成すると、すべての内容がランダムに選択されるため、データ自体がランダムになります。先ほど述べたように、このランダム化は既存の情報の基から作成されます。では、さまざまな要素があり、それらがすべて可変で、より大きなデータストリングに組み立てる必要がある場合はどうすればよいでしょうか?

これの一例として、動的なメールアドレスの生成があります。この場合、メールアドレスには4つの要素があり、そのうち3つが変動します。メールアドレスの最初の部分、これを「名前」と呼ぶことにしましょう。次に、「@」記号があり、それに続いても同じく動的なドメイン名があります。最後に、「.com」、「.net」、「.org」のいずれかのエンドを選びます。

例:

insert (".com",".net",".org") into ListOfEnds
set Part1 to (any item of a..z for each item of 1..6) joined by empty -- ランダムな最初の半分を作成する
set Part2 to (any item of 1..9 for each item of 1..6) joined by empty -- ランダムな後半部分を作成する
set EmailEnd to any item of ListOfEnds -- ランダムな終了を選ぶ
put Part1 & "@" & Part2 & EmailEnd into DynamicAddress -- メールアドレスを作成する
Log DynamicAddress -- 動的に作成されたメールアドレスをログに記録する

上記の例で見ることができるように、Anyを使用して3つの異なる部分がランダムに選ばれ、それらがアンパサンドで連結され、最終的な変数に格納されて後で使用されます。これは、必要に応じてログイン画面のユーザー名フィールドに直接入力することも可能です。TypeTextを使用します。

Random()の使用

このテクニックは、ランダムな顧客データの外部ファイルを動的に生成するより大きなスクリプトに組み込むことができます。上記のランダムなメールアドレスを生成するスクリプトをハンドラに変換し、他のハンドラを作成して顧客の名前とID番号を動的に生成することができます。その後、スクリプトはこれらの他のハンドラを呼び出してデータを生成し、これらの呼び出されたコード部分が返す情報を整理し、ローカルのEggplant Functionalシステムのファイルに書き出すことができます。

//--ファイルには、スクリプト実行中に動的に生成される顧客ID番号の列、顧客名の列、メールアドレスの列が含まれます--\\

// ランダムなファイル内容を作成する

Put 20 into numberofRecords -- 作成するレコードの数を定義する

Repeat numberofRecords times -- ファイルに行を作成する回数を繰り返す

// ハンドラを呼び出して顧客IDを作成する
put createID() & comma into Row

// ハンドラを呼び出して顧客名を作成する
put createName() & comma after Row

// ハンドラを呼び出して顧客のメールを作成する
put createEmail() after Row

// 行をファイルに追加する
put row & return after FileContents
end repeat

// ファイルを作成し、作成した内容を格納する

Put "~/Temp/CustomerEmail.txt" into myFile -- Eggplantシステム上でファイルが作成される場所を指定する

put "ID,Name,Email" & return into HeaderRow -- ファイルのヘッダー行を作成する

put HeaderRow before FileContents -- 既に作成された内容の前にヘッダー行を挿入する

put fileContents into file myFile -- Eggplantシステム上のファイルに内容を挿入する

//FUNCTIONS AND HANDLERS GO AT THE BOTTOM OF THE SCRIPT\\

// 顧客IDを作成する

to createID
put random(100000,999999) into customerID -- ランダム関数を使用してIDの数字を作成する
put "-" after character 2 of customerID -- ダッシュを挿入してIDを正しい形式にする
returncustomerID -- 新しく作成された顧客IDを呼び出し元のハンドラに返す
end createID

// ファイル用のランダムな名前を生成する

to createName
put a..z into Letters -- アルファベットを範囲を使って変数に格納する
put random(5,10) into NewNameLength -- ランダム関数を使って名前の長さをランダムに選ぶ
// 新しい顧客名の各文字ごとに繰り返す
put any item of letters after NewName -- ランダムな文字を使用して新しい名前を作成する
end repeat
returnCapitalized(NewName) -- 新しい顧客名を大文字にして、呼び出し元のハンドラに返す
end createName

// ランダムなメールアドレスを動的に作成する

to createEmail
insert(".com",".net",".org") into ListOfEnds
set Part1 to (any item of a..z for each item of 1..6) joined by empty -- ランダムな最初の半分を作成する
set Part2 to (any item of 1..9 for each item of 1..6) joined by empty -- ランダムな二番目の半分を作成する
set EmailEnd to any item of ListOfEnds -- ランダムなエンディングを選択する
put Part1&"@"&Part2&EmailEnd into DynamicAddress -- メールアドレスをコンパイルする
Return DynamicAddress -- アドレスを呼び出し元のハンドラに返す
end createEmail

スクリプトのメイン部分は、ハンドラ(これらも別のスクリプトにしてサブスクリプトとして呼び出すこともできます)を呼び出すリピートループで構成されています。このループは任意の回数繰り返され、その回数は顧客レコードの希望数を指定する変数によって定義されます。

例:

// ファイルが作成されるEggplant Functionalシステム上の場所を指定する
Put "~/Temp/CustomerData.txt" into myFile
// 作成するレコードの数を定義する
Put 20 into numberofRecords
// ファイルの内容をランダムに作成する
Repeat numberofRecords times -- ファイルに行を作成する回数を繰り返す
// ハンドラを呼び出して顧客IDを作成する
put createID() & comma into Row
// ハンドラを呼び出して顧客名を作成する
put createName() & comma after Row
// ハンドラを呼び出して顧客のメールを作成する
put createEmail() after Row
// 行をファイルに追加する
put row & return after FileContents
end repeat

名前の作成とIDの作成のハンドラの両方は random() 関数を使用します。random()関数は1つまたは2つの数値をパラメータとして取り、指定された数値あるいは指定された2つの数値の間の数値を生成します。

例:

//顧客IDを作成する
to createID
put random(100000,999999) into customerID -- ランダム関数を使用してIDの数字を作成する
put "-" after character 2 of customerID -- ダッシュを挿入してIDを正しい形式にする
return customerID -- 新しく作成された顧客IDを呼び出し元のハンドラに返す
end createID

// ファイル用のランダムな名前を生成する
to createName
put a..z into Letters -- アルファベットを範囲を使用して変数に格納する
put random(5,10) into NewNameLength -- ランダム関数を使用して名前の長さをランダムに選択する
repeat newNameLength times -- 新しい顧客名の各文字ごとに繰り返す
put any item of letters after NewName -- ランダムな文字を使用して新しい名前を作成する
end repeat
return Capitalized(NewName) -- 新しい顧客名を大文字にして、呼び出し元のハンドラに返す
end createName

最後に、すべてが生成された後、作成された内容がファイルに書き出され、ファイルが以前に存在しなかった場合はファイルを作成し、以前に存在したデータがあった場合はそれを上書きします。

例:

// ファイルを作成し、作成した内容をそれに保存する
put "ID,Name,Email" & return into HeaderRow -- ファイルのヘッダ行を作成する
put HeaderRow before FileContents -- 以前に作成した内容の前にヘッダ行を挿入する
put fileContents into file myFile -- Eggplant Functionalシステム上のファイルに内容を挿入します