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

标签 python tdd bdd python-behave

我正在使用 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

一切正常。

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

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

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

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

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

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

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

最佳答案

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

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

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 传输。减少此类交互的次数可以显着运行整个套件所需的时间。

关于python - 使用 behave (python) 定义场景(或所需场景)的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25435660/

相关文章:

python - 在 Pandas DataFrame 中保留 None(尽管有 astype() 和 to_parquet())

python - 循环列表并打印字符串的这些元素

ios - iOS 上的 TDD 与调试

unit-testing - 单独的类与方法

jquery - 诗农的假服务器没有响应

javascript - 不知道如何用 Jasmine 测试这个异步函数

python - 为什么 python pocketsphinx 给出 TypeError?

python - Flask:如何读取流输入

javascript - react 测试: Should Text Contents Be Tested For?

ruby-on-rails - 对 Rails 中正确的 BDD 方法的怀疑