我正在使用Java和Cucumber。我需要在每个场景大纲之后做一些动作。我知道有@Before和@After钩子,但它们适用于场景大纲中的每个场景。是否有可能在大纲中的所有场景之后完全启动某些操作,而不是在每个场景之后?
示例:
Scenario Outline: Some scenario
Given given actions
When when actions
Then display <value>
Examples:
|value|
|a |
|b |
我想以下列方式执行:
@Before actions
值
b值
@After actions
@Before actions
//另一个场景大纲输出
@After actions
答案 0 :(得分:0)
是的,您可以使用标签。
@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。 我希望这会有所帮助。
答案 1 :(得分:0)
这样做的一种方法是为跑步者使用junit或testng的BeforeClass and AfterClass
方法。问题是在功能文件中只能有一个scenariooutline,它需要一个独特的运行者类。
只有第一个场景运行的方法才能运行场景大纲非常简单。创建一个只使用静态标志运行一次的前挂钩。修改Before钩子以运行某些标签等。
private static boolean skipFlag = false;
@Before
public void beforeHook() {
if(!skipFlag) {
do stuff
skipFlag=true;
}
}
虽然这适用于功能文件中的一个场景大纲。否则,您需要为每个scenariooutline复制标志。对于并行运行,它可能会变得混乱。
一个更好但有点复杂的解决方案,需要将示例表拆分为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标记只有一个示例行。
答案 2 :(得分:0)
这很困难并且不受黄瓜支持的原因之一是因为这是一个非常糟糕的主意。良好的测试实践规定,在运行每个测试之前,您应从干净的平板开始。如果您将测试链接在一起,就像您正在进行的那样,当出现问题时,您必须确定测试是否失败,或者先前测试中的某些内容是否导致了问题。这很快就变成了一个巨大的PITA。
TLDR不这样做你会后悔的;)