一、搭建背景
基于RF框架、guardian工程搭建车务公共方法。为提升日常测试工作效率,通过脚本共享的方式减少团队人员重复编写及跨团队沟通的成本。同时通过调用公共方法完成基于场景串联的自动化测试。
二、选取范围
1、本系统的基础服务
- 模拟工单的完成
- 消息:
appname:履约、车办办、解抵押等不同应用都需要接收工单完成消息
tag是工单类型
- 接口:- 触发工单上传反馈资料、审核通过等接口从而完成业务工单
2、依赖的三方服务
模拟发票开票成功,需要在业财系统中有开票结果数据。模拟触发业财开票结果接口。
3、团队小工具
提效小工具,减少重复性工作,如生成dubbo服务的curl命令,生成不同时间格式,根据48期还款账单生成mock还款计划等。
4、可抽象出来的校验
交易创建履约时,履约系统各表数据的数据校验进行封装。
小结:
不依赖太多业务属性,如团队小工具,登录app、工作台等基础服务。上下游串联的接口,仍然适合写在造数工厂。
三、如何搭建接入:
【参考文档】
rf :https://robotframework.org/robotframework/
https://robotframework.org/
https://github.com/MarketSquare/robotframework-requests
http://robotframework.org/robotframework/latest/libraries/DateTime.html#Convert%20Time
1、创建模板
进入虚拟环境,执行命令
2、编写关键字、调试
【问题解决】
1、需要引用到py
py文件能够自动打包,可一并手动上传
2、json字符串转成字典
*** Settings ***Library json*** Keywords ***testtype${FeedbackMortgage_body} Set Variable {"notHasFeedbackContent":"false","businessProperty":10}${type} Evaluate type($FeedbackMortgage_body)Log ${FeedbackMortgage_body}${FeedbackMortgage_body} json.loads ${FeedbackMortgage_body}Log ============转成字典之后的类型======${type} Evaluate type($FeedbackMortgage_body)Log ${FeedbackMortgage_body}
3、bool 值需要转换
3、生成关键字文档
生成html的本地说明文件
四、关键字示例
1、模拟开票
- 登录业财页面抓取开票接口
调用业财返回发票成功[Documentation] 【功能】接口描述:输入发票键序号模拟业财开票成功 <br>... 【参数信息】${uniqueNo}:字符串(必填);${invoiceType}:发票类型(必填);... 【使用方法】调用业财返回发票成功 uniqueNo invoiceType ... [TEST-AUTO-CORE][Arguments] ${uniqueNo} ${invoiceType} ${env_id}=default${header} Create Dictionary X-Souche-ServiceChain=${env_id}${data_params} newReceiptParam ${uniqueNo} ${invoiceType}${resp}= remote http post ${fintax} shgzt_token getInvoiceSuccess.json ${data_params} data header=${header}Should Be True ${resp["success"]}[Return] ${resp}
- 发票参数格式转换
import jsondef newReceiptParam(uniqueNo,invoiceType):param="{\"uniqueNo\":\"test\",\"invoiceType\":\"6\"}"paramNew=json.loads(param)paramNew['uniqueNo']=uniqueNoparamNew['invoiceType']=invoiceTypeparam=json.dumps(paramNew)data={"state":param}return data
2、生成不同格式当前时间
生成不同格式当前时间[Documentation] 【功能】接口描述:输入格式生成当前时间 <br>... 【参数信息】${format}:整型(必填)输入参数1为:2022-03-04格式<br>... 输入参数2为:2022-06-12 20:00:58格式... 输入参数3为:20220612格式,年月日格式<br>... 输入参数4为:202206120312,年月日时分秒格式<br>... 输入参数5为:2022.03.04格式<br>... 【使用方法】生成不同格式当前时间 1[Arguments] ${format}#预约时间${currentDate} Run Keyword If ${format}==1 Get Current Date result_format=%Y-%m-%d... ELSE IF ${format}==2 Get Current Date result_format=%Y-%m-%d %H:%M:%S... ELSE IF ${format}==3 Get Current Date result_format=%Y%m%d... ELSE IF ${format}==4 Get Current Date result_format=%Y%m%d%H%M%S... ELSE IF ${format}==5 Get Current Date result_format=%Y.%m.%d[return] ${currentDate}
3、dubbo服务生成curl命令
生成curl命令[Documentation] 【功能】接口描述:根据dubbo服务名生成不同ip的curl命令 <br>[Arguments] ${interface} ${methodname} ${params} ${appname} ${dubbotoken} ${env}${cur_host} Set Variable ${ip[0]}:20880${commands} Run Keyword If "&" in '''${params}''' set variable curl --data-urlencode '${params}' -H "Content-Type: application/json" -H '_method_name: ${methodname}' -H '_dubbo_token: ${dubbotoken}' -X POST '${cur_host}/${interface}'... ELSE set variable curl -d '${params}' -H "Content-Type: application/json" -H '_method_name: ${methodname}' -H '_dubbo_token: ${dubbotoken}' -X POST '${cur_host}/${interface}'log many ${commands}[return] ${commands}
4、根据账单还款表的csv数据mock还款计划数据
mock还款数据[Documentation] 【功能】接口描述:根据导出来的还款表生成还款计划... 【参数信息】${file_path}:还款表的路径<br>... 【使用方法】mock还款数据 /Users/aisuzhen/Downloads/query.csv<br>... 【接口返回】接口返回${mock_reapy},打印日志:========result is mock_reapy=======<br>[Arguments] ${file_path}${mock_reapy} mock_reapy ${file_path}Log Many ========result is mock_reapy======= :${mock_reapy}
def trasfer_data_status(num):status={"0":"NORMAL","1":"OVD","2":"CLEAR" }return status.get(num)def trasfer_data_curTerm(num):curTerm={"0":"false","1":"true"}return curTerm.get(num)def mock_reapy(file_path):mock_repay = []data = {}with open(file_path, newline='') as csvfile:reader = csv.DictReader(csvfile)for row in reader:#===========打印还款数据==========# print(row['status'], row['curTerm'],row['paidIntBal'],row['paidPrinBal'],row['termStartDate'],row['termEndDate'],row['termNo'],row['termNomInt'],row['termNomPrin'],row['termOvdInt'],row['termOvdIntPenInt'],row['termOvdPrin'],row['termOvdPrinPenInt'])# print(row['status'], row['cur_term'],row['paid_int_bal'],row['paid_prin_bal'],row['term_start_date'],row['term_end_date'],row['term_no'],row['term_nom_int'],row['term_nom_prin'],row['term_ovd_int'],0,row['term_ovd_prin'],0)# ===========还款状态转换枚举==========status = trasfer_data_status(row['status'])data['status']=status# ===========当前期状态转换枚举==========cur_term =trasfer_data_curTerm(row['cur_term'])data['curTerm']=cur_termdata['paidIntBal']=row['paid_int_bal']data['paidPrinBal']=row['paid_prin_bal']data['termStartDate']=row['term_start_date']data['termEndDate']=row['term_end_date']data['termNo']=row['term_no']data['termNomInt']=row['term_nom_int']data['termNomPrin']=row['term_nom_prin']data['termOvdInt']=row['term_ovd_int']data['termOvdIntPenInt']=0data['termOvdPrin']=row['term_ovd_prin']data['termOvdPrinPenInt']=0# ===========打印原Python字典对象==========# print(data)# ===========转成json字符串==========info_data = json.dumps(data)print(info_data)mock_repay.append(info_data)print(str(mock_repay))# ===========处理多余字符==========mock_repay=str(mock_repay).replace("'","")print(mock_repay)return mock_repay
5、打开不同环境的工单类型
打开不同类型工单[Documentation] 【功能】接口描述:根据工单名称打开不同环境的页面... 【参数信息】${ticketType}工单类型枚举:<br>... 【使用方法】打开测试环境抵押工单示例:打开不同类型工单 1 1<br>[Arguments] ${env} ${ticketType}${url} chooice ${env} ${ticketType}open_ticket ${url}
def open_ticket(url):print(url)option = webdriver.ChromeOptions()option.add_experimental_option("detach", True)driver = webdriver.Chrome(chrome_options=option)driver.get(url)time.sleep(2)teacher = driver.find_element_by_name('username')teacher.send_keys("test")assistant = driver.find_element_by_name('password')assistant.send_keys("test")time.sleep(1)button = driver.find_element_by_class_name('submit-btn')time.sleep(1)button.click()time.sleep(2)def chooice(env,ticket_type):if int(ticket_type)==1 and int(env)==1:url=test_uri + mortgageprint(url)return urlelif int(ticket_type)==1 and int(env)==2:url = pre_uri + mortgageprint(url)return urlelif int(ticket_type) == 2 and int(env) == 1:url = test_uri + take_recordprint(url)return urlelif int(ticket_type) == 2 and int(env) == 2:url = pre_uri + take_recordprint(url)return urlelif int(ticket_type) == 3 and int(env) == 1:url = test_uri + recordprint(url)return urlelif int(ticket_type) == 3 and int(env) == 2:url = pre_uri + recordprint(url)return urlelif int(ticket_type) == 4 and int(env) == 1:url = test_uri + gps_removeprint(url)return urlelif int(ticket_type) == 4 and int(env) == 2:url = pre_uri + gps_removeprint(url)return urlelif int(ticket_type) == 5 and int(env) == 1:url = test_uri + gps_installprint(url)return urlelif int(ticket_type) == 5 and int(env) == 2:url = pre_uri + gps_installprint(url)return urlelif int(ticket_type) == 6 and int(env) == 1:url = test_uri + supplementprint(url)return urlelif int(ticket_type) == 6 and int(env) == 2:url = pre_uri + supplementprint(url)return urlelif int(ticket_type) == 7 and int(env) == 1:url = test_uri + appointmentprint(url)return urlelif int(ticket_type) == 7 and int(env) == 2:url = pre_uri + appointmentprint(url)return urlelif int(ticket_type) == 8 and int(env) == 1:url = test_uri + sendprint(url)return urlelif int(ticket_type) == 8 and int(env) == 2:url = pre_uri + sendprint(url)return urlelif int(ticket_type) == 9 and int(env) == 1:url = test_uri + recordprint(url)return urlelif int(ticket_type) == 9 and int(env) == 2:url = pre_uri + signprint(url)return urlelif int(ticket_type) == 10 and int(env) == 1:url = test_uri + signprint(url)return urlelif int(ticket_type) == 10 and int(env) == 2:url = pre_uri + transferprint(url)return urlelif int(ticket_type) == 11 and int(env) == 1:url = test_uri + transferprint(url)return urlelif int(ticket_type) == 11 and int(env) == 2:url = pre_uri + fallfileprint(url)return urlelif int(ticket_type) == 12 and int(env) == 1:url = test_uri + fallfileprint(url)return urlelif int(ticket_type) == 12 and int(env) == 2:url = pre_uri + fallfileprint(url)return urlelif int(ticket_type) == 13 and int(env) == 1:url = test_uri + tax_finishprint(url)return urlelif int(ticket_type) == 13 and int(env) == 2:url = pre_uri + tax_finishprint(url)return url
五、如何使用团队关键字
5、使用车务关键字
- 安装
pip install 关键字下载
- 引用
Resource ../vehicleAssetKeywords.robot

