年薪30W+必备!接口自动化测试框架封装实战(附源码)|Pytest+Allure+Jenkins
第一种:静态方法封装,接口调用入参定义一个(默认json),直接执行接口请求
接口封装代码如下:
class OrderTransactionService: @staticmethod def getComboProductList(body): url = http_host + '/service?serialize=7' headers = {'Content-Type': 'application/json'} request_list = [] request_list.append('com.ymm.insurance.request.ProductListRequestDirect') request_list.append(body) parm_json = CommonUtils.be_post_json(methodName='getComboProductList', url='http://service.ymm.com/insure-service-apply/orderTransactionService_1.0.0', request_list=request_list) response = httpUtil.Post(url, headers, parm_json) logger.info("=======getComboProductList的POST方式的入参是=====\n" + str(request_list)) logger.info("=======getComboProductList的POST方式的返回值是=====\n" + response) response = json.loads(response) return response
测试用例方法调用如下:
# encoding:utf-8 import pytest from settings import env from base.insure.insure_service import OrderTransactionService from settings import mysql orderTransactionService = OrderTransactionService() database = mysql.Database("fis") @pytest.mark.doubleRead class Test_getComboProductList: # 从数据库随机取一条数据 json_dev = { "cargoId": 10171239743346, "driverYmmUid": 965006065498560609, "driverHcbUid": 900345103, "shipperYmmUid": 965006065498913346, "shipperHcbUid": 1100297317, "appType": 1, "source": 1, "cargoSource": 1, "client": 1, "version": "10990000", "pluginVersion": "10.99.1.1", "payOrderPluginVersion": "10.99.1.284", "securityTran": 7, "startCode": 310101, "endCode": 270213, "firstCategoryCode": 10, "firstCategoryName": "食品饮料", "secondCategoryCode": 91, "secondCategoryName": "酱油" } json_qa = { "cargoId": 123659599419839, "driverYmmUid": 967933837394139781, "driverHcbUid": 215996505, "shipperYmmUid": 967933837002049839, "shipperHcbUid": 215801452, "appType": 1, "source": 1, "cargoSource": 1, "client": 1, "version": "8600700", "pluginVersion": "7.25.1.1", "payOrderPluginVersion": "8.58.141.380", "securityTran": 8, "startCode": 330382, "endCode": 320114, "firstCategoryCode": 3, "firstCategoryName": "服饰 纺织 皮革", "secondCategoryCode": 47, "secondCategoryName": "服装", "userFlag": None, "platFormScene": None } if env.env == 'qa': json =json_qa else: json =json_dev def test_01(self): result = orderTransactionService.getComboProductList(self.json)
第二种:不是静态方法,通过不定长字典参数(**kwargs),封装接口
class freightCompensationClaimService: def autoReport(self, **kwargs): url = http_host + '/service?serialize=7' headers = {'Content-Type': 'application/json'} request_list = [] request_list.append('com.ymm.insurance.dto.claim.crm.request.AutoReportClaimRequestDto') request_list.append(kwargs) parm_json = CommonUtils.be_post_json(methodName='autoReport', url='http://service.ymm.com/insure-service-apply/freightCompensationClaimService_1.0.0', request_list=request_list) response = httpUtil.Post(url, headers, parm_json) logger.info("=======autoReport的POST方式的入参是=====\n" + str(kwargs)) print("=======autoReport的POST方式的返回值是=====\n" + response) response_json = json.loads(response) return response_json
测试用例方法调用如下:
from base.insure.insure_service import freightCompensationClaimService from settings.mysql import Database freightCompensationClaimService=freightCompensationClaimService() dataBase = Database("fis") dataBase_calim = Database("fis_claim") poliNo = 0 # 太平洋运费损失险理赔 class Test_autoReport: def setup_class(self): self.poliNo = 'AGUZGDS59724EGGF73E4' self.claimAmount = 6000.01 self.conferenceFreightRate = 8000 self.receivedFreightRate = 1000 self.truckLength = '6.0' self.driverLicenses = ["https://dev-image56-conf-oss.ymm56.com/ymmfile/insure-service/1e15310d-f7b7-444d-a5ef-a11708bbe48a?Expires=1654166938&OSSAccessKeyId=LTAIq0WRi8jPwg5y&Signature=7PV0SGlFsqSuMvTPHQlYt2jw3eU%3D"] self.drivingLicenses = ["https://dev-image56-conf-oss.ymm56.com/ymmfile/insure-service/1e15310d-f7b7-444d-a5ef-a11708bbe48a?Expires=1654166938&OSSAccessKeyId=LTAIq0WRi8jPwg5y&Signature=7PV0SGlFsqSuMvTPHQlYt2jw3eU%3D"] self.invoices = ["https://dev-image56-conf-oss.ymm56.com/ymmfile/insure-service/1e15310d-f7b7-444d-a5ef-a11708bbe48a?Expires=1654166938&OSSAccessKeyId=LTAIq0WRi8jPwg5y&Signature=7PV0SGlFsqSuMvTPHQlYt2jw3eU%3D"] def test_01(self): response = freightCompensationClaimService.autoReport(policyNo= self.poliNo,claimAmount=self.claimAmount,conferenceFreightRate=self.conferenceFreightRate ,receivedFreightRate=self.receivedFreightRate ,truckLength=self.truckLength , driverLicenses=self.driverLicenses,drivingLicenses=self.drivingLicenses,invoices=self.invoices ) print(response["response"]) assert response["response"]["success"] == True assert response["response"]["data"] != None
第三种:通过构建对象类,封装测试方法(推荐使用,可以解决重复登录,请求头重复等问题)
接口调用方法封装
class TradeDriverCheckOutApp: ''' 司机端-司机抢单完成之后,指派司机等操作接口封装 所有接口请求头中的client-info必须跟authorization保持一致,和login中的保持一致 ''' # 定义类的构造方法 def __init__(self, tel_num): self.tel_num = tel_num self.headers = { "client-info": "36b7a347643fe4bdad1692fc5bd13da0/driver/8.84.0.0/android/com.xiwei.logistics", "rn-info": "global-engine:7.58.0.299/fta-driver-youpin:8.61.0.401/fta-forum:7.34.4.12/enterprisecargodetail:7.53.001.15/fta-im:7.47.0.52/fta-user:7.51.0.32/projectcargodetail:7.53.001.220/carsticker:8.47.230.22/common:6.5.1.3/fta-cargomatch:7.57.1.154/cargodetail:7.62.75.786/cargomatch:7.53.1.38/nav:7.51.1.7/fta-price-checking:8.19.1.10/fta-board-equipment:8.57.280.58/sd-driver-fta:8.53.0.63/entrust:8.53.001.32/payorder:8.58.141.380/ymmverify:7.58.0.146/sd-trade-fta:1.7.250.321/sdcargo-driver:7.55.0.285/driver_cargo_trade:7.25.1.1/rn-region-cargodetail-driver:8.62.101.273/orders:7.59.1.168/user:7.51.0.14/transaction:7.55.10.14", "plugin-info": "ymm.maptencent:1.80.1/nav:5.84.0/order:1.82.0/wal:3.61.10/shortdistance:1.82.1/ymm.di:8.74.1/im:7.82.0/shortdistance.im:1.39.0/financeshield:4.24.7/ymm.verify:7.84.0/ymm.cargopublish:7.80.0/ymm.framework.dynamic:1.5.7/ymm.security:8.80.1/cargo:8.84.0/" } self.login_return = self.login() def login(self): env_url = f'https://{env}.ymm56.com/ymm-userCenter-app/account/login' print("env_url", env_url) headers = self.headers user = { "cmToken": "", "code": "1234" } user["telephone"] = self.tel_num login_res = requests.post(url=env_url, json=user, headers=headers) login_res_json = json.loads(login_res.content) # return_auth = login_res_json["info"]["profileInfo"]["basicAuthrization"] return login_res_json def assign_team_member(self, req_json): ''' 车队长指派司机,司机场景险批单 ''' url = 'https://{0}.ymm56.com//trade-checkout-app/platformCarrierTeam/assignTeamMember'.format(env) headers = self.headers headers["authorization"] = self.login_return["info"]["profileInfo"]["basicAuthrization"] print("入参:{0}".format(req_json)) req_resp = requests.post(url=url, json=req_json, headers=headers) req_resp_json = json.loads(req_resp.content) print("出参:{0}".format(req_resp_json)) return req_resp_json def payPage(self, cargoID): ''' 司机抢单-支付定金页 ''' req_json = {"depositAmount": "0", "cargoId": cargoID, "freightAmount": "0", "pageSource": "0", "extraParams": None, "walletVersion": "3.61.10", "verticalParam": {"todayCargoRetentionCount": 0, "todayRetentionCount": 0, "cargoDetailVersion": "d8d9d065beae4c1a80368e8be77f3f1a"}, "tags": [], "transParams": None} url = 'https://{0}.ymm56.com/ld-order-deal-app/order/payPage'.format(env) headers = self.headers headers["authorization"] = self.login_return["info"]["profileInfo"]["basicAuthrization"] print("/ld-order-deal-app/order/payPage入参:{0}".format(req_json)) req_resp = requests.post(url=url, json=req_json, headers=headers) req_resp_json = json.loads(req_resp.content) print("/ld-order-deal-app/order/payPage出参:{0}".format(req_resp_json)) return req_resp_json def payPagehalfpagecombo(self, cargoID): ''' 司机抢单-支付定金页-半弹窗-getComboProductList ''' req_json = { "depositAmount": "", "cargoId": "10189392400523", "freightAmount": "", "pageSource": "0", "extraParams": None, "walletVersion": "3.58.21", "verticalParam": { "driverLatitude": 31.209773, "driverLongitude": 121.408535, "cargoDetailVersion": "cd0a3da8bfa1416a9bdbfcd76b53c798" }, "tags": [], "transParams": None } req_json["cargoId"] = cargoID url = 'https://{0}.ymm56.com/ld-order-deal-app/order/half-pay-page'.format(env) headers = self.headers headers["authorization"] = self.login_return["info"]["profileInfo"]["basicAuthrization"] print("/ld-order-deal-app/order/payPage入参:{0}".format(req_json)) req_resp = requests.post(url=url, json=req_json, headers=headers) req_resp_json = json.loads(req_resp.content) print("/ld-order-deal-app/order/payPage出参:{0}".format(req_resp_json)) return req_resp_json def payPagehalfpageinfolistforpop(self, cargoID): ''' 司机抢单-支付定金页-半弹窗-getProductInfoListForPop ''' req_json = { "depositAmount": "", "cargoId": "10189393153503", "freightAmount": "", "pageSource": "0", "extraParams": None, "walletVersion": "3.58.21", "verticalParam": { "driverLatitude": 31.209773, "driverLongitude": 121.408535, "cargoDetailVersion": "b8164eed54b84a8c902185620ccb4722" }, "tags": [], "transParams": None } req_json["cargoId"] = cargoID url = 'https://{0}.ymm56.com/ld-order-deal-app/order/half-pay-page'.format(env) headers = self.headers headers["authorization"] = self.login_return["info"]["profileInfo"]["basicAuthrization"] print("/ld-order-deal-app/order/payPage入参:{0}".format(req_json)) req_resp = requests.post(url=url, json=req_json, headers=headers) req_resp_json = json.loads(req_resp.content) print("/ld-order-deal-app/order/payPage出参:{0}".format(req_resp_json)) return req_resp_json #insure 是否需要购买司机端保险,不需要购买司机端保险,则insure=None def order_grab(self, dd,insure=True): ''' 司机抢单-发起支付,如果遇见系统繁忙,请求次数过多,可以换新的货源试试 ''' if insure == True: req_json = json_utils.JsonUtils("grapgly.json", 'cargo_publish').data else: req_json = json_utils.JsonUtils("grab.json", 'cargo_publish').data req_json["deposit"] = dd["deposit"] req_json["contractDTO"]["totalFreight"] = dd["totalFreight"] req_json["contractDTO"]["netFreight"] = dd["netFreight"] req_json["moreCostList"][0]["moreCostAmount"] = dd["moreCostAmount"] req_json["insuranceItems"] = dd["insuranceItems"] req_json["cargoId"] = dd["cargoId"] req_json["transmissionParams"] = dd["transmissionParams"] url = 'https://{0}.ymm56.com/ld-order-deal-app/order/grab'.format(env) headers = self.headers headers["authorization"] = self.login_return["info"]["profileInfo"]["basicAuthrization"] print("===/ld-order-deal-app/order/grab入参:{0}".format(req_json)) req_resp = requests.post(url=url, json=req_json, headers=headers) req_resp_json = json.loads(req_resp.content) print("/ld-order-deal-app/order/grab出参:{0}".format(req_resp_json)) return req_resp_json # insure 是否需要购买司机端保险,不需要购买司机端保险,则insure=None def order_grab_half_infolistforpop(self, dd, insure=True): ''' 司机抢单-支付定金页-半弹窗-组合险1.0和2.0新接口,-发起支付,需要读取新的入参grab_half_infolistforpop.json ''' if insure == True: req_json = json_utils.JsonUtils("grab_half_infolistforpop.json", 'cargo_publish').data else: req_json = json_utils.JsonUtils("grab_half_infolistforpop.json", 'cargo_publish').data req_json["deposit"] = dd["deposit"] req_json["contractDTO"]["totalFreight"] = dd["totalFreight"] req_json["contractDTO"]["netFreight"] = dd["netFreight"] req_json["moreCostList"][0]["moreCostAmount"] = dd["moreCostAmount"] req_json["insuranceItems"] = dd["insuranceItems"] req_json["cargoId"] = dd["cargoId"] req_json["transmissionParams"] = dd["transmissionParams"] url = 'https://{0}.ymm56.com/ld-order-deal-app/order/grab'.format(env) headers = self.headers headers["authorization"] = self.login_return["info"]["profileInfo"]["basicAuthrization"] print("===/ld-order-deal-app/order/grab入参:{0}".format(req_json)) req_resp = requests.post(url=url, json=req_json, headers=headers) req_resp_json = json.loads(req_resp.content) print("/ld-order-deal-app/order/grab出参:{0}".format(req_resp_json)) return req_resp_json def insure_app_trial(self, req_json): ''' 司机端,频道险-自主购买,算价接口 ''' url = 'https://{0}.ymm56.com//insure-app/insurance/common/trial'.format(env) headers = self.headers headers["authorization"] = self.login_return["info"]["profileInfo"]["basicAuthrization"] print("入参:{0}".format(req_json)) req_resp = requests.post(url=url, json=req_json, headers=headers) req_resp_json = json.loads(req_resp.content) print("出参:{0}".format(req_resp_json)) return req_resp_json # 测试银行支付 def payOrderWithTestBank(self, mobile, client_name, bizNo, source): # 登陆接口 auth = self.login_return["info"]["profileInfo"]["basicAuthrization"] request_url = "http://pay.qa-bj.56qq.com/mwallet/login/loginByThirdParty.htm?" if env == 'qa' else "https://pay.dev-ag.56qq.com/mwallet/login/loginByThirdParty.htm" headers = {} headers['Content-Type'] = "application/x-www-form-urlencoded" headers['Authorization'] = auth headers['x-auth-type'] = 'basic' headers['x-cipher-type'] = 'YMM' headers['encryptresponse'] = '2' headers['x-ag-wallet-v3-de'] = 'true' headers['walletversion'] = '3.2.1' t = int(round(time.time() * 1000)) st_sid = self.getStSid(mobile, client_name) st = st_sid['st'] sid = st_sid['sid'] token = getAuth.getWalletToken(env, auth, client_name) encodeToken = urllib.parse.quote(str(token)) body = f"st={st}&sid={sid}&third_party_token={encodeToken}&_t_={t}" response = httpUtil.Post(request_url, headers, body) responseJson = json.loads(response) print("钱包登录接口loginByThirdParty返回结果:", responseJson) hostUid = responseJson['data']['hostUid'] NewToken = responseJson['data']['token'] businessType = 100000 # 进入收银台 request_applyPay_url = "https://pay.qa-bj.56qq.com/mwallet/my/applyPayV2.htm?" if env == 'qa' else "https://pay.dev-ag.56qq.com/mwallet/my/applyPayV2.htm?" body_applyPay = f"uid={hostUid}&third_party_token={encodeToken}&outerTradeNo={bizNo}&source={source}&cashierType=interiorH5&token={NewToken}&_sid_={sid}&st={st}&_vn_=8.27.0.0&_t_={t}&_pn_=com.xiwei.logistics&dfp=6c48ed91-4e84-4b50-a4b1-dd0d24f48a43&sid={sid}&_m_=PCT-AL10&_lat_=31.22012644089214&_no_=CHINA_MOBILE&_lng_=121.3134673016471&_ov_=10&_ch_=ymm&_dfp_=6c48ed91-4e84-4b50-a4b1-dd0d24f48a43&_nw_=Wi-Fi&_vc_=8270000" responseApplyPay = httpUtil.Post(request_applyPay_url, headers, body_applyPay) responseApplyPayJson = json.loads(responseApplyPay) print("applyPayV2接口返回", responseApplyPayJson) fields = responseApplyPayJson['data']['submitInfo']['fields'] fields_encode = quote_plus(json.dumps(fields)) # 支付接口 request_payV2_url = "https://pay.qa-bj.56qq.com/mwallet/my/payV2.htm" if env == 'qa' else "https://pay.dev-ag.56qq.com/mwallet/my/payV2.htm" body_payV2 = f"uid={hostUid}&third_party_token={encodeToken}&payWay=%7B%22payWayCode%22%3A%22TESTBANK%22%2C%22properties%22%3A%7B%7D%7D&submitComponents=%7B%22submitInfo%22%3A%7B%22submit%22%3Atrue%2C%22baitiaoGuide%22%3Anull%2C%22frontMode%22%3Afalse%2C%22selectedCouponId%22%3Anull%2C%22selectedCoupon%22%3Anull%2C%22campaignInfo%22%3A%22null%22%2C%22tag%22%3A%22submitInfo%22%2C%22id%22%3A%221%22%2C%22type%22%3A%22biz%22%2C%22fields%22%3A{fields_encode}%2C%22businessType%22%3A%22{businessType}%22%2C%22balanceDeduct%22%3Anull%7D%7D&cashierType=interiorH5&token={NewToken}&_sid_={sid}&st={st}&_vn_=8.27.0.0&_t_={t}&_pn_=com.xiwei.logistics&dfp=6c48ed91-4e84-4b50-a4b1-dd0d24f48a43&sid={sid}&_m_=PCT-AL10&_lat_=31.22025732677263&_no_=CHINA_MOBILE&_lng_=121.31334732464585&_ov_=10&_ch_=ymm&_dfp_=6c48ed91-4e84-4b50-a4b1-dd0d24f48a43&_nw_=Wi-Fi&_vc_=8270000" print("========body_payV2入参========") print(body_payV2.replace("'", '"')) # body_payV2 = f"uid={hostUid}&third_party_token={encodeToken}&payWay=%7B%22payWayCode%22%3A%22TESTBANK%22%2C%22properties%22%3A%7B%7D%7D&submitComponents=%7B%22submitInfo%22%3A%7B%22submit%22%3Atrue%2C%22baitiaoGuide%22%3Anull%2C%22frontMode%22%3Afalse%2C%22selectedCouponId%22%3Anull%2C%22selectedCoupon%22%3Anull%2C%22campaignInfo%22%3A%22null%22%2C%22tag%22%3A%22submitInfo%22%2C%22id%22%3A%221%22%2C%22type%22%3A%22biz%22%2C%22fields%22%3A%7B%22st%22%3A%22{st}%22%2C%22bizNo%22%3A%22{bizNo}%22%2C%22amount%22%3A%22{amount}%22%2C%22productId%22%3Anull%2C%22mainPartnerId%22%3Anull%2C%22source%22%3A%22{source}%22%2C%22combinationTradeCouponList%22%3Anull%2C%22sid%22%3A%22{sid}%22%2C%22tradeCouponList%22%3Anull%2C%22tradeVoucherNos%22%3A%22{tradeVoucherNos}%22%2C%22paymentScene%22%3Anull%2C%22campaignInfo%22%3Anull%2C%22balanceDeduct%22%3Anull%7D%2C%22businessType%22%3A%22{businessType}%22%2C%22balanceDeduct%22%3Anull%7D%7D&cashierType=interiorH5&token={NewToken}&_sid_={sid}&st={st}&_vn_=8.27.0.0&_t_={t}&_pn_=com.xiwei.logistics&dfp=6c48ed91-4e84-4b50-a4b1-dd0d24f48a43&sid={sid}&_m_=PCT-AL10&_lat_=31.22025732677263&_no_=CHINA_MOBILE&_lng_=121.31334732464585&_ov_=10&_ch_=ymm&_dfp_=6c48ed91-4e84-4b50-a4b1-dd0d24f48a43&_nw_=Wi-Fi&_vc_=8270000" responseV2 = httpUtil.Post(request_payV2_url, headers, body_payV2) responseV2Json = json.loads(responseV2) print("payV2入参body_payV2:", body_payV2) print("payV2返回结果:", responseV2Json) return responseV2Json def getStSid(self, mobile, client_name): if env == 'dev': env_url_c = requestData.dev else: env_url_c = requestData.qa request_url = env_url_c + requestData.partnerToken_request headers = {} headers['Content-Type'] = "application/json" headers["client-info"] = readconfig.get_clientinfo(client_name) headers['Authorization'] = self.login_return["info"]["profileInfo"]["basicAuthrization"] PostJson = {"needWalletToken": False} response = httpUtil.Post(request_url, headers, PostJson) responseToJson = json.loads(response) result = json.loads(responseToJson["token"]) st_sid = {"sid": result["id"], "st": result["token"]} return st_sid
业务逻辑串联,调用封装的接口方法
# -*- coding: utf-8 -*- """ @Time :2023/3/29 19:05 @Auth :guoliuyang @File :create_driver_policy.py """ from settings import env from testcase.common.tools.resend_cargo import cargoPublish from base.trade_checkout_app import trade_checkout_app from utils import getAuth import time import json from base import cargo ''' 司机场景险购买-场景险保单 司机抢单,支付定金页,司机场景险,购买保险 ''' class CreateDriverPolicy(): def create_driver_policy_new(self, mobileDriver, cargoID): try: trade_new = trade_checkout_app.TradeDriverCheckOutApp(mobileDriver) # 通过paypage获取险种和对应的险种价格 respone_paypage = trade_new.payPage(cargoID) # json_return = json.dumps(respone_paypage["data"]["body"]) #把字典数据转换为json for i in respone_paypage["data"]["body"]["items"]: if i["type"] == 'MBCostBizComponent': deposit = i["props"]["deposit"]["amount"] print("定金:{0}".format(i["props"]["deposit"]["amount"])) totalFreight = i["props"]["freight"]["amount"] print( "总运费:{0}".format(i["props"]["freight"]["amount"])) netFreight = totalFreight # 净得运费,由于货源都是退还定金的,所以目前跟总运费一致,如果不退还定金则需要减去定金 print("净得运费:{0}".format(netFreight)) moreCostAmount = i["props"]["moreCost"][0]["totalFee"] print("技术服务费:{0}".format(moreCostAmount)) for i in respone_paypage["data"]["body"]["items"]: if i["type"] == "MBInsuranceBizComponent": insuranceList = i["props"]["insuranceList"] insuranceItems = [] for i in insuranceList: a = { "itemId": None, "amount": 0, "code": 0, "continuousCheck": False, "childList": [] } # 17-人保超级放空险、20-太保超级防空险、16-百万三者责任险、13-太平洋运输保、3-平安运输保 # 14-运费损失补偿险、18-平安驾乘意外险、22太保押车险----17,11,16,13,3,14,18,22 if i["type"] in (17,20,22,11,16,13,3,14,18,22): a["itemId"] = i["itemId"] a["amount"] = i["premium"] a["code"] = i["type"] insuranceItems.append(a) print("保险数据:{0}".format(insuranceItems)) cargoId = respone_paypage["data"]["props"]["cargoId"] print("cargoId:{0}".format(cargoId)) transmissionParams = respone_paypage["data"]["props"]["transmissionParams"] print("transmissionParams:{0}".format(transmissionParams)) # 可以通过payPage获取,deposit、totalFreight、netFreight、insuranceItems、versionId(会影响算价,给下面的接口用) dd = { "deposit":deposit, "totalFreight":totalFreight, "netFreight":netFreight, "moreCostAmount":moreCostAmount, "insuranceItems":insuranceItems, "cargoId":cargoId, "transmissionParams":transmissionParams } # 通过/ld-order-deal-app/order/grab,进入支付页面,调起支付 respone_order_grab = trade_new.order_grab(dd) outOrderNo = respone_order_grab["data"]["info"]["outOrderNo"] print("支付入参outOrderNo:{0}".format(outOrderNo)) tradeAmount = respone_order_grab["data"]["info"]["tradeAmount"] print("支付入参tradeAmount:{0}".format(tradeAmount)) source = respone_order_grab["data"]["info"]["source"] print("支付入参source:{0}".format(source)) # 测试银行支付 getAuth.payWithTestBank(mobileDriver, "ymm_and_driver_clientlist", outOrderNo, tradeAmount,source) return respone_order_grab["data"]["info"]["orderId"] except Exception as e: print("出现异常!") finally: print("司机抢单结束") if __name__ == '__main__': # 组合险会提示抢单异常(新方法,自己写的),务必使用新货源 # 货源重新发货有改动,用resend_cargo.py这个文件可以实现再来一单,如果遇见发货失败,只看cargoPublish方法就行,一般都是入参问题 # cargo = cargoPublish(mobile='15617681741') # cargoId = cargo.cargoPublish() # print(cargoId) # time.sleep(10) # pa = CreateDriverPolicy() # pa.create_driver_policy_new('15617681788', cargoId) # 仅限发佛山-广州的玻璃货物,可以走运输保易碎品 # cargoResponse = cargo.prepare_and_complet(mobile=15617681743, client_name='ymm_and_shipper_clientlist',start_city='佛山市', end_city='广州市', searchWord='玻璃') # cargo_id = cargoResponse['cargo_id'] # print(cargo_id) # 根据货源id直接抢单,务必使用新货源 pa = CreateDriverPolicy() pa.create_driver_policy_new('15617681748', 10189811109884)
准备测试数据,编写场景测试用例,通过jenkins定时执行并生成测试报告
from utils import httpUtil, getAuth, json_utils from settings.env import env from data.enum.Product import Product from base.insure import create_insure_utils import pytest from testcase.common.tools.create_driver_policy import CreateDriverPolicy from settings import env from testcase.common.tools.resend_cargo import cargoPublish from base.trade_checkout_app import trade_checkout_app from utils import getAuth import time import json from base import cargo class Test_create_driver_policy: # 自动化测试脚步,货主和司机账户 shipper = '15617681741' driver = '15617681788' bodyJson = json_utils.JsonUtils("resend_cargo.json", 'cargo_publish').data def test_all_policy(self): ''' 司机场景险购买 - 场景险保单 司机抢单,支付定金页,司机场景险,购买保险 货主:15617681741,司机:15617681788 ''' # 第一步:发布货源 cargo = cargoPublish(self.shipper,self.bodyJson) cargoId = cargo.cargoPublish() print(cargoId) # 第二步:司机抢单,自动化账户:15617681788 time.sleep(10) pa = CreateDriverPolicy() order = pa.create_driver_policy_new(self.driver, cargoId) print(order) time.sleep(10)
年薪30W+必备!接口自动化测试框架封装实战(附源码)|Pytest+Allure+Jenkins