行为驱动开发,BDD 工具还是值得一玩的。现在用 python 多一些,就说说 python 的 BDD 工具—— Behave 的一个槽点吧。
下面是一个 feature 文件的例子,
Feature: Query for ticket
Scenario Outline: Query by station
Given the user visit the index page
When the user enter <from_station>
And the user enter <to_station>
And the user submit
Then the list will be appeared
Examples:
| from_station | to_station |
| shanghai | beijing |
| beijing | shanghai |
加粗的两行就是出错的地方。因为 feature 文件是自然语言描述场景的,这样看不觉得有问题。但是在用 python 进行 step definition 的时候,就会这样:
@when('the user enter {from_station}')
def enter_from_station_name(context, from_station):
pass
@when('the user enter {to_station}')
def enter_to_station_name(context, to_station):
pass
虽然这两个 function 的名字是不同的,但是因为“@when”中定义的步骤相同,即便有变量名 {from_station} {to_station} 的区别,behave 还是会报错:
behave.step_registry.AmbiguousStep: @when('the user enter {to_station}') has already been defined in
existing step @when('the user enter {from_station}')
这算是一个小 trick 吧~ 为了解决这个问题,我只得把步骤描述调整了一下,比如“the user enter <from_station> firstly”。