JBehave 4.0 中的场景元参数
JBehave scenario meta parameters in 4.0
我最近从 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 时,它又可以正常工作了。
jBehave 将加载您的整个测试套件,然后使用找到的指定语法 here 对其进行解析。如果编译的测试不符合预期的语法(例如,不合适的关键字等),它会导致 jBehave 具有看似零星的行为。
测试您的 jBehave 测试是否符合标准的一种方法是在场景加载后但在执行和匹配语法之前打印出场景的文本表示。在上面的示例中,我可以看到不支持 narrative 'When' 关键字。
; 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)
);
请post你出来,或者日志中任何不一致的地方进一步调试
在对 JBehave 框架进行大量调试之后,我想我已经找到了问题所在。在执行故事之前,首先将其转换为 PerformableStory,并将场景转换为 PerformableScenarios。在此过程中,可用的命名参数(来自元数据)作为哈希映射传递并与 PerformableScenario 一起存储。然而,在 JBehave 4.x 代码中,故事中的每个场景都使用和更新了相同的哈希映射。
由于每个场景都共享相同的命名参数映射,因此要解析的最后一个场景将覆盖该故事中所有其他场景的场景级元数据参数。需要为每个场景复制哈希映射。
我已经分叉了该项目并修补了代码来执行此操作。这解决了我所看到的问题。我将看看是否可以设法在 JBehave 项目上为此打开一个错误。
更新:我已经在 JBehave 项目上针对这个问题打开了错误 JBEHAVE-1129。
我最近从 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 时,它又可以正常工作了。
jBehave 将加载您的整个测试套件,然后使用找到的指定语法 here 对其进行解析。如果编译的测试不符合预期的语法(例如,不合适的关键字等),它会导致 jBehave 具有看似零星的行为。
测试您的 jBehave 测试是否符合标准的一种方法是在场景加载后但在执行和匹配语法之前打印出场景的文本表示。在上面的示例中,我可以看到不支持 narrative 'When' 关键字。
; 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)
);
请post你出来,或者日志中任何不一致的地方进一步调试
在对 JBehave 框架进行大量调试之后,我想我已经找到了问题所在。在执行故事之前,首先将其转换为 PerformableStory,并将场景转换为 PerformableScenarios。在此过程中,可用的命名参数(来自元数据)作为哈希映射传递并与 PerformableScenario 一起存储。然而,在 JBehave 4.x 代码中,故事中的每个场景都使用和更新了相同的哈希映射。
由于每个场景都共享相同的命名参数映射,因此要解析的最后一个场景将覆盖该故事中所有其他场景的场景级元数据参数。需要为每个场景复制哈希映射。
我已经分叉了该项目并修补了代码来执行此操作。这解决了我所看到的问题。我将看看是否可以设法在 JBehave 项目上为此打开一个错误。
更新:我已经在 JBehave 项目上针对这个问题打开了错误 JBEHAVE-1129。