Java Cucumber框架创建

Java Cucumber框架创建,java,selenium,automated-tests,cucumber,bdd,Java,Selenium,Automated Tests,Cucumber,Bdd,我即将开始一个新的工作,期望建立一个测试框架,允许使用Cucumber交付新特性。虽然我熟悉功能文件的自动化和创建,但从头开始创建框架将是我以前从未做过的任务。被扔到这里的最深处 在我们进入BDD交付新功能之前,我们期望将激动人心的系统行为写成功能并实现自动化。在我跑得太远之前,我想确保我在思考如何开始这项任务的正确路线上 我认为我从功能文件开始,然后是步骤def,然后编写一些代码来执行这些步骤。关于代码结构,我还会有一个单独的页面类包和一个单独的测试类包吗?或者,最好的方法是为包含我们可以对页

我即将开始一个新的工作,期望建立一个测试框架,允许使用Cucumber交付新特性。虽然我熟悉功能文件的自动化和创建,但从头开始创建框架将是我以前从未做过的任务。被扔到这里的最深处

在我们进入BDD交付新功能之前,我们期望将激动人心的系统行为写成功能并实现自动化。在我跑得太远之前,我想确保我在思考如何开始这项任务的正确路线上

我认为我从功能文件开始,然后是步骤def,然后编写一些代码来执行这些步骤。关于代码结构,我还会有一个单独的页面类包和一个单独的测试类包吗?或者,最好的方法是为包含我们可以对页面执行的所有操作的页面类创建一个包


有什么资源可以帮助这个初始设置结构吗

据我所知,结构应该如下所示-

+---.idea
+---main
|   +---java
|   +---resources
\---test
|   +---java
|   |   \---stepdefs
|   |   |   |---ServiceHooks.java
|   |   |   |---StepDefinitions.java
|   |   |---TestRunner.java
|   \---resources
|       \---features
|           |---LoginProfile.feature
|           |---UpdateProfile.feature
|---pom.xml
|---testng.xml

参考:

据我所知,结构应如下所示-

+---.idea
+---main
|   +---java
|   +---resources
\---test
|   +---java
|   |   \---stepdefs
|   |   |   |---ServiceHooks.java
|   |   |   |---StepDefinitions.java
|   |   |---TestRunner.java
|   \---resources
|       \---features
|           |---LoginProfile.feature
|           |---UpdateProfile.feature
|---pom.xml
|---testng.xml

参考:

使用Cucumber不应以任何方式影响您管理代码的方式。所以无论你拥有什么,习惯什么都可以。您只需要添加“粘合”代码,这是一种中介类,它将Cucumber步骤转换为实际的类和方法,然后执行它们

因此,通常从功能文件开始,根本不考虑实现。这是至关重要的,因为它可以帮助您将业务逻辑与实现分离,这是使用Cucumber的首要目的。下一步是使用Cucumber runner运行功能文件,它将自动建议您为“粘合”类方法指定哪些名称,以便与这些步骤匹配

例如,假设您在要素文件中创建了以下步骤:

I have logged in to the system
由于尚未实现,如果尝试运行该场景,Cucumber将抛出异常:

cucumber.api.PendingException: TODO: implement me
但它还将建议此功能步骤的步骤实现应该是什么样子。因此,在这种情况下:

You can implement missing steps with the snippets below:

@Given("^I have logged in to the system$")
public void i_have_logged_in_to_the_system() throws Throwable {
    // Write code here that turns the phrase above into concrete actions
    throw new PendingException();
}

最后一步是实现这些方法,在这里您可以重用任何您想要的实现。

使用Cucumber不应该以任何方式影响您管理代码的方式。所以无论你拥有什么,习惯什么都可以。您只需要添加“粘合”代码,这是一种中介类,它将Cucumber步骤转换为实际的类和方法,然后执行它们

因此,通常从功能文件开始,根本不考虑实现。这是至关重要的,因为它可以帮助您将业务逻辑与实现分离,这是使用Cucumber的首要目的。下一步是使用Cucumber runner运行功能文件,它将自动建议您为“粘合”类方法指定哪些名称,以便与这些步骤匹配

例如,假设您在要素文件中创建了以下步骤:

I have logged in to the system
由于尚未实现,如果尝试运行该场景,Cucumber将抛出异常:

cucumber.api.PendingException: TODO: implement me
但它还将建议此功能步骤的步骤实现应该是什么样子。因此,在这种情况下:

You can implement missing steps with the snippets below:

@Given("^I have logged in to the system$")
public void i_have_logged_in_to_the_system() throws Throwable {
    // Write code here that turns the phrase above into concrete actions
    throw new PendingException();
}

最后一步是实现这些方法,在这里您可以重用任何您想要的实现。

如@Eugene S所述-使用Cucumber功能文件的目的是描述系统的行为,而不是实现(随着时间的推移,您会发现以这种方式维护更容易)。 @fuzzed kangaroo所描述的结构也是相当标准的(如果您以Maven项目的形式启动项目,您将获得相同/相似的结构。请注意,.idea文件夹是特定于IntelliJ的)

除了这些答案,我还强烈推荐“Cumber for Java书”(如果您使用Java)或“Cumber书”(如果您使用Ruby)。这些书描述了如何最好地使用它,包括如何设置它以获得最大的好处,并保持测试的可靠性和可维护性。
最后,有很多与Cucumber社区互动的方法,你可以在Cucumber网站上找到(-Slack Channel是最活跃的atm。)

正如@Eugene S所述,使用Cucumber功能文件的目的是描述系统的行为,而不是实现(随着时间的推移,您会发现以这种方式维护更容易)。 @fuzzed kangaroo所描述的结构也是相当标准的(如果您以Maven项目的形式启动项目,您将获得相同/相似的结构。请注意,.idea文件夹是特定于IntelliJ的)

除了这些答案,我还强烈推荐“Cumber for Java书”(如果您使用Java)或“Cumber书”(如果您使用Ruby)。这些书描述了如何最好地使用Cumber,包括如何设置它以获得最大的好处,并使您的测试可信和可维护。
最后,有很多方法可以与Cucumber社区进行互动,你可以在Cucumber网站上找到(-Slack Channel是最活跃的atm。)

如果你在这里使用java,我已经为Selenium Cucumber框架创建了一个框架,你可以在其上构建:


如果您在这里使用java,我已经为Selenium Cumber框架创建了一个框架,您可以在其上构建:


OP从未提到他使用Java,谢谢。关于结构的问题更多的是关于用于驱动或测试系统的代码结构,因此step defs将调用的方法。传统上,我会为驱动系统的页面类创建一个文件夹,并为针对系统的状态。我也需要用这种方式分离黄瓜吗?@EugeneS这是一个很好的假设!我使用的是Java。对不起,我应该说明这一点。OP从来没有