美文网首页
Robot Framework Python扩展关键字

Robot Framework Python扩展关键字

作者: 自如_ | 来源:发表于2019-07-20 15:55 被阅读0次

    Python 模块作为测试库

    我们可以创建 Python 模块作为测试库,比如 python 模块叫 MyLibrary,对应的 Python 文件是 MyLibrary.py 。那么测试库名字就是 MyLibrary。定义在 Python 模块文件中的函数,名字前有 _ 前缀的不会作为关键字。

    比如下面的代码中 returnlist 会作为关键字,而 _returnlist2 不会

    def returnlist():
        return [1,2]
    
    def _returnlist2():
        return [1,2]
    

    这边 _returnlist2 就报错了。

    而且 RF 使用关键字的时候,中间可以加上任意的空格,上面 returnlist,下面这样用都可以:

    returnlist
    return list
    ruturn    list
    

    python 模块文件定义好以后,RF 就可以使用它了。要注意的是,要保证其在 Python 模块的搜索路径中,这样 RF 才能找到它。

    自己定义关键字名称

    如果我们觉得函数名本身比如 returnlist 觉得这个名字不大好听,我们可以自己给库里面的关键字换个名字,比如说 returnlist 我想给它取个名字叫 Hello,就可以导入 Robot API 下面的装饰器 keyword。大家看一下。

    from robot.api.deco import keyword #装饰器 zhenzhen
    
    @keyword('Hello')
    def returnlist():
        return [1,2]
    
    def _returnlist2():
        return [1,2]
    

    我们用的时候就可以直接写 Hello

    *** Settings ***
    Library    tlib1
    
    *** Test Cases ***
    case1
        ${a}=       Hello
        log to console    ${a}
    

    Python类作为测试库

    我们也可以把 python 类名作为 RF 测试库的名字,比如 python 模块叫 tlib2,对应的 python 文件是 tlib2.py。这个模块文件中有个类,名字叫 SubLibrary 。如下所示:

    class SubLibrary:
        def returnint(self):
            return 3
        
        def _returnint2(self):
            return 4
    

    那么我们可以将 SubLibrary 作为测试库直接使用。可以在 RF 文件中这样声明

    *** Settings ***
    Library    tlib2.SubLibrary
    
    *** Test Cases ***
    case1
        ${a}=       returnint
        log to console    ${a}
        ${b}=       _returnint2
        log to console    ${b}
    
    

    同样的,该类中的成员方法,名称前有 _ 前缀的不会作为关键字。比如在这里,returnint 会作为关键字,而 _returnint2 不会。

    通过这种以类的方式导入的库,可以提供导入时的参数给用户使用。主要用来提供一些初始化参数。这是通过类的初始化方法来实现的,比如:

    class SubLibrary2:
        def __init__(self,host,port):
            self.host = host
            self.port = port
    
        def printaddr(self):
            logger.console('host:%s,ip:%s' % (self.host,self.port))
    

    这边有一个 SubLibrary2,里面有一个 __init__(self,host,port) 函数,这个就是这个类实例化的时候走到的,它带两个参数一个是 host,一个是 port 。一个是地址,一个是端口。然后 printaddrhostport 打印出来。

    那我们 RF 导入的时候,可以这样声明:

    *** Settings ***
    Library    tlib2.SubLibrary2   localhost  80
    
    *** Test Cases ***
    case1
        print addr
    

    相当于导入的实例化的时候,就把它加进来了。

    还有一点如果这个类和模块文件是同名的,声明的时候就可以简单一点不用先声明这个模块再声明这个类了。比如我这里有个模块名为 tlib2.py 。这里面有个类的名字也叫 tlib2

    image.png

    里面的内容是和 SubLibrary2 是一样的,传参的时候传的是 ** host、port**,打印的时候也是 host、port,我们直接就可以导入不用像Library tlib2.SubLibrary2 这个一样,把它俩都写进来了,可以直接只写一个:

    *** Settings ***
    Library    tlib2  localhost  80
    *** Test Cases ***
    case1
        print addr
    

    导入的时候直接就写了一个 Library tlib2 传入了参数 localhost 80 。如果类和模块名字一样就可以只写一个。这是一个省略的写法。

    python扩展库的搜索规则

    完全是按照 python 的模块的搜索规则来的,如果 python 库是在一个包内pylib/login/rightpass.py.

    声明的时候,可以在RF文件中像python导入包里面的模块那样的语法,如下.

    *** Settings ***
    Library    pylib.login.rightpasswd
    

    RF 也支持 下面的格式声明库,搜索路径的写法,后面一定要带上.py

    Library  pylib/login/rightpasswd.py
    

    总结如下:

    • settting 表中 声明 资源文件和变量文件:

    路径,目录之间的分割符不用 . 而是用 \

    • settting 中声明 测试库(python 实现的):
      路径,目录之间的分割符,可以用 点 .也可以用 斜杠 /
      路径,目录之间的分割符 用 . 后面不加 py,用斜杠后面加.py

    相关文章

      网友评论

          本文标题:Robot Framework Python扩展关键字

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