9

我正在使用行为来测试我的小 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

一切正常。

我要开发的下一个功能在文件中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

现在,当我执行测试时,behaviour 按字母顺序执行功能文件,因此project_management.feature首先执行。

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

我已经测试了重命名第一个文件01_user_management.feature以使其工作。

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

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

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

4

4 回答 4

5

你不应该让场景相互依赖。绝对有可能做到这一点。我有多个包含数百个场景的大型复杂测试套件。我的任何场景都不依赖于在它之前运行的另一个场景。

当您有一个大型套件并且有一个单一场景失败时,能够执行以下操作非常有用:

behave -n 'failing scenario name'

这让 Behave 只运行失败的场景。或者,有一个@wip标签可以做同样的事情。但是,如果您要测试的场景依赖于另一个场景,Behave 不会自动知道它应该运行另一个场景,因此您可以 a) 了解依赖关系 b) 手动选择您需要的所有场景真想跑要看。

在你的情况下我会做的(这几乎是我过去所做的)是实施一个 step 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 传输。减少此类交互的数量可以极大地缩短运行整个套件所需的时间。

于 2017-01-05T11:55:18.490 回答
2

似乎有两种方法可以做到这一点。一是您可以使用背景设置多个场景的状态。另一种是从其他步骤中调用前面的步骤。第一个解决方案看起来像这样:

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
于 2014-08-21T21:04:07.633 回答
2

使用feature-listfiles,例如:

behave @my_foo.featureset …

和:

# -- FILE: my_foo.featureset
features/alice.feature
features/bob.feature:10
于 2015-02-20T22:43:49.757 回答
2

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

  • 与jenisys提到的listfile基本相同,在命令行中指定功能文件时,功能将按写入的顺序执行。它似乎没有正式记录,但这是我观察到的。
  • 还可以使用标签来控制在命令行中运行哪些场景。在 --tags=t1,t2,t3 的示例中,这些场景将完全按照那里写的顺序执行。便利。
于 2018-06-20T16:13:53.543 回答