Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Cucumber中组织规范定义?_Java_Cucumber_Acceptance Testing_Cucumber Jvm_Cucumber Junit - Fatal编程技术网

Java 如何在Cucumber中组织规范定义?

Java 如何在Cucumber中组织规范定义?,java,cucumber,acceptance-testing,cucumber-jvm,cucumber-junit,Java,Cucumber,Acceptance Testing,Cucumber Jvm,Cucumber Junit,我们正在考虑在我们的项目中使用黄瓜进行验收测试 当我们在Cucumber功能中编写一个场景时,我们编写一个给定的列表,当和然后语句 当我们使用project时,给定的、When和Then语句与(JUnit)类中的Java方法相关 我想知道与相关的代码在项目结构中的最佳组织是什么。我主要关心的是在一个大项目上维护cumber测试,其中场景的数量非常重要,特别是关于功能之间共享的项目 我可以看到至少两种主要方法: 每个特性都与其自己的JUnit类相关。因此,如果我有一个foo/bar/baz.fea

我们正在考虑在我们的项目中使用黄瓜进行验收测试

当我们在Cucumber
功能中编写一个
场景
时,我们编写一个给定的
列表
然后
语句

当我们使用project时,给定的
When
Then
语句与(JUnit)类中的Java方法相关

我想知道与
相关的代码在项目结构中的最佳组织是什么。我主要关心的是在一个大项目上维护cumber测试,其中场景的数量非常重要,特别是关于功能之间共享的项目

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

  • 每个特性都与其自己的JUnit类相关。因此,如果我有一个
    foo/bar/baz.feature
    cucumber文件,我将找到相关的
    foo.bar.baz
    JUnit类,该类具有适当的
    @给定的
    @当
    @然后
    注释的方法

  • @给定的
    @当
    时和
    @然后
    方法分离为“主题”类和包。例如,如果在我的cucumber场景中记录了一条语句
    给定用户“foo”
    ,那么
    @Given(“^user\”([^\“]*)”将记录$”)
    带注释的方法将位于
    foo.user.user
    类方法中,但在同一场景中稍后使用的
    @When
    方法可能位于不同的Java类和包中(比如
    foo.car.RentCar

  • 对我来说,第一种方法似乎很好,因为我可以很容易地处理cucumber特性和Java代码之间的关系。但缺点是我可能会有很多冗余或代码重复。此外,可能很难找到一个可能存在的
    @给定的
    方法,以避免重新创建它(IDE可以提供帮助,但这里我们使用的是Eclipse,它似乎没有给出现有
    给定的
    语句的列表?)

    另一种方法在几个Cumber特性之间共享
    给定的
    条件时基本上更好,因此我希望避免代码重复。这里的缺点是很难在
    @Given
    Java方法和
    Given
    Cumber语句之间建立链接(也许IDE也能帮上忙?)

    我对cucumber很陌生,所以我的问题可能不是一个好问题,随着时间和经验的推移,结构将不言而喻,但我想从它的使用中得到良好的反馈


    谢谢。

    我们也开始使用Cucumber JVM进行验收测试,在组织代码方面也有类似的问题。我们为每个功能选择了一个步骤定义类。目前这很好,因为我们正在测试的功能不是很复杂,也不是很独立,我们的功能几乎没有重叠

    我认为,您提到的第二种方法会更好,但将几个不同的步骤定义类绑定到一个场景中往往是一个挑战。我认为,一旦您开始添加更多功能并像往常一样进行重构,最好的项目结构就会变得更清晰

    同时,这里有一个用于cucumber的Eclipse插件


    在编写功能时,它具有语法突出显示以及现有可用步骤的列表。

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

    • 根据代码的使用方式和使用地点来构建代码是一个很大的禁忌。它实际上是在功能文件和代码之间建立耦合。
      想象一下,在你的产品代码中有这样一个东西,
      sendmail()
      函数不会在名为
      NewEmailScreenCommands
      的类中,是吗?它会在
      EmailActions
      或类似的类中。
      因此,同样的道理也适用于这里;根据代码的功能而不是使用它的人来构造代码

    • 第一种方法会使重新组织功能文件变得困难;无论何时更改功能文件,都必须更改代码文件

    • 按主题对代码进行分组使其更容易干燥;您确切地知道处理
      用户
      实体的所有代码的位置,因此更容易重用它


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

    在对可能性进行了一点修改之后,我们选择的是您公开的两种解决方案的混合

    • 在以主题为中心的通用步骤类中重新组合步骤
      • 应用程序启动步骤
      • 安全检查步骤
      • [此处放置随机特征关注点]步骤
    • 以及场景类(在某些情况下甚至是功能)特定步骤
    这是为了在同一时间有一组分解的代码,这是很容易识别的,它的什么,行踪和什么。 然而,它不允许用过于特定的代码将这些公共类弄乱


    所有这些类之间的连接都是由spring处理的(cucumber spring一旦掌握了窍门,它会做得很好)。

    注意,我不认为这是这个问题的重复:谢谢。我已经在使用Eclipse插件,但还不是很满意(当然,它可以改进)您是否可以选择切换到IntelliJ(有一个免费的社区版);这对建议现有的STEP定义非常有帮助。