2015-09-22 52 views
1

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

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 
} 

在上面的例子中,当scenarioStep被调用情景1则有时会通过一个品牌的“一”和有时“二”,当它应该永远是“一”。

有没有人有任何想法可能发生在这里?我已经尝试将Jbehave-Core更改为旧版本的4.0版本,但它们都表现出相同的行为。当我切换回3.10时,它再次正常工作。

+0

另外,执行它们时,你的步骤是什么样的?通常,命名参数映射到步骤模式中的$分隔参数,因此可以使用@Given作为品牌名称$ brand,并带有hosturl $ url – Chrizt0f

+0

在示例代码的底部有一个示例步骤。 –

回答

2

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

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

我已经分叉项目并修补代码来执行此操作。这已经解决了我所看到的问题。我将会看看我是否能够在JBehave项目上为此打开一个bug。

更新:我已经在JBehave项目上为此问题打开了错误JBEHAVE-1129。

+0

它看起来像修复已被纳入即将发布的4.0.5版本。 –

1

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

测试您的jBehave测试为犹太洁食的一种方法是在加载后打印出您的方案的文本表示,但在执行之前将其与文法相匹配。在上面的例子中,我可以看到叙述'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) 
); 

请发表您的出来,或在日志中的任何不一致,以进一步调试

+0

当我在这里举例时,叙述中的错误是我的错。我已经离开办公室了,所以还没有跟进你的建议。我会按照你的建议去做,看看发生了什么。 –

+0

我检查了叙述和场景的解析。一切都结束了。我正在进行一些调试以尝试和了解更多信息。 –