我们正在考虑在我们的项目上使用 cucumber 进行验收测试。

当我们在 cucumber scenario中编写feature时,我们将编写GivenWhenThen语句的列表。

当我们使用cucumber-jvm项目时,GivenWhenThen语句与(JUnit)类中的Java方法相关。

我想知道在项目结构中与Given/When/Then相关的代码的最佳组织是什么。我主要关心的是维护大型项目的 cucumber 测试,其中场景的数量非常重要,尤其是有关要素之间共享的项目。

我可以看到至少2种主要方法:

  • 每个功能都与其自己的JUnit类相关。因此,如果我有一个foo/bar/baz.feature cucumber 文件,我将找到具有适当foo.bar.Baz@Given@When注释方法的@Then JUnit类。
  • @Given@When@Then方法分离为“主题”类和程序包。例如,如果在我的 cucumber 方案中我有一条语句Given user "foo" is logged,则带注释的@Given("^user \"([^\"]*)\" is logged$")方法将位于foo.user.User类方法中,但同一 cucumber 方案中稍后使用的@When方法将位于不同的Java类和包中。 (让我们说foo.car.RentCar)。

  • 对我而言,第一种方法似乎很不错,因为我可以轻松地进行 cucumber 功能与Java代码之间的关系。但是缺点是我可以有很多冗余或代码重复。另外,可能很难找到一个可能的现有@Given方法,以避免重新创建它(IDE​​可以提供帮助,但是这里我们使用的是Eclipse,它似乎没有给出现有Given语句的列表?)。

    从本质上讲,当您在多个 cucumber 功能中共享Given条件时,另一种方法似乎更好,因此我想避免代码重复。这里的缺点是很难在@Given Java方法和Given cucumber 语句之间建立链接(也许,IDE可以帮忙吗?)。

    我对 cucumber 还很陌生,所以也许我的问题不是一个好问题,并且由于时间和经验的原因,这种结构是不言而喻的,但是我希望获得有关其用法的良好反馈...

    谢谢。

    最佳答案

    我建议根据代码所引用的对象对代码进行分组,类似于您在问题中提出的选项2。原因是:

  • 根据代码的使用方式和位置来构造代码是一个很大的禁忌。它实际上是在功能文件和代码之间建立耦合。
    想象一下您的产品代码中的这种事情-SendEmail()函数不会在名为NewEmailScreenCommands的类中,对吗?它将是EmailActions或类似的形式。
    所以这里同样适用。根据代码的用途而不是由谁使用来组织代码。
  • 第一种方法将使得很难重新组织您的特征文件。每当更改功能文件时,都必须更改代码文件。
  • 保持按主题分组的代码使DRY更加容易;您确切地知道了所有处理user实体的代码在哪里,因此您可以更轻松地重用它。

  • 在我们的项目中,我们使用该方法(即BlogPostStepDefinitions类),如果该类太大,则将代码进一步分为步骤类型(即BlogPostGivenStepDefinitions)。

    10-07 18:45