黄瓜场景中的随机字符串

Random string in cucumber scenarios

我正在使用 Cucumber 测试 GUI。我需要测试GUI的CRUD操作。

当我编写一个在 GUI 中创建新实体的场景时,我无法多次 运行,因为第二次场景失败,因为我为实体指定的 ID 已经存在(在第一次运行)在系统中第二次我运行测试.

我正在测试的系统不允许删除实体。系统需要以特殊模式启动才能删除实体,所以不能删除测试后创建的实体。

如果我可以使用随机数作为实体 ID,那就太好了。例如:

when user creates a new Branch with following values:
|Branch ID|<random_string_1>|
|Address|1, abc, def.|
|Telephone|01111111111|
And user searches for a branch by "Branch ID" = "<random_string_1>"
Then branch details should be as following
|Branch ID|<random_string_1>|
|Address|1, abc, def.|
|Telephone|01111111111|

cucumber 中有这样的选项吗?或者,还有其他方法可以实现吗?

最后,我将 RandomStringTransformer class 添加到测试套件中:

    public class RandomStringTransformer extends Transformer<String> {
        private static final Map<String, String> RANDOM_STRINGS = new HashMap<>();   //Key -> random string
        public static final RandomStringTransformer INSTANCE = new RandomStringTransformer();

        @Override
        public String transform(String input) {
            return transformString(input);
        }

        public DataTable transform(DataTable dataTable) {
            dataTable.getGherkinRows().forEach(dataTableRow -> dataTableRow.getCells().replaceAll(this::transformString));
            return dataTable;
        }

        private String transformString(String input) {
            final String[] inputCopy = {input};
            Map<String, String> replacements = new HashMap<>();
            Matcher matcher = Pattern.compile("(<random_string_[^>]*>)").matcher(input);
            while (matcher.find()) {
                String group = matcher.group(0);
                replacements.put(group, RANDOM_STRINGS.computeIfAbsent(group, key -> Utilities.getNextUniqueString()));
            }
            replacements.forEach((key, value) -> inputCopy[0] = inputCopy[0].replace(key, value));
            return inputCopy[0];
        }
    }

并在步骤定义中使用了转换器:

    @When("^user creates a branch of name "([^"]*)" with following values$")
    public void branchIsCreatedWithDetails(@Transform(RandomStringTransformer.class) String branchName, DataTable fieldValues) {
        fieldValues = RandomStringTransformer.INSTANCE.transform(fieldValues);
        //Now, fieldValues table values and branchName are replaced with random values if they were in format <random_string_SOMETHING>
    }

Cucumber 3 不再支持 @Transform 注释。 您必须在方法主体中手动转换数据。

@When("^user creates a branch of name "([^"]*)" with following values$")
public void branchIsCreatedWithDetails(String branchName, DataTable fieldValues) {
    fieldValues = RandomStringTransformer.INSTANCE.transform(fieldValues);
    //Now, fieldValues table values and branchName are replaced with random values if they were in format <random_string_SOMETHING>
}

阅读此内容以了解有关迁移的更多信息:http://grasshopper.tech/98/