一、搭建背景
基于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 json
def newReceiptParam(uniqueNo,invoiceType):
param="{\"uniqueNo\":\"test\",\"invoiceType\":\"6\"}"
paramNew=json.loads(param)
paramNew['uniqueNo']=uniqueNo
paramNew['invoiceType']=invoiceType
param=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_term
data['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']=0
data['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 + mortgage
print(url)
return url
elif int(ticket_type)==1 and int(env)==2:
url = pre_uri + mortgage
print(url)
return url
elif int(ticket_type) == 2 and int(env) == 1:
url = test_uri + take_record
print(url)
return url
elif int(ticket_type) == 2 and int(env) == 2:
url = pre_uri + take_record
print(url)
return url
elif int(ticket_type) == 3 and int(env) == 1:
url = test_uri + record
print(url)
return url
elif int(ticket_type) == 3 and int(env) == 2:
url = pre_uri + record
print(url)
return url
elif int(ticket_type) == 4 and int(env) == 1:
url = test_uri + gps_remove
print(url)
return url
elif int(ticket_type) == 4 and int(env) == 2:
url = pre_uri + gps_remove
print(url)
return url
elif int(ticket_type) == 5 and int(env) == 1:
url = test_uri + gps_install
print(url)
return url
elif int(ticket_type) == 5 and int(env) == 2:
url = pre_uri + gps_install
print(url)
return url
elif int(ticket_type) == 6 and int(env) == 1:
url = test_uri + supplement
print(url)
return url
elif int(ticket_type) == 6 and int(env) == 2:
url = pre_uri + supplement
print(url)
return url
elif int(ticket_type) == 7 and int(env) == 1:
url = test_uri + appointment
print(url)
return url
elif int(ticket_type) == 7 and int(env) == 2:
url = pre_uri + appointment
print(url)
return url
elif int(ticket_type) == 8 and int(env) == 1:
url = test_uri + send
print(url)
return url
elif int(ticket_type) == 8 and int(env) == 2:
url = pre_uri + send
print(url)
return url
elif int(ticket_type) == 9 and int(env) == 1:
url = test_uri + record
print(url)
return url
elif int(ticket_type) == 9 and int(env) == 2:
url = pre_uri + sign
print(url)
return url
elif int(ticket_type) == 10 and int(env) == 1:
url = test_uri + sign
print(url)
return url
elif int(ticket_type) == 10 and int(env) == 2:
url = pre_uri + transfer
print(url)
return url
elif int(ticket_type) == 11 and int(env) == 1:
url = test_uri + transfer
print(url)
return url
elif int(ticket_type) == 11 and int(env) == 2:
url = pre_uri + fallfile
print(url)
return url
elif int(ticket_type) == 12 and int(env) == 1:
url = test_uri + fallfile
print(url)
return url
elif int(ticket_type) == 12 and int(env) == 2:
url = pre_uri + fallfile
print(url)
return url
elif int(ticket_type) == 13 and int(env) == 1:
url = test_uri + tax_finish
print(url)
return url
elif int(ticket_type) == 13 and int(env) == 2:
url = pre_uri + tax_finish
print(url)
return url
五、如何使用团队关键字
5、使用车务关键字
- 安装
pip install 关键字下载
- 引用
Resource ../vehicleAssetKeywords.robot