Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cucumber 黄瓜场景中的随机字符串_Cucumber_Bdd_Gherkin - Fatal编程技术网

Cucumber 黄瓜场景中的随机字符串

Cucumber 黄瓜场景中的随机字符串,cucumber,bdd,gherkin,Cucumber,Bdd,Gherkin,我正在使用cucumber测试GUI。我需要测试GUI的CRUD操作 当我编写在GUI中创建新实体的场景时,我无法多次运行,因为第二次场景失败,因为我为该实体指定的ID在第二次运行测试时已经存在(在第一次运行中创建) 我正在测试的系统不允许删除实体。系统需要在特殊模式下启动以删除实体,因此删除测试后创建的实体不是一个选项 如果我可以使用一个随机数作为实体id,那就太好了。例如: when user creates a new Branch with following values: |Bran

我正在使用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|
当用户创建具有以下值的新分支时:
|分支ID||
|地址| 1,美国广播公司,def|
|电话| 011111111|
用户通过“分支ID=”搜索分支
然后分支详细信息应如下所示
|分支ID||
|地址| 1,美国广播公司,def|
|电话| 011111111|

在cucumber中有这样的选择吗?或者,我还有其他方法可以做到这一点吗?

这就是我最后所做的

将此transformer类添加到测试套件中

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];
    }
}
public类RandomStringTransformer扩展了Transformer{
private static final Map RANDOM_STRINGS=new HashMap();//Key->RANDOM string
公共静态最终RandomStringTransformer实例=新的RandomStringTransformer();
@凌驾
公共字符串转换(字符串输入){
返回转换字符串(输入);
}
公共数据表转换(数据表){
dataTable.getGherkinRows().forEach(dataTableRow->dataTableRow.getCells().replaceAll(this::transformString));
返回数据表;
}
私有字符串转换字符串(字符串输入){
最终字符串[]inputCopy={input};
Map replacements=newhashmap();
Matcher Matcher=Pattern.compile(“(]*>)”).Matcher(输入);
while(matcher.find()){
字符串组=匹配器组(0);
replacements.put(group,RANDOM_STRINGS.computeIfAbsent(group,key->Utilities.getNextUniqueString());
}
replacements.forEach((键,值)->inputCopy[0]=inputCopy[0]。replace(键,值));
返回inputCopy[0];
}
}
在步骤defs中使用了变压器

@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>
}
@当(“^user创建了一个名为”([^”]*)的分支,其值如下$”)
public void branchIsCreatedWithDetails(@Transform(RandomStringTransformer.class)字符串branchName,DataTable字段值){
fieldValues=RandomStringTransformer.INSTANCE.transform(fieldValues);
//现在,fieldValues表值和branchName被替换为随机值(如果格式为随机值)
}

这就是我最后所做的

将此transformer类添加到测试套件中

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];
    }
}
public类RandomStringTransformer扩展了Transformer{
private static final Map RANDOM_STRINGS=new HashMap();//Key->RANDOM string
公共静态最终RandomStringTransformer实例=新的RandomStringTransformer();
@凌驾
公共字符串转换(字符串输入){
返回转换字符串(输入);
}
公共数据表转换(数据表){
dataTable.getGherkinRows().forEach(dataTableRow->dataTableRow.getCells().replaceAll(this::transformString));
返回数据表;
}
私有字符串转换字符串(字符串输入){
最终字符串[]inputCopy={input};
Map replacements=newhashmap();
Matcher Matcher=Pattern.compile(“(]*>)”).Matcher(输入);
while(matcher.find()){
字符串组=匹配器组(0);
replacements.put(group,RANDOM_STRINGS.computeIfAbsent(group,key->Utilities.getNextUniqueString());
}
replacements.forEach((键,值)->inputCopy[0]=inputCopy[0]。replace(键,值));
返回inputCopy[0];
}
}
在步骤defs中使用了变压器

@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>
}
@当(“^user创建了一个名为”([^”]*)的分支,其值如下$”)
public void branchIsCreatedWithDetails(@Transform(RandomStringTransformer.class)字符串branchName,DataTable字段值){
fieldValues=RandomStringTransformer.INSTANCE.transform(fieldValues);
//现在,fieldValues表值和branchName被替换为随机值(如果格式为随机值)
}

Cucumber 3不再支持transformer注释。因此,您必须替换为常规表单:

@当(“^user创建了一个名为”([^”]*)的分支,其值如下$”)
public void instanceTableIsFilteredForUniqueInstanceBy(字符串分支名称、数据表字段值){
fieldValues=RandomStringTransformer.INSTANCE.transform(fieldValues);
//现在,fieldValues表值和branchName被替换为随机值(如果格式为随机值)
}

有关迁移的详细信息,请阅读以下内容:

Cucumber 3不再支持transformer批注。因此,您必须用常规表单替换:

@当(“^user创建了一个名为”([^”]*)的分支,其值如下$”)
public void instanceTableIsFilteredForUniqueInstanceBy(字符串分支名称、数据表字段值){
fieldValues=RandomStringTransformer.INSTANCE.transform(fieldValues);
//现在,fieldValues表值和branchName被替换为随机值(如果格式为随机值)
}

阅读本文了解迁移的更多信息:

为什么不使用编程语言的一些随机化函数创建id?看起来这个id只在这个场景中使用。这样,您就无需在功能文件中提及id详细信息。@Grasshopper每个实体类型的id字段名称都不同。创建具有给定详细信息的实体的步骤def是通用的,它适用于任何实体类型,因此我必须根据实体类型编写特殊逻辑。这就是为什么我不喜欢那样做。此外,使用的随机字符串需要在后面的步骤中引用。例如,上述示例的第二步使用t