一、搭建背景

基于RF框架、guardian工程搭建车务公共方法。为提升日常测试工作效率,通过脚本共享的方式减少团队人员重复编写及跨团队沟通的成本。同时通过调用公共方法完成基于场景串联的自动化测试。

二、选取范围

1、本系统的基础服务

  • 模拟工单的完成
    • 消息:

appname:履约、车办办、解抵押等不同应用都需要接收工单完成消息
tag是工单类型

  1. - 接口:
  2. - 触发工单上传反馈资料、审核通过等接口从而完成业务工单

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、创建模板

进入虚拟环境,执行命令

image.png

2、编写关键字、调试

【问题解决】

1、需要引用到py

py文件能够自动打包,可一并手动上传

2、json字符串转成字典

  1. *** Settings ***
  2. Library json
  3. *** Keywords ***
  4. testtype
  5. ${FeedbackMortgage_body} Set Variable {"notHasFeedbackContent":"false","businessProperty":10}
  6. ${type} Evaluate type($FeedbackMortgage_body)
  7. Log ${FeedbackMortgage_body}
  8. ${FeedbackMortgage_body} json.loads ${FeedbackMortgage_body}
  9. Log ============转成字典之后的类型======
  10. ${type} Evaluate type($FeedbackMortgage_body)
  11. Log ${FeedbackMortgage_body}

image.png

3、bool 值需要转换

image.png

3、生成关键字文档

生成html的本地说明文件

image.png

四、关键字示例

1、模拟开票

  1. - 登录业财页面抓取开票接口
  1. 调用业财返回发票成功
  2. [Documentation] 【功能】接口描述:输入发票键序号模拟业财开票成功 <br>
  3. ... 【参数信息】${uniqueNo}:字符串(必填);${invoiceType}:发票类型(必填);
  4. ... 【使用方法】调用业财返回发票成功&emsp;uniqueNo&emsp;invoiceType&emsp;
  5. ... [TEST-AUTO-CORE]
  6. [Arguments] ${uniqueNo} ${invoiceType} ${env_id}=default
  7. ${header} Create Dictionary X-Souche-ServiceChain=${env_id}
  8. ${data_params} newReceiptParam ${uniqueNo} ${invoiceType}
  9. ${resp}= remote http post ${fintax} shgzt_token getInvoiceSuccess.json ${data_params} data header=${header}
  10. Should Be True ${resp["success"]}
  11. [Return] ${resp}
  1. - 发票参数格式转换
  1. import json
  2. def newReceiptParam(uniqueNo,invoiceType):
  3. param="{\"uniqueNo\":\"test\",\"invoiceType\":\"6\"}"
  4. paramNew=json.loads(param)
  5. paramNew['uniqueNo']=uniqueNo
  6. paramNew['invoiceType']=invoiceType
  7. param=json.dumps(paramNew)
  8. data={
  9. "state":param
  10. }
  11. return data

2、生成不同格式当前时间

  1. 生成不同格式当前时间
  2. [Documentation] 【功能】接口描述:输入格式生成当前时间 <br>
  3. ... 【参数信息】${format}:整型(必填)输入参数1为:2022-03-04格式<br>
  4. ... 输入参数2为:2022-06-12 20:00:58格式
  5. ... 输入参数3为:20220612格式,年月日格式<br>
  6. ... 输入参数4为:202206120312,年月日时分秒格式<br>
  7. ... 输入参数5为:2022.03.04格式<br>
  8. ... 【使用方法】生成不同格式当前时间 1
  9. [Arguments] ${format}
  10. #预约时间
  11. ${currentDate} Run Keyword If ${format}==1 Get Current Date result_format=%Y-%m-%d
  12. ... ELSE IF ${format}==2 Get Current Date result_format=%Y-%m-%d %H:%M:%S
  13. ... ELSE IF ${format}==3 Get Current Date result_format=%Y%m%d
  14. ... ELSE IF ${format}==4 Get Current Date result_format=%Y%m%d%H%M%S
  15. ... ELSE IF ${format}==5 Get Current Date result_format=%Y.%m.%d
  16. [return] ${currentDate}

