在Python的库中,我可以编写一个带有参数化场景大纲的特征文件(改编自behave):
# feature file
Feature: Scenario Outline Example
Scenario Outline: Use Blender with <thing>
Given I put "<thing>" in a blender
When I switch the blender on
Then it should transform into "<other thing>"
Examples: Amphibians
| thing | other thing |
| Red Tree Frog | mush |
| apples | apple juice |
相应的步骤定义如下所示:
# steps file
from behave import given, when, then
from hamcrest import assert_that, equal_to
from blender import Blender
@given('I put "{thing}" in a blender')
def step_given_put_thing_into_blender(context, thing):
context.blender = Blender()
context.blender.add(thing)
@when('I switch the blender on')
def step_when_switch_blender_on(context):
context.blender.switch_on()
@then('it should transform into "{other_thing}"')
def step_then_should_transform_into(context, other_thing):
assert_that(context.blender.result, equal_to(other_thing))
可以看出,将参数从特征文件传递到步骤函数的方法是
但是,如果有一个包含大量列的更大的示例表,这会很快写入和读取:
# feature file
Feature: Large Table Example
Scenario Outline: Use Blender with a lot of things
Given I put "<first_thing>", "<second_thing>", "<third_thing>", "<fourth_thing>", "<fifth_thing>", "<sixth_thing>", "<seventh_thing>" in a blender
When I switch the blender on
Then it should transform into "<other thing>"
Examples: Things
| first thing | second thing | third thing | fourth thing | fifth thing | sixth thing | seventh thing |
| a | b | c | d | e | f | g | h |
| i | j | k | l | m | n | o | p |
# steps file
@given('I put "{first_thing}", "{second_thing}", "{third_thing}", "{fourth_thing}", "{fifth_thing}", "{sixth_thing}", "{seventh_thing}", in a blender')
def step_given_put_thing_into_blender(context, first_thing, second_thing, third_thing, fourth_thing, fifth_thing, sixth_thing, seventh_thing):
context.blender = Blender()
context.blender.add(thing)
...
我认为这一点很清楚。是否有可能将示例从大表转移到步骤定义中而不必明确提及所有这些示例?例如,它们是否保存在上下文变量的某个地方,即使没有在文本中提及它们(在那里找不到它们)?
答案 0 :(得分:1)
除了考虑是否真的需要使用大型场景大纲表(参见其他答案)之外,确实可以访问当前表行而不通过{{明确提及给定/ when / then步骤中的所有参数1}} (which is a bit hidden in the appendix of the documentation)。
context.active_outline
返回一个behave.model.row对象,可以通过以下方式访问该对象:
context.active_outline
返回表标题的列表,无论当前迭代的行是什么( first_thing , second_thing 等等,在问题的示例中)context.active_outline.headings
返回当前迭代行( a , b , c 等)的单元格值列表来自问题的例子)context.active_outline.cells
,返回第一列的单元格值(无论标题)等。context.active_outline[0]
)会返回带有 first_thing 标题的列的单元格值,无论其索引是什么作为context.active_outline['first_thing']
和context.active_outline.headings
返回列表,还可以执行有用的内容,例如context.active_outline.cells
来迭代标题 - 值对等。
答案 1 :(得分:0)
重点很明确。
问问自己为什么真的需要所有这些变量?
您是否尝试在一个场景大纲中做太多事情?是否可以将问题分成两部分?
如果您刚刚实施其中一个,即跳过大纲,情况会怎样?会不会很大而且很麻烦?
不幸的是,我不认为你的问题是有很多参数要提。您的问题是您尝试使用太多参数。从我坐的地方看,你似乎想要做太多。遗憾。