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

gre*_*key 8 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

Lou*_*uis 5

您不应该使场景相互依赖。完全有可能做到这一点。我有多个包含数百个场景的大型复杂测试套件。我的场景不依赖于在它之前运行的另一个场景。

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

behave -n 'failing scenario name'
Run Code Online (Sandbox Code Playgroud)

这让 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
Run Code Online (Sandbox Code Playgroud)

我正在测试的应用程序的数据库预加载了一些与上述情况相对应的测试用户。(还有注册新用户的测试,但与预加载的用户无关。)该Given I am logged in as ...步骤只是让用户登录,不需要创建用户。

这样做的附带好处之一是,如果您在 Sauce Labs 或 BrowserStack 之类的测试服务上运行您的套件并使用 Selenium,则可以实施该Given I am logged in as ...步骤以节省大量测试时间。在这种情况下,每个 Selenium 命令都需要在您的 Behave 测试和在测试服务上运行的浏览器之间进行往返,这可能需要大量时间通过 Internet 传输。减少此类交互的数量可以极大地缩短运行整个套件所需的时间。