调试结果:
image.png

3、dubbo服务生成curl命令

  1. 生成curl命令
  2. [Documentation] 【功能】接口描述:根据dubbo服务名生成不同ipcurl命令 <br>
  3. [Arguments] ${interface} ${methodname} ${params} ${appname} ${dubbotoken} ${env}
  4. ${cur_host} Set Variable ${ip[0]}:20880
  5. ${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}'
  6. ... ELSE set variable curl -d '${params}' -H "Content-Type: application/json" -H '_method_name: ${methodname}' -H '_dubbo_token: ${dubbotoken}' -X POST '${cur_host}/${interface}'
  7. log many ${commands}
  8. [return] ${commands}

4、根据账单还款表的csv数据mock还款计划数据

  1. mock还款数据
  2. [Documentation] 【功能】接口描述:根据导出来的还款表生成还款计划
  3. ... 【参数信息】${file_path}:还款表的路径<br>
  4. ... 【使用方法】mock还款数据 /Users/aisuzhen/Downloads/query.csv<br>
  5. ... 【接口返回】接口返回${mock_reapy},打印日志:========result is mock_reapy=======<br>
  6. [Arguments] ${file_path}
  7. ${mock_reapy} mock_reapy ${file_path}
  8. Log Many ========result is mock_reapy======= :${mock_reapy}
  1. def trasfer_data_status(num):
  2. status={"0":"NORMAL","1":"OVD","2":"CLEAR" }
  3. return status.get(num)
  4. def trasfer_data_curTerm(num):
  5. curTerm={"0":"false","1":"true"}
  6. return curTerm.get(num)
  7. def mock_reapy(file_path):
  8. mock_repay = []
  9. data = {}
  10. with open(file_path, newline='') as csvfile:
  11. reader = csv.DictReader(csvfile)
  12. for row in reader:
  13. #===========打印还款数据==========
  14. # 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'])
  15. # 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)
  16. # ===========还款状态转换枚举==========
  17. status = trasfer_data_status(row['status'])
  18. data['status']=status
  19. # ===========当前期状态转换枚举==========
  20. cur_term =trasfer_data_curTerm(row['cur_term'])
  21. data['curTerm']=cur_term
  22. data['paidIntBal']=row['paid_int_bal']
  23. data['paidPrinBal']=row['paid_prin_bal']
  24. data['termStartDate']=row['term_start_date']
  25. data['termEndDate']=row['term_end_date']
  26. data['termNo']=row['term_no']
  27. data['termNomInt']=row['term_nom_int']
  28. data['termNomPrin']=row['term_nom_prin']
  29. data['termOvdInt']=row['term_ovd_int']
  30. data['termOvdIntPenInt']=0
  31. data['termOvdPrin']=row['term_ovd_prin']
  32. data['termOvdPrinPenInt']=0
  33. # ===========打印原Python字典对象==========
  34. # print(data)
  35. # ===========转成json字符串==========
  36. info_data = json.dumps(data)
  37. print(info_data)
  38. mock_repay.append(info_data)
  39. print(str(mock_repay))
  40. # ===========处理多余字符==========
  41. mock_repay=str(mock_repay).replace("'","")
  42. print(mock_repay)
  43. return mock_repay

调试结果:
image.png

