我有两个黄瓜功能(DeleteAccountingYear.feature 和 AddAccountingYear.feature)。我该怎么做才能使第二个功能(AddAccountingYear.feature)在第一个功能(AddAccountingYear.feature)之前运行。
2 回答
来自 Justin Ko 的网站 - https://jkotests.wordpress.com/2013/08/22/specify-execution-order-of-cucumber-features/运行顺序按以下方式确定:
- 按功能文件目录字母顺序
- 按功能文件名的字母顺序
- 功能文件中的场景顺序
因此,要在另一个之前运行一个功能,您可以更改功能文件的名称或将其放在一个单独的功能文件夹中,名称按字母顺序排列。
但是,让所有测试相互独立是一种很好的做法。最简单的方法之一是使用模拟来创建您的数据(即您要删除的日期),但这并不总是一种选择。另一种方法是在删除测试的设置中创建要删除的数据。这样做的缺点是重复工作,但测试运行的顺序无关紧要。这现在可能不是问题,但是使用更大的测试套件和/或使用测试 repo 的多个编码器仅基于字母排序可能难以维持测试顺序。
另一种选择是结合添加和删除测试。这违背了一个测试应该测试一件事的一般规则,但如果您的测试需要很长时间才能运行并且将添加数据步骤添加到删除设置中会增加您的测试套件的大量时间,这通常是一种实用的方法.
编辑:阅读 Justin Ko 网站的链接后,您可以指定运行 cucumber 时运行的功能,它会按照您指定的顺序运行它们。对于您不关心订单的任何内容,您可以将整个功能文件夹放在最后,黄瓜将通过它们运行,跳过已经运行的任何内容。从上面的链接复制粘贴示例 -
cucumber features\folder2\another.feature features\folder1\some.feature features
我同意@alannichols 关于测试相互独立的观点。这是自动化套件的一个基本方面。否则,我们最终会得到一个无法维护的、不稳定的测试套件。
在运行另一个功能之前运行某个功能文件在我看来就像一个测试设计问题。
Cucumber 提供了几个选项来解决这样的问题:
a) DeleteAccountingYear.feature 真的是它自己的特性吗?如果没有,您可以使用 cucumber Background : 选项。后台提供的步骤将针对该功能文件中的每个场景运行。因此,您的 AddAccountingYear.feature 将如下所示:
Feature: AddingAccountingYear
Background:
Given I have deleted accounting year
Scenario Outline: add new accounting year
Then I add new account year
b) 如果DeleteAccountingYear.feature 确实是它自己的特征并且需要在它自己的特征文件中,那么你可以使用setup 和teardown 函数。在黄瓜中,这可以使用hooks来实现。您可以使用某个标记(例如 @doAfterDeleteAccountYear)标记 AddDeleteAccountingYear.feature。现在,您可以从 Before 钩子中为此特定标签进行所需的设置。之前的钩子(用于 ruby)将如下所示:
Before('@doAfterDeleteAccountYear') do
#Call the function to delete the account year
end
如果删除账户年份写成一个函数,那么唯一需要做的就是在 before 钩子中调用这个方法。这样代码也将符合 DRY 标准。
如果这些选项对您不起作用,另一种强制执行顺序的方法是使用批处理/shell 脚本。您可以按照您希望执行的顺序为每个功能添加单独的黄瓜命令,然后执行脚本。它的缺点是将为每个功能文件生成不同的报告。但由于上述原因,我不建议这样做。