我们的测试应该尽可能的表达清晰。不过,我们还想重新使用我们以前的步骤。到目前为止,我们使用过的工具,你可能会得到很长的步骤定义。
Scenario: Logged-in user does something cool.
Given I go to the home page
And I click the login button
And I fill in username:floppy password:banana
And I click "Login"
When I finally do something interesting
Then I'm already too bored to care.
在这种情况下,我们可能有一个测试用例(可能是几个),它实际上是用来表达用户如何与登录表单交互的。在这里,我们得到了登录顺序的步骤定义。然而,当登录表单有意义时,这些步骤就非常多余。我们真的希望能够在不重复我们的步骤定义的情况下定义这样的东西。
Scenario: Logged-in user does something cool.
Given I am logged in
When I do something interesting
Then The world becomes a better place
Lettuce提供了这样一种方式,可以用一组助手来匹配每一个给定的语法术语-Given,When和Then。你可以像这样完成以上的工作。
@step('I am logged in')
def is_logged_in(step):
step.given('I go to the home page')
step.given('I click the login button')
# ... and so on.
步骤执行块
有时甚至直接从特性规范复制粘贴,去描述步骤执行块。使用step.behave_as方法,然后用str.format动态填写参数。例如,我们可以这样写上面的步骤定义:
@step('I am logged in')
def is_logged_in(step):
step.behave_as("""
Given I go to the home page
And I click the login button
And I fill in username:{user} password:{pass}
And I click "Login"
""".format(user='floppy', pass='banana'))
这可以与步骤参数捕获相结合,使表达更清晰和避免代码重复。