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)\Python37\Lib\site-packages\ParameterAndSettings\configuration.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.\n " ) 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中查看错误原因。