【问题标题】:JBehave scenario meta parameters in 4.0JBehave 4.0 中的场景元参数
【发布时间】:2015-09-22 18:54:53
【问题描述】:

我最近从 JBehave 3.10 升级到了 4.0.4。这次升级破坏了我基于场景的元数据。我在一些场景中使用元数据属性,这些属性通过命名参数传递到步骤中。但是,现在传递到步骤中的实际元值似乎是随机分配给同一故事中任何场景的任何值。我将提供一个示例,说明我正在做什么以提供更多上下文。

Meta:
@set Smoke

Narrative:
When I do something......

Scenario: Scenario 1
Meta:
@brand One
Given ...
When ...
Then ...

Scenario: Scenario 2
Meta:
@brand Two
Given ...
When ...
Then ...


@Given(...)
public void scenarioStep(@Named("brand") String brand, @Named("url") String url) {
// Do something with brand
}

在上面的示例中,当为场景 1 调用scenarioStep 时,它有时会传递一个品牌“One”,有时会传递“Two”,而它应该始终是“one”。

有人知道这里会发生什么吗?我尝试将 Jbehave-Core 更改为 4.0 版本的旧版本,但它们都表现出相同的行为。当我切换回 3.10 时,它又可以正常工作了。

【问题讨论】:

  • 另外,当你执行它们时你的步骤是什么样的?通常,命名参数映射到步骤模式中的 $ 分隔参数,因此会有类似 @Given 的品牌名称 $brand 和 hosturl $url
  • 我的示例代码底部有一个示例步骤。

标签: jbehave


【解决方案1】:

在对 JBehave 框架进行大量调试之后,我想我已经找到了问题所在。在执行一个故事之前,它首先被转换成一个 PerformableStory 和场景转换成 PerformableScenarios。在该过程中,可用的命名参数(来自元数据)作为哈希映射传递并与 PerformableScenario 一起存储。然而,在 JBehave 4.x 代码中,故事中的每个场景都使用和更新了相同的哈希映射。

由于每个场景都共享相同的命名参数映射,因此要解析的最后一个场景将覆盖该故事中所有其他场景的场景级元数据参数。需要为每个场景复制哈希图。

我已经分叉了项目并修补了代码来执行此操作。这解决了我看到的问题。我将看看我是否可以设法在 JBehave 项目上为此打开一个错误。

更新:我在 JBehave 项目中针对此问题打开了错误 JBEHAVE-1129。

【讨论】:

  • 看起来该修复程序已合并到即将发布的 4.0.5 版本中。
【解决方案2】:

jBehave 将在使用 here 找到的指定语法解析之前加载整个测试套件。如果编译的测试不符合预期的语法(例如不合适的关键字等),它会导致 jBehave 出现看似零星的行为。

测试您的 jBehave 测试是否符合犹太教规的一种方法是在加载场景之后打印出场景的文本表示,但在执行并将其与语法匹配之前。在上面的示例中,我可以看到不支持叙述性“何时”关键字。

; The narrative is identified by keyword "Narrative:" (or equivalent in I18n-ed locale),
; It is followed by the narrative elements
Narrative:= "Narrative:" ( InOrderTo AsA IWantTo | AsA IWantTo SoThat ) ;

; The narrative elements
InOrderTo:= "In order to" NarrativeElementContent ;
AsA:= "As a" NarrativeElementContent ;
IWantTo:= "I want to" NarrativeElementContent ;
SoThat:= "So that" NarrativeElementContent ;

; The narrative starting words (or equivalent in I18n-ed locale)
NarrativeStartingWord :== ("In order to" | "As a" | "I want to" | "So that") ;

我找不到用于区分版本的语法文件,但可以找到语法更新历史记录 here。看起来很可能在 jBehave 对语法的修订之间发生了变化。

编辑: 要在执行之前打印出步骤/组件,请添加default console reporter 例如

new StoryReporterBuilder()
        .withFailureTrace(true)
        .withFormats(CONSOLE, TXT, HTML, XML)
);

请将您的输出或日​​志中的任何不一致的地方发布出来以进一步调试

【讨论】:

  • 我在这里举例子时叙述中的错误是我的错。我一直不在办公室,所以还没有跟进你的建议。我会按照你的建议去做,看看会发生什么。
  • 我已经检查了叙述和场景的解析。一切都检查出来。我正在做一些调试以尝试了解更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多