我正在嘗試使用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
由於有大量的文件和每個文件都包含大量的行,有沒有可能硬編碼個個成一個方案概述。此外,我想避免一次性將整個文件讀入內存,而是使用生成器逐一遍歷行。
我嘗試了以下。但是,對於大數據集和大量條件來說,這是非常低效的,因爲每個步驟都會一遍一遍讀取每行。是否有可能在多個then
步驟之間傳遞單個行,並在下一行的第一個步驟then
處再次啓動?
或者是BDD /小黃瓜不適合這種類型的測試?有什麼可以替代的?
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