自动化测试之cucumber(三)

基本类型传参正则

最近在使用cucumber的时候一直找不到double该使用什么正则,官网上只有int的例子,其他资料也一直找不到。最后终于在源码调试的时候,在Runtime.loadBackends里发现了对应的正则,特此记下。

类型 正则
biginteger "-?\d+" 或者 "\d+"
string ""([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'"
bigdecimal "-?\d*[.,]\d+"
byte "-?\d+" 或者 "\d+"
double "-?\d*[.,]\d+"
short "-?\d+" 或者 "\d+"
float "-?\d*[.,]\d+"
word "\w+"
int "-?\d+" 或者 "\d+"
long "-?\d+" 或者 "\d+"

其中String也可以用.*

这些正则应该是cucumber表达式使用的正则,word和官网的一样,而且string都需要加双引号或者单引号。可能cucumber表达式最后就是根据这些类型转换成正则表达式吧。

自定义类型

文档1
文档2
一开始以为自定义类型只能在cucumber表达式里使用,后来由于cucumber for java这个插件对cucumber表达式支持的不太好,只能研究使用正则表达式。后来尝试了一下,原来自定义类型其实就是根据正则匹配后,调用transform转换成自定义类型的类后,作为入参使用的。所以在正则表达式里使用自定义类型使用的正则,然后在入参里就可以使用定义返回的class了

@Override
public void configureTypeRegistry(TypeRegistry typeRegistry) {
    //View是一个枚举类,就不列出了
    typeRegistry.defineParameterType(new ParameterType<>(
            "view",
            "视图1|视图2|视图3",
            View.class,
            View::getViewByName
    ));
}
@Given("^(视图1|视图2|视图3)$")
public void testCustomParameterTypes( View view) {
    // 视图1|视图2|视图3 就被转换成枚举View
}

update at 2018年11月05日14:45:47
今天用正则表达式对long入参的时候,使用(\d+)。但是报无法解析类型,一直以为是另一个参数出错了,结果进cucumber源码调试的时候,发现(\d+)被固定解析为int。很不理解,之前以为相同正则不同类型的时候,cucumber会根据入参类型,解析成对应的类型,但是实际并不是。下面摘录ParameterTypeRegistry类的一段代码。

public <T> ParameterType<T> lookupByRegexp(String parameterTypeRegexp, Pattern expressionRegexp, String text) {
    SortedSet<ParameterType<?>> parameterTypes = parameterTypesByRegexp.get(parameterTypeRegexp);
    if (parameterTypes == null) return null;
    if (parameterTypes.size() > 1 && !parameterTypes.first().preferForRegexpMatch()) {
    // We don't do this check on insertion because we only want to restrict
    // ambiguity when we look up by Regexp. Users of CucumberExpression should
    // not be restricted.
    List<GeneratedExpression> generatedExpressions = new CucumberExpressionGenerator(this).generateExpressions(text);
    throw new AmbiguousParameterTypeException(parameterTypeRegexp, expressionRegexp, parameterTypes, generatedExpressions);
    }
    return (ParameterType<T>) parameterTypes.first();
}

以(\d+)为例子,注册的parameterTypesByRegexp有5个:int,long等(上面表格里有),但是在返回的时候,固定返回第一个,即int
return (ParameterType<T>) parameterTypes.first();
注释上说在使用正则的时候想避免歧义,建议使用cucumber表达式。我改用cucumber表达式确实能解决问题,但是IDEA上cucumber for java插件又没有对cucumber表达式的支持,feature文件里语句写错了也不知道,实在很纠结。
后来查了下,IDEA2018.3版本修改了这个问题,现已推出EAP版本,正式版估计也快了。下载了2018.3版本后,实测可行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。