Automated tests 为什么后台的步骤不能与Behat中的示例相结合

Automated tests 为什么后台的步骤不能与Behat中的示例相结合,automated-tests,bdd,behat,mink,gherkin,Automated Tests,Bdd,Behat,Mink,Gherkin,背景中的步骤不能与示例相结合。这是Behat的限制吗 我有以下功能文件 Background: Given I have the login Page When I login to the application using "<username>" Then the list is displayed When I select an item from the list Then I am take

背景中的步骤不能与示例相结合。这是Behat的限制吗

我有以下功能文件

Background:
        Given I have the login Page
        When I login to the application using "<username>"
        Then the list is displayed
        When I select an item from the list
        Then I am taken to the Dashboard
        When I navigate to the Overview Page
        Then the Overview Page is displayed

@javascript @frontend @devlocal
Scenario Outline: To verify the Overview page content   
        Then overview page main headings are displayed
Examples:
        | username  | role          |
        | RoleUser  | ROLE_USER     |       
        | RoleAdmn  | ROLE_ADMIN    |
背景:
假设我有登录页面
当我使用“”登录到应用程序时
然后显示列表
当我从列表中选择一个项目时
然后我被带到仪表板
当我导航到概览页面时
然后显示概览页面
@javascript@frontend@devlocal
场景大纲:验证概览页面内容
然后显示概览页面的主标题
示例:
|用户名|角色|
|RoleUser |角色|用户|
|角色管理|
这将产生以下错误: [Behat\Gherkin\Exception\ParserException]
预期的注释、场景、大纲或步骤标记,但在文件:/var/Features/Overview.feature的第15行有示例

我之所以在“后台”中有这么多步骤,是因为这是进入页面的逻辑流程。我有几个使用这些步骤的场景

对于这个问题,我确实有一个有效的解决方案,即使用“场景”中“背景”中的所有步骤。这绝对行得通。然而,我有5个不同的场景来实现这个功能,如果我在所有5个场景中复制和粘贴相同的步骤,它看起来绝对混乱和麻烦。 我认为这是我们使用背景部分的主要原因

以下是我目前正在使用的:

背景: 假设我有登录页面

@javascript @frontend @devlocal
Scenario: To verify the Overview page content   
        When I login to the application using "<username>"
        Then the list is displayed
        When I select an item from the list
        Then I am taken to the Dashboard
        When I navigate to the Overview Page
        Then the Overview Page is displayed
        Then overview page main headings are displayed
Examples:
        | username  | role          |
        | RoleUser  | ROLE_USER     |       
        | RoleAdmn  | ROLE_ADMIN    |
@javascript@frontend@devlocal
场景:验证概览页面内容
当我使用“”登录到应用程序时
然后显示列表
当我从列表中选择一个项目时
然后我被带到仪表板
当我导航到概览页面时
然后显示概览页面
然后显示概览页面的主标题
示例:
|用户名|角色|
|RoleUser |角色|用户|
|角色管理|

想象一下,如果没有场景大纲,那么将场景部分中的所有步骤用于所有不同的场景将是非常混乱和繁琐的。我可以理解这个问题,但这只是它的工作方式。场景背景应该与功能中的所有场景相结合,并且应该作为一个独立的块工作。如果您有五个场景大纲和一个场景,那么您的功能将不起作用,因为后台不知道如何处理

理论上,这可以很容易地实现,但是稍微熟悉一下Behat代码,我觉得这将是一个非常非常大的变化……事实上,我提出了一个新的特性请求,拥有这样的东西会很好。你可以订阅,看看大家怎么说。我几乎有信心,这种冷静的因素不会战胜复杂性

另一方面,没有什么可以阻止您将此逻辑组合到另一个步骤中,并在其中传递必要的参数。您应该能够从mink访问其他上下文,并将步骤作为标准方法调用。将这种逻辑从特性转移到上下文中会使事情变得更清楚一点,但我认为这有点老套,不是一种更好的方法。事实上,我不认为你现在拥有的东西有任何问题


另外,从逻辑的角度来看,你试图在你的背景中测试太多的东西。相反,您可以创建另一个场景来测试背景中的所有内容,在其他五个场景中,一开始只有两个步骤,而不是六个步骤(
当我使用“
登录应用程序时,我成功地导航到显示的概览页面)。

谢谢Ian。你把这6个步骤组合成2个步骤是什么意思。这是否意味着将所有这6个步骤合并到逻辑中。这会有点冗余,不是吗(为不同的场景再次编写相同的代码)您的背景包含每个大纲“继承”的公共逻辑。您可以将该公共逻辑从后台分离到另一个场景中,因此,您可以在单独的场景大纲中执行相同的操作,而不是在每个场景大纲中检查后台步骤是否通过,从而减少所有其他五个场景大纲的负载。在那里,您只需要登录并转到场景特定测试开始的页面。在代码中使用相同的字母在某些方面也可能被视为冗余。你有局限性,你想找到一种尽可能少地重复你自己的方法,你可以重新安排你的代码,使它更干燥,这可以使事情变得更好。现在这是非常有意义的。我可能不得不重新审视我的大量场景,并尝试遵循上面的建议。在某种程度上,我会在代码中有一些冗余,但是功能文件看起来会更干净。谢谢。