私はPythonのbehave libraryを使用して、いくつかのBDD/Gherkinスタイルのテストを区切られたテキストファイルに書き込もうとしています。一般的なPythonの動作またはBDDシナリオでの反復/ループの処理方法
典型的なシナリオは次のようになります。
Scenario: Check delivery files for illegal values
Given a file system path to the delivery folder
When I open each file and read its values
Then all values in the "foo" column are smaller than 1
And all values in the "fizz" column are larger than 2
そこにたくさんのファイルがあり、各ファイルは、行の多くが含まれているため、シナリオ概要にそれらのすべてをハードコーディングする可能性がありません。さらに、一度にファイル全体をメモリに読み込むのではなく、ジェネレータを使用して行を1つずつ反復することを避けたいと思います。
私は以下を試みました。しかし、大規模なデータセットや大量の条件では、各行が何度も何度も繰り返されるため、非常に効率的ではありません。複数のthen
ステップの間に1つの行を渡し、次の行の最初のthen
ステップで再び開始する可能性はありますか?
また、BDD/Gherkinはこの種のテストには適していませんか?代わりになるものは何ですか?
import csv
import itertools
import os
@given('a file system path to the delivery folder')
def step(context):
context.path = '/path/to/delivery/files'
@when('I open each file and read its values')
def step(context):
file_list = os.listdir(context.path)
def row_generator():
for path in file_list:
with open(path, 'rb') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
yield row
context.row_generator = row_generator
# itertools.tee forks off the row generator so it can be used multiple times instead of being exhausted after the first 'then' step
@then('all values in the "foo" column are smaller than 1')
def step(context):
for row in itertools.tee(context.row_generator(), 1)[0]:
assert row['foo'] < 1
@then('all values in the "bar" column are larger than 2')
def step(context):
for row in itertools.tee(context.row_generator(), 1)[0]:
assert row['bar'] > 2
OPは質問に「ファイルがたくさんあり、各ファイルに多数の行が含まれているため、それらをすべてシナリオ概要にハードコードする可能性があります**。 (重点が追加されました) – Louis