[英]After Scenario Outline hook in Cucumber
我正在使用 Java 和 Cucumber。 我需要在每个场景大纲之后做一些动作。 我知道有 @Before 和 @After 钩子,但它们适用于场景大纲中的每个场景。 是否有可能在大纲中的所有场景之后而不是在每个场景之后完全启动某些操作?
例子:
Scenario Outline: Some scenario
Given given actions
When when actions
Then display <value>
Examples:
|value|
|a |
|b |
我想通过以下方式执行:
@Before 行动
一个值
b值
@After 动作
@Before 行动
//另一个场景大纲输出
@After 动作
是的,您可以使用标签。
@tag1
Scenario Outline: Some scenario
Given given actions
When when actions
Then display <value>
Examples:
|value|
|a |
|b |
这里我们将 tag1 指定为标签。
现在在步骤定义中,您可以使用以下内容:
@Before("@tag1")
public void testSetup(){
...
}
@After("@tag1")
public void testEnd(){
...
}
这些@before 和@after 现在特定于 tag1。 我希望这有帮助。
这样做的一种方法是为运行程序使用junit 或testng 的BeforeClass and AfterClass
方法。 问题是功能文件中只能有一个场景大纲,并且需要一个唯一的运行程序类。
只为第一个场景运行的方法运行场景大纲是很容易的。 创建一个 before 钩子,只使用静态标志运行一次。 修改 Before 钩子以针对某些标签等运行。
private static boolean skipFlag = false;
@Before
public void beforeHook() {
if(!skipFlag) {
do stuff
skipFlag=true;
}
}
尽管这适用于功能文件中的一个场景大纲。 否则,您将需要从每个场景大纲复制标志。 对于并行运行,它可能会变得混乱。
一个更好但有点复杂的解决方案,需要将示例表分成 3 个并给出顶部和底部的标签。
@AftBef
Scenario Outline:
When User Selects <Origin>, <Destination>
@StartIt
Examples:
| Origin | Destination |
| London | New York |
Examples:
| Origin | Destination |
| Munich | Moscow |
| Rome | Shanghai |
@EndIt
Examples:
| Origin | Destination |
| Miami | San Francisco |
添加以下带有标签的钩子方法。 如果有任何自定义逻辑,您还可以在中间部分添加标签。
@Before(value={"@StartIt"})
public void startItAll() {
System.out.println("-----START IT BIRTH BIRTH----");
}
@After(value={"@EndIt"})
public void endItAll() {
System.out.println("-----END IT DIE DIE---------");
}
如果您只有一个示例,只需将两个标签添加到如下示例中即可。
@StartIt @EndIt
Examples:
在创建表格时需要小心,以确保 @StartIt 和 @EndIt 标签只存在一个示例行。
这很困难并且不受 Cucumber 支持的原因之一是因为它是一个非常糟糕的主意。 良好的测试实践规定,在运行每个测试之前,您必须从头开始。 如果您像现在一样将测试链接在一起,那么当出现问题时,您必须确定测试是否失败,或者之前测试中的某些内容导致了问题。 这很快就变成了一个巨大的 PITA。
TLDR 不要这样做,你会后悔的 ;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.