黄瓜场景中的随机字符串
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/
我正在使用 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/