我正在尝试使用Python的behave library在一堆分隔的文本文件上编写一些BDD / Gherkin样式测试。
典型情况如下:
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
步骤之间传递一行,并在下一行的第一个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
答案 0 :(得分:0)
Dirk,你可以考虑编写一个脚本来生成场景大纲(给定csv文件)。这样您就可以依赖标准的行为/小黄瓜功能。保持尽可能简单,因为它引入了另一个可能出错的地方。然而,它简化了您的步骤文件,因此您可以专注于实际的功能测试,而不是阅读csv文件的机制。根据数据集的大小,您可能还会遇到内存限制,因为我认为表只保留在内存中。不是一个很好的解决方案,而是“另类”。
答案 1 :(得分:-2)
为了实现我的场景的一般循环 - 我已经完成了如下所示。当然,您必须编写步骤定义,这可能就像拥有日志条目一样简单。
@test
Scenario Outline: Repeat Step in Loop
Given we repeat the same test X times
When we do something
Then we analyze results
Examples: Iteration
| X |
| 1 |
| 2 |
| 3 |
欢迎更好的方式。迭代不是编程的,必须进行硬编码(生成该示例表的小脚本)