使用behave(python)定义场景(或所需场景)的顺序

时间:2014-08-21 20:47:15

标签: python tdd bdd python-behave

我正在使用表现来测试我的小Django应用程序。

我已经创建了包含此场景的文件user_management.feature

Scenario: register
 Given I can access registration form
  When I put "doctor" in "username" field
   And I put "tardisBlue" in "password" field
   And I put "doctor@tardis.com" in "email" field
   And I press the "Register" button
  Then the registration is successful
   And I am logged in

Everythig工作正常。

我想要开发的下一个功能是文件project_management.feature

Scenario: create a project
  Given I am logged in
  When I go to the home page
   And I click on "Create new Project" link
   And I fill the fields
    | field | text           |
    | name  | Save Gallifrey |
   And I click on "Save" button
   And I go to the home page
  Then I see the project name in the project list

现在,当我执行测试时,表现为按字母顺序执行要素文件,因此首先执行project_management.feature

它在第一个given中引发错误,因为尚未创建用户。

我已经在01_user_management.feature中测试了renamin第一个文件以使其正常工作。

您知道更好的解决方案吗?

是否有一些配置文件可以指定功能文件的顺序?

或者我可以告诉Scenario需要先运行另一个场景吗?

4 个答案:

答案 0 :(得分:4)

您不应该让场景彼此依赖。绝对可以这样做。我有多个大型复杂的测试套件,有数百个场景。我没有任何情景取决于之前运行的另一种情况。

当你有一个大套件并且单个场景失败时,能够做到这一点非常有用:

behave -n 'failing scenario name'

这使得Behave只运行失败的场景。或者,@wip标签可以做同样的事情。但是,如果您要测试的方案依赖于另一个方案,则Behave将不会自动知道它应该运行其他方案,因此您有a)知道依赖关系并且b)手动负责选择所有方案。真想运行取决于。

我在你的情况下做的事情(这是我过去所做的)是实施步骤Given I am logged in as ...。我使用正则表达式实现它,以便我可以使用

Given I am logged in as an administrator
Given I am logged in as a regular user
Given I am logged in as a user with permissions to delete articles

我正在测试的应用程序的数据库预先加载了一些与上述情况相对应的测试用户。 (仍然有一个测试用于注册新用户但是独立来自预加载的用户。)Given I am logged in as ...步骤只记录用户。它不需要创建用户。

这样做的一个好处是,如果您在Sauce Labs或BrowserStack等测试服务上运行套件并使用Selenium,您可以实施Given I am logged in as ...步骤保存大量测试时间即可。在这种情况下,每个Selenium命令都需要在您的Behave测试和运行在测试服务上的浏览器之间往返,这可能需要花费大量时间通过Internet。减少此类交互的数量可能会导致运行整个套件所需的时间存在巨大的差异。

答案 1 :(得分:1)

似乎有两种方法可以做到这一点。一个是您可以使用Background为多个场景设置状态。另一个是call previous steps from other steps。第一个解决方案看起来像这样:

Feature: logins
  Test login functionality

  Background: login
    Given I can access registration form
    And I put "doctor" in "username" field
    And I put "tardisBlue" in "password" field
    And I put "doctor@tardis.com" in "email" field
    And I press the "Register" button

  Scenario: successful login
    Then the registration is successful
    And I am logged in

  Scenario: create a project
    When I go to the home page
    And I click on "Create new Project" link
    And I fill the fields
     | field | text           |
     | name  | Save Gallifrey |
    And I click on "Save" button
    And I go to the home page
    Then I see the project name in the project list

答案 2 :(得分:1)

使用feature-listfiles,例如:

behave @my_foo.featureset …

使用:

# -- FILE: my_foo.featureset
features/alice.feature
features/bob.feature:10

答案 3 :(得分:1)

@Andrew Johnson和jenisys的答案提供了三种方法来指定步骤/场景/功能的顺序。在这里,我还要添加几个:

  • 列表文件与jenisys基本上相同,在命令行中指定功能文件时,功能将按编写的顺序执行。似乎没有正式记录下来,但这是我观察到的。
  • 还可以使用标签来控制要在命令行中运行的方案。在--tags = t1,t2,t3的示例中,这些方案将完全按照在此写入的顺序执行。方便。