我正在通过一些教程学习黄瓜,并且有些东西我不知道该怎么做..我需要制作一个取决于另一个场景的场景(例如注销场景我必须先登录才能退出)所以我该怎么办?我应该在注销场景(在功能文件中)编写登录步骤,还是可以在注销场景中调用整个登录场景
我还需要知道我应该在每个场景之前设置驱动程序并在每个场景后退出驱动程序吗?
答案 0 :(得分:1)
看看黄瓜钩子,这可以让你在之前设置全球'和'之后'步骤,将针对每个方案运行,而无需在功能文件中指定它们。
因为它们针对每种情况运行,所以它们非常适合在每次测试开始时初始化驱动程序。它可能适合运行您的登录,但如果您有一个不会涉及登录的场景,那么它就不是一种可行的方式(可选择进一步向下) )。这同样适用于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();
}
在我的例子中,我只是在之前的场景中启动驱动程序,然后在之后关闭它,但理论上这些方法之前和之后可能包含任何内容,您只需要在步骤定义中使用它们使用' @ Before'来分类和注释它们。和' @ After'标签如图所示。
除了这些之外,您还可以使用多个前后标记,您可以通过标记方案来调用它们。举个例子:
/**
* Something to do after certain scenarios.
*/
@After("@doAfterMethod")
public void afterMethod() {
this.application.afterThing();
}
你可以在步骤defs中设置这样的东西,作为标准,它不会运行。但是,您可以使用' @ doAfterMethod'标记您的方案。它将针对标记的场景运行,这使得这对于测试结束时需要的常见场景有用,但不是全部。对于在场景之前运行的方法也是如此,只需更改' @ After'到' @之前'。
请记住,如果你确实使用了这些,那么全局的Before和After(所以在这个例子中,驱动程序初始化和退出)将始终是第一个和最后一个要运行的东西,在它们之间的任何其他之前/之后情景。
进一步阅读: https://github.com/cucumber/cucumber/wiki/Hooks https://zsoltfabok.com/blog/2012/09/cucumber-jvm-hooks/
答案 1 :(得分:1)
您可以使用qaf bdd设置测试依赖关系。您可以在方案元数据中使用dependsOnMethods
或dependsOnGroups
来设置与TestNG相同的依赖关系,因为qaf-BDD是TestNG BDD实现。
答案 2 :(得分:1)
不支持创建依赖于Cucumber-JVM中的其他方案的方案。我认为在Cucumber的Ruby实现中仍然支持。然而,这是一种危险的做法。未来版本的Cucumber将不支持从另一个场景调用场景。
那就是说,当你想重用功能时,如何解决问题?你提到注销,当许多场景要求为用户注销状态时,你如何处理? 解决方案是在helper方法或helper类中实现功能,每个步骤都要求用户注销掉调用。
这允许每个场景独立于所有其他场景。这反过来将允许您以随机顺序运行方案。我不认为场景的执行顺序是有保证的。我肯定知道让JUnit运行器以随机顺序运行场景只是为了强制执行不依赖于其他场景的场景的习惯。
另一个问题是,如何在场景之前设置WebDriver以及如何将其拆除,可以使用Cucumber中的Before和After钩子来解决。使用它们时,请注意不要导入之前和之后的JUnit版本。