美文网首页
RF变量的共享使用、python测试库

RF变量的共享使用、python测试库

作者: 清水秋香 | 来源:发表于2020-04-09 13:14 被阅读0次

    Variable表中声明变量

    • 在测试套件文件中声明
      变量表Variables,在变量表中声明该测试套件中用到的变量。
      在测试套件文件变量表中声明的变量,对整个套件里面所有的测试用例都有效
    *** Variables ***
    #变量表只能定义常量,不能是变量,语法只支持rf形式
    ${var}  hello word
    #列表类型传递 使用$进行接收可接受到一个整体
    @{database}  127.0.0.1  3306
    #定义字典
    &{user1}    username=auto  password=sdfsdfsdf
    
    
    *** Test Cases ***
    case1
             log to console  ${var}
             log to console  ${database}[1]
             log to console  ${user1}
             log to console  ${user1['username']}
             log to console  ${user1}[username]
             log to console  ${user1}[password]
    case2
             log to console  ${var}
             log to console  ${database}[1]
             log to console  ${user1}
             log to console  ${user1['username']}
             log to console  ${user1}[username]
             log to console  ${user1}[password]
    

    资源文件里面创建变量
    和套件文件中的用户关键字一样,套件文件中的变量表里面的变量,其作用范围只是该套件文件。我们可以定义在资源文件中。资源文件变量的定义,和上述测试套件文件中几乎一样,我们只需拷贝Variables表到资源文件中即可,注意资源文件中不可存在*** Test Cases ***测试用例。
    rc.robot资源文件

    *** Variables ***
    #变量表只能定义常量,不能是变量,语法只支持rf形式
    ${var}  hello word
    #列表类型传递 使用$进行接收可接受到一个整体
    @{database}  127.0.0.1  3306
    #定义字典
    &{user1}    username=auto  password=sdfsdfsdf
    

    test.robot测试套件

    *** Settings ***
    Resource  rc.robot
    *** Test Cases ***
    case1
        log to console  ${var}
        log to console  ${database}
        #取ip
        log to console  ${database}[0]
        log to console  ${database}
        log to console  ${user1['username']}
        log to console  ${database}
    case2
        log to console  ${database}
        log to console  ${database}[1]
        log to console   ${user1}
        log to console  ${user1['username']}
        log to console  ${user1}[username]
        log to console  ${user1}[password]
    

    变量文件
    也可以使用python模块文件提供公共变量给RF使用。只需要直接定义变量就可以了
    语法完全就是python 例如:

    #一般来说变量文件定义一些常量,放在库里面会好一点
    import random
    def get_random():
        return random.randint(0,100)
    
    url = 'http://localhost/mgr/login/login.html'
    database = ['127.0.0.1','3306']
    user1  = {'username':'auto','password':'sdfsdfsdf'}
    num1 = get_random()
    num2 = get_random()
    
    *** Settings ***
    #变量文件因为python语法的加持会比rf的变量文件易用
    
    #让rf指定变量文件这里不引用变量文件
    Variables  ./rf/rc.py
    
    # robot --help  查看参数
    
    #robot --variablefile ./rf作业4/rc1.py t2.robot
    #robot --variablefile ./rf作业4/rc.py t2.robot
    

    变量文件声明的时候,可以使用绝对路径,也可以使用相对路径。使用相对路径的时候,RF搜索变量文件规则和搜索资源文件搜索规则一样:
    首先在当前文件的目录匹配收缩,如果找不到,就在Python的模块搜索路径中搜索
    上面的*** Settings ***变量文件路径是这样写的 Variables ./rf/rc.py
    是因为rc.py所处的路径是这样的,如下图


    image.png

    但是这样不好的地方是:
    每个RF文件的路径不一样,导致每个RF文件导入变量文件的写法都不同,而且一旦移动了目录,就要修改里面的写法,比如
    Variables ./rf/rf/rc.py
    一种推荐的做法就是统一相对于项目根目录,假设项目根目录是rf,就需要像下面这样


    image.png

    也可以在命令行参数中直接指定变量文件,就可以不用在RF中声明了

     robot --variablefile day5/rf作业4/rc.py day5/t2.robot 
    
    image.png

    扩展关键字
    使用python测试库,模块文件名就是测试库的名字
    定义在python模块中的函数,名称前有_前缀的不会作为关键字。
    Python模块定义好以后,RF就可以使用它了,我们可以这样使用上面定义的测试库,要注意的是,要保证其在Python模块的搜索路径中,这样RF才能找到它
    RF在使用关键字的时候,中间可以加上任意的空格,并且大小写也可以任意
    自己定义关键字名字 _hehe不会作为关键字被rf使用

    def haha():
        return [1,2]
    #带下滑线的不能作为用户关键字
    #私有函数  不对外开放的
    #有的函数不作为外部调用只做内部封装,所以小的函数不对外开放
    def _hehe():
        return [1,2]
    

    python类作为测试库
    tlib2.py

    
    from robot.api import logger
    
    class SubLibrary:
        def return_int(self):
            return 3
    
        def _returnint2(self):
            return 4
    
    
    
    class SubLibrary2:
        def __init__(self,host,port):
            self.host = host
            self.port = port
    
        def printaddr(self):
            logger.console('host:%s,port:%s' % (self.host,self.port))
    
    
    class tlib2:
        def __init__(self,host,port):
            self.host = host
            self.port = port
    
        def printaddr(self):
            logger.console('host:%s,ip:%s' % (self.host,self.port))
    
    *** Settings ***
    Library  tlib2.SubLibrary
    
    #导入类的时候是对类做一个初始化,构造方法有参数就要传参数
    Library  tlib2.SubLibrary2  localhost  1111
    
    #可以不写模块名,当然写了也没问题
    Library  tlib2  127.0.0.1  8011
    
    #当两个库同时导入都有相同的方法时,会报错,解决办法可以用全名,好友一种办法就是不要让它名字是一样的
    
    
    *** Test Cases ***
    case
        ${var}  return_int
        log to console  ${var}
    
        #只要函数名前面带有下滑线的rf都不会作为关键字使用
        ${var}  _returnint2
        log to console  ${var}
        ${var}  printaddr
        log to console  ${var}
    
        ${var}  tlib2.SubLibrary2.printaddr
        log to console  ${var}
    

    库的搜索规则
    RF搜索库完全是按照python的模块的搜索规则来的
    如果python库是在一个包中,比如
    pylib/login/rightpass.py
    声明的时候,可以在RF文件像python导入包里面的模块那样的语法,如下
    *** Settings ***
    Library pylib/login/rightpasswd.py

    如果导入的库中存在模块的引入,引入的模块要以加入pythonpath的路径来写否则会报错

    #以login为pythonpath来写
    from haha.cfg import *
    
    
    def get_user():
        return user
    if __name__ == '__main__':
        print(get_user())
    
    *** Settings ***
    # login$ robot -P . asdf.robot 执行报错
    #[ ERROR ] Error in file '/Users/wgz/Desktop/songqin/rf/day5/login/asdf.robot': Importing test library 'haha.tlib1' failed: ModuleNotFoundError: No module named 'cfg'
    #Traceback (most recent call last):
    #  File "/Users/wgz/Desktop/songqin/rf/day5/login/haha/tlib1.py", line 1, in <module>
    #    from cfg import *
    
    #执行python文件的时候pycharm默认情况下会把自身所处的目录,添加到pythonpath中,执行了-P. 他把login当成pythonpath目录了所以找不到,所以我们要从login目录下找     改变这行代码from cfg import *
    #from haha.cfg import *   以login为基础路径来写,保持一致
    
    Library  haha.tlib1
    *** Test Cases ***
    case
        ${haha}  get user
        log to console  ${haha}
    

    如果存在继承的情况,只要导入子类就可使用父类的方法,要注意模块导入时的路径。
    父类

    from robot.libraries.BuiltIn import logger
    
    class Father():
        def __init__(self):
            print('init Father')
            logger.console('init Father')
    
        def money(self):
            return '$10000'
    
    if __name__ == '__main__':
        print(Child().use_money())
    

    子类

    from robot.libraries.BuiltIn import logger
    #模块路径要统一
    from login.Base import Father
    
    class Child(Father):
        def __init__(self):
            Father.__init__(self)
            print('init child')
            logger.console('init Child')
    
    
        def use_money(self):
            return self.money()
    
        def make_money(self):
            return '$999'
    
    if __name__ == '__main__':
        print(Child().money())
    

    robot用例

    Library  login.other.Child
    
    
    *** Test Cases ***
    case
        #money为 login.other.Child 父类的方法
        ${haha}  money
        log to console  ${haha}
    

    总结如下:
    1.在settings中声明资源文件和变量文件:
    路径,目录之间的分隔符用斜杠 / 而不是点 .

    2.在settings中声明测试库:
    路径,目录之间的分隔符,可以用点.也可以用斜杠/
    路径,目录之间的分隔符用点后面不加py,用斜杠后面加.py

    相关文章

      网友评论

          本文标题:RF变量的共享使用、python测试库

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