【问题标题】:After Scenario Outline hook in Cucumber在 Cucumber 中的 Scenario Outline 钩子之后
【发布时间】:2018-04-27 13:41:57
【问题描述】:

我正在使用 Java 和 Cucumber。我需要在每个场景大纲之后执行一些操作。我知道有 @Before 和 @After 钩子,但它们适用于 Scenario Outline 中的 每个 场景。是否有可能在大纲中的所有场景之后而不是在每个场景之后才启动某些操作?

例子:

   Scenario Outline: Some scenario
   Given given actions
   When when actions
   Then display <value>
Examples:
|value|
|a    |
|b    |

我想通过以下方式执行:

@Before 操作

一个值

b 值

@After 操作

@Before 操作

//另一个场景大纲输出

@After 操作

【问题讨论】:

  • 场景大纲本质上是场景,但使用不同的语法编写。考虑到场景(或场景大纲中的每个示例)应该是独立的,那么在所有场景大纲运行后您需要做某事的原因是什么?

标签: java testing cucumber hook cucumber-java


【解决方案1】:

是的,您可以使用标签。

   @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。' 我希望这会有所帮助。

【讨论】:

  • before 和 after 钩子将针对场景大纲中的每个场景运行。使用该标签,它仅限于为该场景大纲运行。
【解决方案2】:

这样做的一种方法是使用运行器的 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 标记仅存在一个示例行。

【讨论】:

  • 我现在尝试将标签放在示例之前,但就我而言,它们完全被忽略了。我不知道为什么。如果我只将它们放在场景大纲之前,它们不会被忽略
  • 你可以在帖子中添加你的场景大纲吗?
【解决方案3】:

Cucumber 很难做到这一点并且不支持的原因之一是因为这是一个非常糟糕的主意。良好的测试实践要求您在运行每个测试之前从头开始。如果你像你正在做的那样将测试链接在一起,那么当出现问题时,你必须确定测试是否失败,或者之前的测试中的某些东西导致了问题。这很快就变成了一个巨大的 PITA。

TLDR 不要这样做,你会后悔的;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2020-07-03
    • 1970-01-01
    相关资源
    最近更新 更多