【发布时间】:2013-09-17 17:43:18
【问题描述】:
我想为每个特定的功能文件指定某些设置和拆卸步骤。我见过允许代码在每个场景之前执行的钩子,以及在每个功能之前执行代码的钩子,但我想指定代码在所有场景针对一个特定功能运行之前和之后运行一次。
这可能吗?
【问题讨论】:
标签: java cucumber cucumber-jvm
我想为每个特定的功能文件指定某些设置和拆卸步骤。我见过允许代码在每个场景之前执行的钩子,以及在每个功能之前执行代码的钩子,但我想指定代码在所有场景针对一个特定功能运行之前和之后运行一次。
这可能吗?
【问题讨论】:
标签: java cucumber cucumber-jvm
你使用 cucumber-jvm 吗?我找到了一篇符合您要求的文章。
http://zsoltfabok.com/blog/2012/09/cucumber-jvm-hooks/
基本上,不要为此使用 JUnit @BeforeClass 和 @AfterClass,因为它们不知道 Cucumber Hook 标签。您希望 Init 和 Teardown 方法仅在某些场景下运行,对吗?
【讨论】:
如果您使用 junit 运行测试。我们使用注释来创建一个单元测试类和一个单独的步骤类。标准的@Before 东西放在steps 类中,但@BeforeClass 注解可以在主单元测试类中使用:
@RunWith(Cucumber.class)
@Cucumber.Options(format = {"json", "<the report file"},
features = {"<the feature file>"},
strict = false,
glue = {"<package with steps classes"})
public class SomeTestIT {
@BeforeClass
public static void setUp(){
...
}
@AfterClass
public static void tearDown(){
...
}
}
【讨论】:
试试这个:
在功能文件中:
@tagToIdentifyThatBeginAfterShouldRunForThisFeatureOnly
Feature : My new feature ....
在 Stepdefinitions.java 中:
@Before("@tagToIdentifyThatBeginAfterShouldRunForThisFeatureOnly")
public void testStart() throws Throwable {
}
@After("@tagToIdentifyThatBeginAfterShouldRunForThisFeatureOnly")
public void testStart() throws Throwable {
}
【讨论】:
嗯,我和你有同样的要求。根据 cucumber-jvm 文档 - Cucumber-JVM does not support running a hook only once.
所以我对特定变量采用了 null-check 方法,该变量是 @Before 在黄瓜步骤挂钩中的结果。如下所示。
private String token;
public String getToken(){
if (token == null) {
token = CucumberClass.executeMethod();
}
return token;
}
在上面的示例中,我们假设 getToken() 方法在任何场景运行之前为您提供了一些所需的令牌,并且您只需要一次令牌。这种方法只会在第一次执行您的方法,即在任何场景开始执行之前它为空。它还显着减少了执行时间。
【讨论】: