• Python 学习笔记20 自定义robot Framework 关键字


     Robot Framework 自定义关键字

    Robot framework 自定义了一些关键字我们可以把他们当作函数在设计测试用例的时候使用。

    同时RF也提供了许多第三方的库,我们可以自己下载使用。

    当时我们在实际工作中,会编写一些自己的函数来设计测试用例。

    自定义关键的方法有两种:

     

    方法一:

    如果你编写的python模块没有使用面向对象的方法,那么直接在界面中选择对应的python文件即可:

     我在D盘下,新建了一个hello.py文件,里面代码如下:

    # -*- coding : utf-8 -*-
    
    def hello_world():
        print("hello, world!")

    我们打开robot framework, 选择library,在弹出的窗口中,直接选刚才的文件即可:

    如果库文件导入正确, 库的名字是黑色的,如果是红色的就表示,有错误。

    导入成功后,我们可以按下F5键,在弹出的库关键字查询中我啊们就可以看到我们刚才导入的库:

    选择好source hello,我们会看到刚才文件中的函数变成了自定义关键字:

    我们尝试在测试用例中,使用这个自定义关键字,发现可以正常使用:

     方法二

     如果我们的python代码中使用了面向对象方法,那么我们就不能使用方法一了,因为RF不能调用对象,我们则需要其他方法来实现。

    首先我们要进入到Python的运行目录,找到site-packages目录下,这个目录下存放的我们下载的一些python包。

    1. 我们新建一个文件夹名叫: ‘ParameterAndSettings’, 这个将来会作为library进行使用。

    2. 我们在该目录下新建一个python文件, Settings.py

    代码如下:

    import json
    import os
    from collections import namedtuple
    import random
    from datetime import datetime, timedelta
    
    
    
    
    class Settings(object):
        def __init__(self):
            file_path = 'C:Program Files (x86)Python37Libsite-packagesParameterAndSettingsconfiguration.json'
            try:
                if os.path.isfile(file_path):
                    with open(file_path, 'r') as fileobject:
                        data = fileobject.read()
                        try:
                            json_obj = json.loads(data, object_hook=lambda d: namedtuple('json_obj', d.keys())(*d.values()))
                        except Exception as e:
                            raise Exception("Settings:  Load the configuration to Json failed.
     " )
                            raise Exception("Settings:  File is:  %s" % (file_path))
    
                        self.server = json_obj.server
                        self.modality = eval(json_obj.modality)
                        self.bodypart = eval(json_obj.bodypart)
                        self.grender = eval(json_obj.grender)
                        self.notifyserver_exam_body_content = json_obj.notifyserver_exam_body_content
                        self.watermark_path = json_obj.watermark_path
                        self.db_connectString = json_obj.db_connectString
                        self.db_driver = json_obj.db_driver
                        self.db_server = json_obj.db_server
                        self.db_default_database = json_obj.db_default_database
                        self.db_uid = json_obj.db_uid
                        self.db_pwd = json_obj.db_pwd
                        self.report_template_file = json_obj.report_template_file
                        self.report_file = json_obj.report_file
                        self.report_default_printer = json_obj.report_default_printer
                        self.EHDPS_status_url = json_obj.EHDPS_status_url
                        self.EHDPS_printtask_create_url = json_obj.EHDPS_printtask_create_url
                        self.EHDPS_printtask_print_url = json_obj.EHDPS_printtask_print_url
                        self.EHDPS_printtask_report_getinfo_url = json_obj.EHDPS_printtask_report_getinfo_url
                        self.EHDPS_printtask_report_print_url = json_obj.EHDPS_printtask_report_print_url
                        self.EHDPS_printtask_status_url = json_obj.EHDPS_printtask_status_url
                        self.EHDPS_printtask_status_dict = eval(json_obj.EHDPS_printtask_status_dict)
                        self.EHDUS_upload_report_upload_url = json_obj.EHDUS_upload_report_upload_url
                        self.Printmode_dict_mode_value = eval(json_obj.Printmode_dict_mode_value)
                        self.Printmode_dict_value_mode = eval(json_obj.Printmode_dict_value_mode)
                        self.Integration_URL = json_obj.Integration_URL
                        self.Notify_URL = json_obj.Notify_URL
                        self.Holdflag_dict_mode_value = eval(json_obj.Holdflag_dict_mode_value)
                        self.Holdflag_dict_value_mode = eval(json_obj.Holdflag_dict_value_mode)
                else:
                    raise Exception("File Error", "The file %s is not exist." % (file_path))
            except Exception:
                raise Exception("Settings:  init failed." )
    
        '''
        Random return a modality
        '''
        def random_modality(self):
            modality = self.modality[random.randint(0, len(self.modality) - 1)]
            return modality
    
        '''
        Random return a bodypart
        '''
        def random_bodypart(self):
            modality_type = self.bodypart[random.randint(0, len(self.bodypart) - 1)]
            return modality_type
    
        '''
        Random return a gender
        '''
        def random_gender(self):
            grender = self.grender[random.randint(0, len(self.grender) - 1)]
            return grender
    
        '''
        Random return a brithday
        '''
        def random_brithday(self):
            random_number = random.randint(0, 100)
            random_days = random_number * 365
            brithday = (datetime.now() - timedelta(days=random_days)).strftime('%Y-%m-%d')
            return brithday
        '''
        return the content with string type.
        '''
        def get_notifyserver_exam_body_content(self):
            ret = self.notifyserver_exam_body_content
            return ret
    
    '''
    settings = Settings()
    print(settings.server)
    '''

    3. 确保代码无误,可以正常使用

    4. 在同级目录下新建一个__init__.py文件,该文件的目的是将该目录变成一个python的模块包。

    5. 我们在文件中输入一下代码:

    # -*- coding: utf-8 -*-
    from ParameterAndSettings.Settings import Settings
    __verison__ = "0.1.1"
    
    class ParameterAndSettings(Settings):
        ROBOT_LIBRARY_SCOPE = 'GLOBAL'

    我们看到我们从python文件中,导入我们定义的Settings模块,并定义了一个名叫 ParameterAndSettings的class,这个class将成为RF的库文件。

    Settings的中的函数将成为关键字:

    并且能够在case中使用:

     需要注意的是:

    1. 库文件里面,定义对象的文件名称要和文件中定义的对象名称要一致。就是说ParameterAndSettings文件夹下的Settings.py中定义的对象的名称必须是 【Settings】

    2. 对象定义文件中不能出现相对路径否则会报错: 比如"./ path",  path = os.join(paath1, path2)等。

    3. 如果库文件导入失败了,可以在Tools->View RIDE Log中查看错误原因。

  • 相关阅读:
    BZOJ 3252: 攻略(思路题)
    BZOJ 2821: 作诗(Poetize)(分块)
    BZOJ 2597: [Wc2007]剪刀石头布(费用流)
    BZOJ 1565: [NOI2009]植物大战僵尸(网络流+缩点)
    BZOJ 1927: [Sdoi2010]星际竞速(费用流)
    BZOJ 5120: [2017国家集训队测试]无限之环(费用流)
    洛谷 5205 【模板】多项式开根
    LOJ 2737 「JOISC 2016 Day 3」电报 ——思路+基环树DP
    LOJ 2736 「JOISC 2016 Day 3」回转寿司 ——堆+分块思路
    bzoj 2216 [Poi2011]Lightning Conductor——单调队列+二分处理决策单调性
  • 原文地址:https://www.cnblogs.com/wanghao4023030/p/11417438.html
Copyright © 2020-2023  润新知