美文网首页自动化
自动化测试之cucumber(三)

自动化测试之cucumber(三)

作者: EmilioWong | 来源:发表于2018-10-19 14:26 被阅读0次

    基本类型传参正则

    最近在使用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版本后,实测可行。

    相关文章

      网友评论

        本文标题:自动化测试之cucumber(三)

        本文链接:https://www.haomeiwen.com/subject/rbbyzftx.html