5、打开不同环境的工单类型

  1. 打开不同类型工单
  2. [Documentation] 【功能】接口描述:根据工单名称打开不同环境的页面
  3. ... 【参数信息】${ticketType}工单类型枚举:<br>
  4. ... 【使用方法】打开测试环境抵押工单示例:打开不同类型工单 1 1<br>
  5. [Arguments] ${env} ${ticketType}
  6. ${url} chooice ${env} ${ticketType}
  7. open_ticket ${url}
  1. def open_ticket(url):
  2. print(url)
  3. option = webdriver.ChromeOptions()
  4. option.add_experimental_option("detach", True)
  5. driver = webdriver.Chrome(chrome_options=option)
  6. driver.get(url)
  7. time.sleep(2)
  8. teacher = driver.find_element_by_name('username')
  9. teacher.send_keys("test")
  10. assistant = driver.find_element_by_name('password')
  11. assistant.send_keys("test")
  12. time.sleep(1)
  13. button = driver.find_element_by_class_name('submit-btn')
  14. time.sleep(1)
  15. button.click()
  16. time.sleep(2)
  17. def chooice(env,ticket_type):
  18. if int(ticket_type)==1 and int(env)==1:
  19. url=test_uri + mortgage
  20. print(url)
  21. return url
  22. elif int(ticket_type)==1 and int(env)==2:
  23. url = pre_uri + mortgage
  24. print(url)
  25. return url
  26. elif int(ticket_type) == 2 and int(env) == 1:
  27. url = test_uri + take_record
  28. print(url)
  29. return url
  30. elif int(ticket_type) == 2 and int(env) == 2:
  31. url = pre_uri + take_record
  32. print(url)
  33. return url
  34. elif int(ticket_type) == 3 and int(env) == 1:
  35. url = test_uri + record
  36. print(url)
  37. return url
  38. elif int(ticket_type) == 3 and int(env) == 2:
  39. url = pre_uri + record
  40. print(url)
  41. return url
  42. elif int(ticket_type) == 4 and int(env) == 1:
  43. url = test_uri + gps_remove
  44. print(url)
  45. return url
  46. elif int(ticket_type) == 4 and int(env) == 2:
  47. url = pre_uri + gps_remove
  48. print(url)
  49. return url
  50. elif int(ticket_type) == 5 and int(env) == 1:
  51. url = test_uri + gps_install
  52. print(url)
  53. return url
  54. elif int(ticket_type) == 5 and int(env) == 2:
  55. url = pre_uri + gps_install
  56. print(url)
  57. return url
  58. elif int(ticket_type) == 6 and int(env) == 1:
  59. url = test_uri + supplement
  60. print(url)
  61. return url
  62. elif int(ticket_type) == 6 and int(env) == 2:
  63. url = pre_uri + supplement
  64. print(url)
  65. return url
  66. elif int(ticket_type) == 7 and int(env) == 1:
  67. url = test_uri + appointment
  68. print(url)
  69. return url
  70. elif int(ticket_type) == 7 and int(env) == 2:
  71. url = pre_uri + appointment
  72. print(url)
  73. return url
  74. elif int(ticket_type) == 8 and int(env) == 1:
  75. url = test_uri + send
  76. print(url)
  77. return url
  78. elif int(ticket_type) == 8 and int(env) == 2:
  79. url = pre_uri + send
  80. print(url)
  81. return url
  82. elif int(ticket_type) == 9 and int(env) == 1:
  83. url = test_uri + record
  84. print(url)
  85. return url
  86. elif int(ticket_type) == 9 and int(env) == 2:
  87. url = pre_uri + sign
  88. print(url)
  89. return url
  90. elif int(ticket_type) == 10 and int(env) == 1:
  91. url = test_uri + sign
  92. print(url)
  93. return url
  94. elif int(ticket_type) == 10 and int(env) == 2:
  95. url = pre_uri + transfer
  96. print(url)
  97. return url
  98. elif int(ticket_type) == 11 and int(env) == 1:
  99. url = test_uri + transfer
  100. print(url)
  101. return url
  102. elif int(ticket_type) == 11 and int(env) == 2:
  103. url = pre_uri + fallfile
  104. print(url)
  105. return url
  106. elif int(ticket_type) == 12 and int(env) == 1:
  107. url = test_uri + fallfile
  108. print(url)
  109. return url
  110. elif int(ticket_type) == 12 and int(env) == 2:
  111. url = pre_uri + fallfile
  112. print(url)
  113. return url
  114. elif int(ticket_type) == 13 and int(env) == 1:
  115. url = test_uri + tax_finish
  116. print(url)
  117. return url
  118. elif int(ticket_type) == 13 and int(env) == 2:
  119. url = pre_uri + tax_finish
  120. print(url)
  121. return url

调试结果:
image.png

image.png

五、如何使用团队关键字

5、使用车务关键字

  1. - 安装

pip install 关键字下载

  1. - 引用

Resource ../vehicleAssetKeywords.robot