如何使功能在其他之前运行

时间:2015-03-02 11:03:26

标签: tdd cucumber atdd

我有两个黄瓜功能(DeleteAccountingYear.feature和AddAccountingYear.feature)。 如何使第二个功能(AddAccountingYear.feature)在第一个功能(AddAccountingYear.feature)之前运行。

2 个答案:

答案 0 :(得分:0)

从Justin Ko的网站 - https://jkotests.wordpress.com/2013/08/22/specify-execution-order-of-cucumber-features/,运行顺序以下列方式确定:

  1. 按功能文件目录按字母顺序排列
  2. 按功能文件名按字母顺序排列
  3. 要素文件中的方案顺序
  4. 因此,要在另一个功能之前运行一个功能,您可以更改功能文件的名称,或将其放在一个单独的功能文件夹中,其名称按字母顺序排在第一位。

    但是,优良作法是让所有测试彼此独立。最简单的方法之一是使用模拟来创建数据(即您要删除的日期),但这并不总是一个选项。另一种方法是在删除测试的设置中创建要删除的数据。这样做的缺点是它是一个重复的工作,但测试运行的顺序无关紧要。这可能不是现在的问题,但是使用更大的测试套件和/或多个编码器使用测试回购它可能很难仅根据字母排序维持测试排序。

    另一种选择是组合添加和删除测试。这违反了一般规则,即一个测试应该测试一件事,但如果您的测试需要很长时间才能运行并且将添加数据步骤添加到设置中以便删除会增加测试套件的大量时间,那么这通常是一种实用的方法。

    编辑:在阅读Justin Ko网站的链接后,您可以指定运行黄瓜时运行的功能,并按照您提供的顺序运行它们。对于你不关心订单的任何你可以把整个功能文件夹放在最后,黄瓜将贯穿它们,跳过任何已经运行的。从上面的链接复制粘贴示例 -

    cucumber features\folder2\another.feature features\folder1\some.feature features
    

答案 1 :(得分:0)

我同意@alannichols关于测试彼此独立的看法。这是自动化套件的一个基本方面。否则,我们最终会得到一个难以维护的,不稳定的测试套件。

在运行其他功能之前运行某个功能文件在我看来就像测试设计问题。

Cucumber提供了解决此类问题的几个选项:

a)DeleteAccountingYear.feature真的是它自己的一个特色吗?如果没有,您可以使用黄瓜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来实现。您可以使用某个标记来标记AddDeleteAccountingYear.feature,例如@doAfterDeleteAccountYear。现在,从Before钩子中,您可以为此特定标记执行所需的设置。 before hooks(用于ruby)看起来像:

Before('@doAfterDeleteAccountYear') do
  #Call the function to delete the account year
end

如果将删除帐户年份写为函数,则唯一需要的是在before hook中调用此方法。这样代码也将符合DRY标准。

如果这些选项对您不起作用,另一种强制执行顺序的方法是使用批处理/ shell脚本。您可以按照要执行的顺序为每个功能添加单独的黄瓜命令,然后只执行脚本。它的缺点是将为每个功能文件生成不同的报告。但由于上述原因,我不建议这样做。