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