如何使用黄瓜、硒和 java 创建一个依赖于另一个场景的场景
How to make a scenario that depends on another scenario using cucumber, selenium and java
我正在通过一些教程学习黄瓜,但有些事情我不知道该怎么做。我需要制作一个依赖于另一个场景的场景(例如注销场景我必须登录首先在注销之前)那么我该怎么办?我应该在注销场景中编写登录步骤(在功能文件中)还是有一种方法可以在注销场景中调用整个登录场景
我还需要知道我是否应该在每个场景之前设置驱动程序并在每个场景之后退出驱动程序?
查看 Cucumber 挂钩,这允许您设置全局 'before' 和 'after' 步骤,这将 运行 用于每个场景,而无需在您的功能中指定它们文件。
因为它们 运行 适用于每种情况,所以它们非常适合在每次测试开始时初始化驱动程序之类的事情。它可能适合 运行 登录,但如果您有机会遇到不涉及登录的情况,那么它就不是可行的方法(或者更进一步)。这同样适用于后一种情况,您可以在这种情况下执行注销并关闭您的驱动程序。例如:
/**
* Before each scenario, initialise webDriver.
*/
@Before
public void beforeScenario() {
this.application.initialiseWebDriver();
}
/**
* After each scenario, quit the web driver.
*/
@After
public void afterScenario() {
this.log.trace("afterScenario");
this.application.quitBrowser();
}
在我的示例中,我只是在之前的场景中启动驱动程序,然后在之后关闭它,但理论上这些之前和之后的方法可以包含任何内容,您只需要将它们包含在您的步骤定义中class 并使用“@Before”和“@After”标记对其进行注释,如图所示。
除了这些,你还可以有多个前后标签,你可以通过标记场景来调用它们。例如:
/**
* Something to do after certain scenarios.
*/
@After("@doAfterMethod")
public void afterMethod() {
this.application.afterThing();
}
您可以在步骤定义中设置类似这样的内容,但作为标准,它不会 运行。但是,您可以使用“@doAfterMethod”标记您的场景,并且它将 运行 用于标记的场景,这对于您在测试结束时需要的常见场景非常有用,但不是所有场景。这同样适用于场景之前 运行 的方法,只需将“@After”更改为“@Before”。
请记住,如果您确实使用了这些,全局之前和之后(因此在此示例中驱动程序初始化和退出)将始终是 运行 的第一件事和最后一件事,以及任何其他 before/afters在他们和场景之间。
进一步阅读:
https://github.com/cucumber/cucumber/wiki/Hooks
https://zsoltfabok.com/blog/2012/09/cucumber-jvm-hooks/
您可以使用 qaf bdd 设置测试依赖性。您可以在场景元数据中使用 dependsOnMethods
或 dependsOnGroups
来设置与 TestNG 相同的依赖关系,因为 qaf-BDD 是 TestNG BDD 实现。
不支持在 Cucumber-JVM 中创建依赖于另一个场景的场景。我认为 Cucumber 中的 Ruby 实现仍然支持。然而,这是一种危险的做法。 Cucumber 未来版本将不再支持从另一个场景调用一个场景。
也就是说,当您想重用功能时,您是如何解决问题的?您提到注销,当许多场景需要为用户注销状态时,您如何处理?
解决方案是在辅助方法或辅助程序 class 中实现功能,要求用户注销的每个步骤都会调用。
这允许每个场景独立于所有其他场景。这反过来将允许您以随机顺序 运行 场景。我不认为场景的执行顺序是有保证的。我绝对知道有人讨论过让 JUnit 运行ner 到 运行 场景以随机顺序排列,只是为了养成不让场景依赖于其他场景的习惯。
您的另一个问题,即如何在场景之前设置 WebDriver 以及如何将其拆除,已使用 Cucumber 中的 Before 和 After 挂钩解决。使用的时候注意不要导入Before和After的JUnit版本
我正在通过一些教程学习黄瓜,但有些事情我不知道该怎么做。我需要制作一个依赖于另一个场景的场景(例如注销场景我必须登录首先在注销之前)那么我该怎么办?我应该在注销场景中编写登录步骤(在功能文件中)还是有一种方法可以在注销场景中调用整个登录场景
我还需要知道我是否应该在每个场景之前设置驱动程序并在每个场景之后退出驱动程序?
查看 Cucumber 挂钩,这允许您设置全局 'before' 和 'after' 步骤,这将 运行 用于每个场景,而无需在您的功能中指定它们文件。
因为它们 运行 适用于每种情况,所以它们非常适合在每次测试开始时初始化驱动程序之类的事情。它可能适合 运行 登录,但如果您有机会遇到不涉及登录的情况,那么它就不是可行的方法(或者更进一步)。这同样适用于后一种情况,您可以在这种情况下执行注销并关闭您的驱动程序。例如:
/**
* Before each scenario, initialise webDriver.
*/
@Before
public void beforeScenario() {
this.application.initialiseWebDriver();
}
/**
* After each scenario, quit the web driver.
*/
@After
public void afterScenario() {
this.log.trace("afterScenario");
this.application.quitBrowser();
}
在我的示例中,我只是在之前的场景中启动驱动程序,然后在之后关闭它,但理论上这些之前和之后的方法可以包含任何内容,您只需要将它们包含在您的步骤定义中class 并使用“@Before”和“@After”标记对其进行注释,如图所示。
除了这些,你还可以有多个前后标签,你可以通过标记场景来调用它们。例如:
/**
* Something to do after certain scenarios.
*/
@After("@doAfterMethod")
public void afterMethod() {
this.application.afterThing();
}
您可以在步骤定义中设置类似这样的内容,但作为标准,它不会 运行。但是,您可以使用“@doAfterMethod”标记您的场景,并且它将 运行 用于标记的场景,这对于您在测试结束时需要的常见场景非常有用,但不是所有场景。这同样适用于场景之前 运行 的方法,只需将“@After”更改为“@Before”。
请记住,如果您确实使用了这些,全局之前和之后(因此在此示例中驱动程序初始化和退出)将始终是 运行 的第一件事和最后一件事,以及任何其他 before/afters在他们和场景之间。
进一步阅读: https://github.com/cucumber/cucumber/wiki/Hooks https://zsoltfabok.com/blog/2012/09/cucumber-jvm-hooks/
您可以使用 qaf bdd 设置测试依赖性。您可以在场景元数据中使用 dependsOnMethods
或 dependsOnGroups
来设置与 TestNG 相同的依赖关系,因为 qaf-BDD 是 TestNG BDD 实现。
不支持在 Cucumber-JVM 中创建依赖于另一个场景的场景。我认为 Cucumber 中的 Ruby 实现仍然支持。然而,这是一种危险的做法。 Cucumber 未来版本将不再支持从另一个场景调用一个场景。
也就是说,当您想重用功能时,您是如何解决问题的?您提到注销,当许多场景需要为用户注销状态时,您如何处理? 解决方案是在辅助方法或辅助程序 class 中实现功能,要求用户注销的每个步骤都会调用。
这允许每个场景独立于所有其他场景。这反过来将允许您以随机顺序 运行 场景。我不认为场景的执行顺序是有保证的。我绝对知道有人讨论过让 JUnit 运行ner 到 运行 场景以随机顺序排列,只是为了养成不让场景依赖于其他场景的习惯。
您的另一个问题,即如何在场景之前设置 WebDriver 以及如何将其拆除,已使用 Cucumber 中的 Before 和 After 挂钩解决。使用的时候注意不要导入Before和After的JUnit版本