2014-09-11 36 views
0

背景中的步骤不能与示例结合使用。 Behat是一个限制吗?为什么背景中的步骤不能与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 | 

这将产生错误: [贝哈特\小黄瓜\异常\ ParserException]
预期注释或方案或轮廓或步骤令牌,但得到了对线实施例:15中的文件:在/ var /功能/概述.feature

我在“背景”中有这么多步骤的原因是因为这是进入页面的逻辑流程。我有几个使用这些步骤的场景。

我确实有这个问题的工作解决方案,它使用“场景”中的“背景”中的所有步骤。这工作绝对好。不过,对于此功能,我有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 | 

想象一下,从所有不同的场景场景部分的所有这些步骤

回答

1

如果没有场景轮廓,绝对麻烦和麻烦。我可以解决这个问题,但这只是它的工作方式。场景背景应该与该功能中的所有场景相结合,并应该作为独立块运行。如果您有五个场景大纲和一个场景,则您的功能无法使用,因为背景不知道如何处理<username>

理论上这可能相当容易实现,但对Behat代码稍微熟悉一些,我觉得这将是一个非常非常大的变化......事实上,我提出this issue来提出一个新的功能请求,它会很高兴有这样的事情。你可以订阅,看看这些人说什么。我几乎有信心,这个很酷的因素不会胜过复杂性。

另一方面,没有什么能阻止你将这个逻辑合并到另一个步骤,并在那里传递必要的参数。您应该能够从貂皮中访问其他上下文,并以标准方法调用步骤。将这个逻辑从特征移到上下文中会稍微清理一些东西,但是imho这有点冒险,而且不是一个更好的方法。事实上,我不认为你现在有什么问题。

此外,从逻辑角度来看,您正试图在背景中测试太多东西。相反,您可以创建另一个场景来测试背景中的所有内容,而在其他五个场景中,开始时只有两个步骤,而不是六个(When I login to the application using "<username>"Then I successfully navigate the Overview Page is displayed)。

+0

谢谢伊恩。将6个步骤合并为2个步骤意味着什么?这是否意味着将所有这6个步骤的逻辑合并到2中。这将会有点冗余,不是这样(在不同情况下再次编写相同的代码) – 2014-09-11 12:31:26

+1

您的背景包含每个大纲“继承”的公共逻辑。您可以将该通用逻辑从背景中分离到另一个场景中,因此不必检查每个场景大纲中的后台步骤是否通过,而是可以在单独的场景大纲中执行相同的操作,从而减少所有其他五个场景大纲的负载。在那里你只需要登录并进入特定场景测试开始的页面。 – 2014-09-11 12:49:43

+1

在代码中使用相同的字母在某些方面也可以被认为是冗余的。你有局限性,你想找到尽可能少的重复自己的方法,你可以重新安排你的代码,让它变得更干,这样可以使事情变得更好。 – 2014-09-11 12:52:36