【问题标题】:Define the order of scenarios (or required scenario) with behave (python)使用行为(python)定义场景(或所需场景)的顺序
【发布时间】:2014-08-21 20:47:14
【问题描述】:

我正在使用行为来测试我的小 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 中的第一个文件以使其正常工作。

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

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

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

【问题讨论】:

  • 值得一提的是,这个问题询问的是场景序列,但描述的是特征序列。他们有不同的方法来控制顺序。

标签: python tdd bdd python-behave


【解决方案1】:

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

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

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。减少此类交互的数量可以在运行整个套件所需的时间上产生巨大的差异。

【讨论】:

    【解决方案2】:

    似乎有两种方法可以做到这一点。一是您可以使用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
    

    【讨论】:

      【解决方案3】:

      使用feature-listfiles,比如:

      behave @my_foo.featureset …
      

      与:

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

      【讨论】:

        【解决方案4】:

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

        • 与jenisys提到的listfile基本相同的想法,在命令行中指定功能文件时,功能将按照写入的顺序执行。似乎没有官方记录,但这是我观察到的。
        • 还可以使用标签来控制在命令行中运行的场景。在 --tags=t1,t2,t3 的示例中,这些场景将完全按照此处所写的顺序执行。方便。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-10
          • 2023-01-03
          • 2016-02-13
          • 2015-05-19
          相关资源
          最近更新 更多