JBehave 4.0中的场景元参数

时间:2015-09-22 18:54:54

标签: jbehave

我最近从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"有时"两个",当它应该总是"一个"。

有谁知道这里可能会发生什么?我已经尝试将Jbehave-Core更改为旧版本的4.0版本,但它们都表现出相同的行为。当我切换回3.10然后再次正常工作。

2 个答案:

答案 0 :(得分:2)

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

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

我已经分叉了项目并修补了代码来执行此操作。这解决了我所看到的问题。我将看看我是否可以在JBehave项目中为此设置一个bug。

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

答案 1 :(得分:1)

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

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

$.ajax({
    url: "/media/xml/country.xml",
    type: "GET",
    dataType: "xml",
    success: function (xmlResponse) {
        var data = $("ROW", xmlResponse).map(function () {
            return {
                label: $("city", this).text() + ", " + ($.trim($("country", this).text()) || "(unknown country)"),
                city: $.trim($("city", this).text()),
                country: $.trim($("country", this).text())
            };
        }).get();
        $("#id_city").autocomplete({
            source: function (req, response) {
                var re = $.ui.autocomplete.escapeRegex(req.term);
                var matcher = new RegExp("^" + re, "i");
                response($.grep(data, function (item) {
                    return matcher.test(item.city);
                }));
            },
            minLength: 2,
            select: function (event, ui) {
                $("p#result").html(ui.item ? "Selected: " + ui.item.label + ", cityId: " + ui.item.city : "Nothing selected, input was " + this.value);
                $("#id_city").val(ui.item.city);
                $("#country").val(ui.item.country);
                return false;
            },
            _renderItem: function (ul, item) {
                return $("<li></li>")
                    .data("value", item)
                    .append("<a>" + item.label + "</a>")
                    .appendTo(ul);
            }
        });
    }
});

我无法在版本之间找到要区分的语法文件,但找到了语法更新历史记录here。看起来很可能jBehave修改了语法之间的变化。

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

error

请将您的日志或日志中的任何不一致信息发布到