将不需要的打印数据进行注释掉后,运行启动文件成功打印出dependent_response_通达信股票 数据接口,data数据,即就是服务器响应数据中的cart2No键的值
以及在run_test模块中调用print_test_通达信股票 数据接口,data方法,并接收返回值,最后打印出统计的case测试结果数据
回到run_test模块中的for循环中进行获取,判断当excel表中的数据依赖字段的值不为空是,则通过实例化HandleData,并调用类中的核心方法get_通达信股票 数据接口,data_for_key,在该核心方法中又调用run_dependent_case向接口发送请求数据,并将服务器返回的数据返回回来,在get_通达信股票 数据接口,data_for_key中使用jsonpath_rw中的parse方法进行建立path规则,最终提取到我们想要的返回数据中的cart2No键的值,进行打印测试
def run(self):
res = None
row_counts = self.通达信股票 数据接口,data.get_case_lines() # 获取excel表格行数
# print(row_counts) 5
for row_count in range(1, row_counts):
# print(row_count) 1,2,3,4
url = self.通达信股票 数据接口,data.get_request_url(row_count) # y行不变遍历获取x列的请求地址
method = self.通达信股票 数据接口,data.get_request_method(row_count) # y行不变遍历获取x列的请求方式
is_run = self.通达信股票 数据接口,data.get_is_run(row_count) # y行不变遍历获取x列的是否运行
通达信股票 数据接口,data = self.通达信股票 数据接口,data.get_通达信股票 数据接口,data_for_json(row_count) # y行不变遍历获取x列的请求数据,这里面时三次调用,依次分别是get_通达信股票 数据接口,data_for_json丶get_key_words丶get_request_通达信股票 数据接口,data
# header = self.通达信股票 数据接口,data.get_is_header(row_count) #行不变遍历获取x列获取header
header = self.通达信股票 数据接口,data.get_通达信股票 数据接口,data_for_header(row_count)
module = self.通达信股票 数据接口,data.get_module_name(row_count) #行不变遍历获取x列获取模块名
expect = self.通达信股票 数据接口,data.get_expect_通达信股票 数据接口,data(row_count) #行不变遍历获取x列获取预期结果
通达信股票 数据接口,data_dependent = self.通达信股票 数据接口,data.get_通达信股票 数据接口,data_dependent(row_count) # 数据依赖
case_dependent = self.通达信股票 数据接口,data.get_case_dependent(row_count) # case依赖
if 通达信股票 数据接口,data_dependent != None:
# 当数据依赖不为空时,则实例化handle_通达信股票 数据接口,data_dependent模块中的HandleData类,并调用类中的get_通达信股票 数据接口,data_for_key方法将需要的cart2No数据获取到
self.hd = HandleData(case_dependent)
dependent_response_通达信股票 数据接口,data = self.hd.get_通达信股票 数据接口,data_for_key(row_count)
print(dependent_response_通达信股票 数据接口,data)
最后只需要在启动文件run_test中,实例化SendEmail对象,调用其send_main方法,将pass_count和fail_count传递即可,这样就可以完成自动化邮件测试报告的发送
服务器给下单接口返回的响应数据中的cartNo与支付接口请求数据中的cartNo一致,具体看就明白了,首先查看服务器给下单接口返回的响应数据
在启动文件中run_test模块中,在run方法for循环中,首先需要获取excel表中的通达信股票 数据接口,data_dependent数据依赖字段的值,然后再获取到case依赖的值,要获取case依赖的值,还需要到通达信股票 数据接口,data_get模块中定义以下方法进行获取
def get_case_dependent(self, x):
'''获取case依赖的值'''
y = int(通达信股票 数据接口,data_conf.get_case_depend())
case_dependent = self.op_excel.get_cell_value(x, y)
if case_dependent == '':
return None
else:
return case_dependent
因为该接口与之前接口不属于一个服务器,所以返回的响应数据不一样,所以需要修改common_util模块中修改判断
# -*- coding: utf-8 -*-
__author__ = 'cdtaogang'
__date__ = '2019/6/21 18:43'
import json
class CommonUtil(object):
def is_contains(self, expect, reality):
flag = None
reality = json.loads(reality)
expect = json.loads(expect)
if expect['isSuccess'] == reality['通达信股票 数据接口,data']['result']['isSuccess']:
flag = True
else:
flag = False
return flag
测试前首先需要关闭excel表,然后运行代码成功将正确的测试数据结果写入到excel对应字段中
再查看支付接口向服务器发送的请求数据
接下来博主就需要将框架最开始的基础信息进行变更,在excel表中中添加一列header数据,因为订单先关的接口需要传递header来验证登录状态
获取cookie思路分析
第二步:在fiddler上获取登录接口请求中的通达信股票 数据接口,data数据,因为是POST请求嘛所以在WebForms可以查看得到,同样的将其拷贝
在op_excepy中定义如下方法,根据传入的case_id值来获取excel表字段的行数据
def get_x_values(self, case_id):
'''通过获取到的x坐标num值来获取到对应的内容'''
x_num = self.get_x_nums(case_id)
x_通达信股票 数据接口,datas = self.get_x_通达信股票 数据接口,data(x_num)
print(x_通达信股票 数据接口,datas)
return x_通达信股票 数据接口,datas
def get_x_nums(self, case_id):
'''根据传入的case_id的值来获取在表格x坐标的数值x=num'''
num = 0
x_通达信股票 数据接口,datas = self.get_y_通达信股票 数据接口,data()
for x_通达信股票 数据接口,data in x_通达信股票 数据接口,datas:
if case_id in x_通达信股票 数据接口,data:
return num
num += 1
def get_x_通达信股票 数据接口,data(self, x=None):
'''获取表格某一行所有数据'''
tables = self.通达信股票 数据接口,data
if x is not None:
x_通达信股票 数据接口,data = tables.row_values(x)
else:
x_通达信股票 数据接口,data = tables.row_values(1)
# print(x_通达信股票 数据接口,data)
return x_通达信股票 数据接口,data
def get_y_通达信股票 数据接口,data(self, y=None):
'''获取表格某一列数据'''
if y is not None:
y_通达信股票 数据接口,data = self.通达信股票 数据接口,data.col_values(y)
else:
y_通达信股票 数据接口,data = self.通达信股票 数据接口,data.col_values(0)
# print(y_通达信股票 数据接口,data)
return y_通达信股票 数据接口,data
在通达信股票 数据接口,data_get.py数据获取模块中需要添加两个方法来分别获取excel表header列的数据以及操作获取json表中的键为header值的请求数据通达信股票 数据接口,data和请求头数据header
def get_request_header_通达信股票 数据接口,data(self, x):
'''获取excel表中的header的数据'''
y = int(通达信股票 数据接口,data_conf.get_request_header_通达信股票 数据接口,data())
header_通达信股票 数据接口,data = self.op_excel.get_cell_value(x, y)
# print('header_通达信股票 数据接口,data', header_通达信股票 数据接口,data)
if header_通达信股票 数据接口,data == '':
return None
return header_通达信股票 数据接口,data
def get_通达信股票 数据接口,data_for_header(self, x):
'''通过在excel表中获取的关键字数据到json表中获取对应的数据'''
op_header = operationJson()
header_通达信股票 数据接口,data = op_header.get_key_words(self.get_request_header_通达信股票 数据接口,data(x))
# print('header_通达信股票 数据接口,data', header_通达信股票 数据接口,data)
return header_通达信股票 数据接口,data
因为博主这里想要两个接口的测试结果并将数据写入到excel实际结果中去,所以需要分别在handle_通达信股票 数据接口,data_dependent模块以及run_test模块中进行调用common_util模块中的is_contains,并根据返回的结果将数据写入到excel实际结果字段中去run_test模块中
还需要修改启动文件中的header的获取调用方法
for row_count in range(1, row_counts):
# print(row_count) 1,2,3,4
url = self.通达信股票 数据接口,data.get_request_url(row_count) # y行不变遍历获取x列的请求地址
method = self.通达信股票 数据接口,data.get_request_method(row_count) # y行不变遍历获取x列的请求方式
is_run = self.通达信股票 数据接口,data.get_is_run(row_count) # y行不变遍历获取x列的是否运行
通达信股票 数据接口,data = self.通达信股票 数据接口,data.get_通达信股票 数据接口,data_for_json(row_count) # y行不变遍历获取x列的请求数据,这里面时三次调用,依次分别是get_通达信股票 数据接口,data_for_json丶get_key_words丶get_request_通达信股票 数据接口,data
# header = self.通达信股票 数据接口,data.get_is_header(row_count) #行不变遍历获取x列获取header
header = self.通达信股票 数据接口,data.get_通达信股票 数据接口,data_for_header(row_count)
module = self.通达信股票 数据接口,data.get_module_name(row_count) #行不变遍历获取x列获取模块名
expect = self.通达信股票 数据接口,data.get_expect_通达信股票 数据接口,data(row_count) #行不变遍历获取x列获取预期结果
print('模块名:', module)
print('请求地址:', url)
print('请求方式:', method)
print('是否运行:', is_run)
print('请求数据:', 通达信股票 数据接口,data)
print('请求头:', header)
print('预期结果:', expect)
第五步:也就是直接打印出返回的响应数据res中的cookie即可,但是苏宁这边的登录安全防护这边做的很好,毕竟是大企业嘛,所以过了一段时间运行代码服务器就会返回验证码的错误代码数据,就好比一个网站你在很短的时间内不停的登录,就会出现安全验证比如验证码就是那种极其恶心拖动验证
首先在send_email模块中定义send_main方法,该方法用于自动化测试结果的统计
def send_main(self, pass_num, fail_num):
pass_num = float(pass_num)
fail_num = float(fail_num)
count_nums = pass_num + fail_num
# 计算通过率
pass_result = '%.2f%%' %(pass_num/count_nums*100)
fail_result = '%.2f%%' %(fail_num/count_nums*100)
user_list = ['2384005622@qq.com']
sub = '接口自动化测试报告'
content = '本次自动化测试一共运行的接口数为:%d个, 通过个数为:%d个, 失败个数为:%d个, 通过率为:%s, 失败率为:%s' %(count_nums,pass_num,fail_num,pass_result,fail_result)
print(content)
对上一部中的返回的响应数据进行关键字数据的提取,将提取代码进行封装,首先是调用通达信股票 数据接口,data_get模块中的get_dependent_key方法获取依赖的返回数据中的key,也就是excel表中的value值,然后再调用run_dependent_case方法获取返回的响应数据,通过依赖的返回数据中的key,来提取响应数据中的value值,这里需要安装jsonpath_rw,通过其parse方法来定义path规则,通过该规则找到返回的响应数据中的key的数据集,通过列表生成式将第0个元素进行返回
def get_通达信股票 数据接口,data_for_key(self, x):
'''获取依赖返回数据中的key'''
dependent_通达信股票 数据接口,data = self.通达信股票 数据接口,data.get_dependent_key(x)
response_通达信股票 数据接口,data = self.run_dependent_case()
json_rule = parse(dependent_通达信股票 数据接口,data)
madle = json_rule.find(response_通达信股票 数据接口,data)
return [m.value for m in madle][0]
重点:大家看到这里应该也没啥不明白的吧,如果有请不要着急,博主把整个实现过程讲一下,代码写到这里其实分为两个部分,第一个部分就是获取case_id也就是存在依赖字段的case中的case依赖的值,根据该值来获取其在excel表中的x坐标列,因为y坐标是固定的,所以就可以获取依赖的case的所有行数据,紧接着就可以发送接口数据获的服务器返回的响应数据了,然后在对服务器返回的响应数据中通过jsonpath_rw模块中的方法提取我们想要的cart2No字段的值;第二部分就是在启动文件run_test模块中首先去获取依赖的数据以及case依赖数据,根据依赖数据不为空时去调用第一部分的核心代码来获取cart2No得值,然后将这个值赋值给请求数据通达信股票 数据接口,data,也就是excel表中cart_通达信股票 数据接口,data2键的值,可能有些人有点晕,为啥在run_test启动文件中只向存在依赖关系的case发送请求呢,那是因为做了判断了;为了演示出两个部分发送的请求所需的参数以及对应在excel表中的字段数据,博主在handle_通达信股票 数据接口,data_dependent模块中也进行了打印
从下单和支付两个接口返回的响应数据中看出isSuccess字段存在不一样的层级,所以在common_util模块中需要添加支付接口返回响应数据的字典层级判断来获取正确为的isSuccess字段的值,因为苏宁易购app这边cookie需要经常更换,所以博主添加了异常处理
# -*- coding: utf-8 -*-
__author__ = 'cdtaogang'
__date__ = '2019/6/21 18:43'
import json
class CommonUtil(object):
def is_contains(self, expect, reality):
flag = None
try:
reality = json.loads(reality)
except Exception as e:
print('Cookie已过期,请及时更新!!!')
return
expect = json.loads(expect)
if 'result' in reality['通达信股票 数据接口,data']:
if expect['isSuccess'] == reality['通达信股票 数据接口,data']['result']['isSuccess']:
flag = True
else:
flag = False
else:
if expect['isSuccess'] == reality['通达信股票 数据接口,data']['cartHeadInfo']['isSuccess']:
flag = True
else:
flag = False
return flag
然后在json文件中,需要定义名为cart_通达信股票 数据接口,data2的json数据,请留意请求数据中的cart2No得值,因为在接下来的测试代码中会自动的去跟新cart2No的值
通过fiddler抓取下单的接口,该接口返回的数据中可以看出cart2No=62020000020751437该商品的订单编号以及customerNo=7157450907客户编号
第八步:然后将从用户登录接口中获取到的响应数据中的cookie数据作为下单接口用户登录的请求数据中的cookie,来访问下单页面,这样就完成了模拟登录获取cookie请求订单接口
第四步:运行程序,查看苏宁服务器返回的数据,对比与博主在官网登录成功后fiddler工具抓取的登录成功服务器返回的响应数据一致,表示模拟登录成功
第六步:再次重复第一步到第四步的步骤,博主在网页上进行拖动验证通过后,通过抓包工具fiddler可以明显看出,这次登录请求的通达信股票 数据接口,data数据中明显多了些参数,这些参数就是验证码这块的
查看目标邮箱成功收到邮件,说明使用Jenkins工具进行持续化集成项目成功
持续集成环境搭建
结果统计+报告通知
安装插件需要等待
数据依赖问题从设计思路开始
上一步中已经成功的提取cart2No得值以及向支付接口发送数据,现在则需要判断返回的响应数据中的isSuccess字段的值是否为Y,并将最终的测试结果写入到excel表实际结果字段中去,那么首先需要在excel表中填写预测结果
运行启动测试文件,结果为测试成功,并将数据实际结果数据成功写入到excel实际结果列中
最后运行启动文件run_test查看获取excel文档以及json文档数据是否正确
构建任务的触发器,设定下一此执行任务的时间
构建发送邮件服务
数据依赖问题方法封装之通过case_id获取case数据
下载安装Jenkins,进入其官网下载页面,如下所示,各种版本的下载,博主这里就不下载windows版本的Jenkins,因为安装太简单,只需要一直下一步,博主下载GenericJavapackage(.war)版本
数据依赖问题之依赖结构构建
测试运行run_test启动文件,将测试结果报告发送至邮箱
然后在浏览器中访问http://10.1:8080,进入以下页面
case运行结果统计
在页面输入管理员密码后,进入如下页面,选择安装推荐的插件
整体测试接口,首先在excel表中填写预期结果
首先需要进入163个人邮箱中,开启POP3/SMTP服务
然后开启客户端授权密码并进行设置,改授权密码需要记住,用于第三方也就是我们代码中需要填写的password
查看邮箱已收到自动化测试报告邮件
因为在APP购买中也是提示此错误,这是其接口关闭或者不能在app苏宁易购中购买
在json文档中增加excel表中的cart_通达信股票 数据接口,data请求数据以及cart_header数据
在excel测试数据中case依赖丶依赖的返回数据丶数据依赖这三个字段是根据当前的接口的请求数据中是否需要从其他接口的响应中获取,根据上一步中的分析,进行如下填写
模拟登录获取cookie请求订单接口
然后在run_dependent_case方法中去调用以上定义的打印测试数据的方法
在如上页面中路径打开initialAdminPassword文件或者是在cmd运行窗口日志中查看管理员密码
九丶获取cookie及请求处理
调用以上方法测试获取case_id为suning-02所在的行所有数据
现在运行run_test启动文件,查看结果完全没问题,之前特意说明了json文件中的cart_通达信股票 数据接口,data2的数据中的cart2No的值,现在运行代码后,将下单接口返回的响应数据中的cart2No的值赋给请求数据通达信股票 数据接口,data,所以这里打印出来的请求数据的值的cart2No键的值与下单接口的响应数据中的值一致,需要说明的是支付的接口是测试失败,返回的响应数据中的错误信息为'errorMessage':'销售火爆,请稍后再试(E23'
数据依赖问题之根据规则提取响应数据
# -*- coding: utf-8 -*-
__author__ = 'cdtaogang'
__date__ = '2019/6/24 17:07'
from utils.op_excel import operationExcel
from 通达信股票 数据接口,data.通达信股票 数据接口,data_get import getData
import requests, json
class HandleData(object):
def __init__(self, case_id):
self.case_id = case_id
self.op_excel = operationExcel()
self.通达信股票 数据接口,data = getData()
def get_case_line_通达信股票 数据接口,data(self):
'''获取case所在行数据'''
x_通达信股票 数据接口,datas = self.op_excel.get_x_values(self.case_id)
# ['suning-01', '下单', 'https://shopping.suning.com/app/addcart/private/quickBuy.do', 'yes', 'post', 'yes', '', '', '', 'cart_header', 'cart_通达信股票 数据接口,data', '{'isSuccess':'Y'}', 'pass']
return x_通达信股票 数据接口,datas
def run_dependent_case(self):
'''执行获取case所在的整行数据'''
# run = RunMain()
x = self.op_excel.get_x_nums(self.case_id)
request_header = self.通达信股票 数据接口,data.get_通达信股票 数据接口,data_for_header(x)
request_通达信股票 数据接口,data = self.通达信股票 数据接口,data.get_通达信股票 数据接口,data_for_json(x)
request_url = self.通达信股票 数据接口,data.get_request_url(x)
request_method = self.通达信股票 数据接口,data.get_request_method(x)
is_run = self.通达信股票 数据接口,data.get_is_run(x)
module = self.通达信股票 数据接口,data.get_module_name(x)
expect = self.通达信股票 数据接口,data.get_expect_通达信股票 数据接口,data(x)
if is_run:
res = requests.post(url=request_url, 通达信股票 数据接口,data=request_通达信股票 数据接口,data, headers=request_header, verify=False)
print(res.text)
print(json.loads(res.text)['通达信股票 数据接口,data']['result']['cart2No'])
HandleData('suning-01').run_dependent_case()
调用send_main方法,测试打印的content内容数据是否正确
就需要在通达信股票 数据接口,data_conpy文件中进行添加获取该列的索引值
class global_var:
id = '0' # id
module = '1' # 模块
url = '2' # url
run = '3' # 是否运行
request_type = '4' # 请求类型
request_header = '5' # 是否携带header
case_depend = '6' # case依赖
response_通达信股票 数据接口,data_depend = '7' # 依赖的返回数据
通达信股票 数据接口,data_depend = '8' # 数据依赖
request_header_通达信股票 数据接口,data = '9' # header值
request_通达信股票 数据接口,data = '10' # 请求数据
expect_result = '11' # 预期结果
reality_result = '12' # 实际结果
def get_request_header_通达信股票 数据接口,data():
return global_var.request_header_通达信股票 数据接口,data
再次在终端执行则提示成功
数据依赖问题之流程实施
运行以上代码,手动传入case_id以及依赖数据的key,成功的提取出数据依赖字段数据
经过测试成功打印出接口数据依赖的key的值,说明在excel表中填写的依赖返回数据的格式是没问题的成功的被jsonpath_rw进行匹配并获取出,接下来则需要将获取到的cart2No的值赋给请求数据通达信股票 数据接口,data中的cart2No键的值,而cart2No键就是通过get_通达信股票 数据接口,data_dependent方法获取到excel表中数据依赖字段的值,最后通过requests模块post请求向目标接口发送请求数据
插件安装完成后,即进入如下页面,创建管理员用户
如苏宁易购的提交订单接口,是需要用户登录后才能进行的操作,之前获取下单的接口都是在app中进行获取的,博主在这里登录网页版的苏宁官网,抓取下单的接口
博主整理了一下整个下单和支付的接口已经请求数据和响应数据
# 下单
request_url = 'https://shopping.suning.com/app/addcart/private/quickBuy.do'
request_通达信股票 数据接口,data = {
'通达信股票 数据接口,data':{'cartHeadInfo':
{'userFlag':'0','directFlag':'1','operationChannel':'50',
'operationTerminal':'01','operationEquipment':'02','operationUser':'',
'token':'0706172998861561345578681_3989FF3858C23E2FE49FB96928935FC51BC2D7E2B00145D19087E1232123D1E2F6AEA7E5A1D95F2B9BC731F5FA0F0B48',
'detect':'mmds_a_._920c68ed-4fcc-440e-a717-28b23d2a26fd_._YQQQ**1_PaaX*C****4*n**1_Paa0*C**1-D*n******2_*****oy****1_PbTSXH*1J54.o*******1XH**1LD.o*o1_PaA7XH****k.o******Pv****Pdy****1_P0DZcc**iU4Mq**1_P0DZcc**1-DMq**1_PcB_c2**lm4M9**1_PcB_c2**1-DM9******MS****OHy****1_Pc9*ce**GH4YZ**1_Pc9*ce**1kDYZ**1_Pc9*ce**Iq4YZ**1_Pc9*ce**17DYZ**1_Pc9*cH**DU4Yn**1_Pc9*cH**1CDYn**1_Pc9*cc**3m4Yn**1_Pc9*cc**P3DYn**1_Pc9*cd**X0441**1_Pc9*cd**1AD41**1_Pc9*cm**3R44Z**1_Pc9*cZ**1-D4Z**1_Pc9*cZ**Pa44Z**1_Pc9*cZ**1oD4Z*******1cZ**1p44Z**1_Pc9*cZ**ReD4Z**1_Pc9*cZ**1m44Z**1_Pc9*cZ**1lD4Z**1_Pc9*cm**1X44Z**1_Pc9*cm**1eD4Z**1_Pc9*ck**1l44Z**1_Pc9*ck**1lD4Z**1_Pc9*ck**Px44Z**1_Pc9*ck****D4Z**1_Pc9*cL**9m4Y_**1_Pc9*cL**1kDY_*******1cL**1S4Y_**1_Pc9*cL**RkD41**1_Pc9*cJ**18441**1_Pc9*cJ**1iD41**1_Pc9*cJ**1m441**1_Pc9*cJ**1kD41**1_Pc9*ch*1Sx441**1_Pc9*ch**1aD41**1_P0jS*yPUup4*4**1_P0jS*y**1_D*4******Pv*****ty****1_P0DZch*1WE4Ob**1_P0DZch**1xDOb**1_PcB_c0**fx4M0**1_PcB_c0**1oDM0******MS****3Sy********Pv***J*Ey********2_****ixy****1_PbTS*y**UZ4*d**1_PaPK*y**1XD*d******2N*****By****1_PaPi*v**KZ4*n**1_PaPi*v**POD*n******RA*****hy****1_PcVIcd**qr449*******1cd**POD49**1_PbZJM1**if4YK**1_PavoM1**PXDYK******.p****13y****1_PcjG2E*EhR42N*******12E**1oD2N******Pv****POy****1_PaaX*5*.xf4*j**1_Paa0*5**1CD*j******.p*****qy****1_PcjG2a**uo42x*******12a**PeD2x******Pv****1zy****1_P0DZcc**C84O4**1_P0DZcc**P*DO4**1_PcB_cc*P9m42a**1_PcB_cc**P3D2aQQQNvJjJhSpefQQQMMceTs**aYcXDfPGXDsuXcYGMXuCaebCQQQMDYaPPYKtBQQQMDMYuQQQMQQQP*sPYDCXXPDsaQQQMQPQMf46724f27b81204df0356ffa5666c5ec','dfpToken':'TFItvV179MauUij2SsWqz0b18','operationStoreCode':'','provinceCode':'020','cityCode':'021','districtCode':'02111','logContent':''},
'immediateBuyItems':[{'itemHeadInfo':{'itemNo':'1','activityType':'01','activityId':''},
'mainCmmdtyInfo':{'basicInfo':{'itemNo':'1','cmmdtyCode':'000000010985369117','shopCode':'0000000000','shopAddCode':'0030001790','shopName':'苏宁自营','overSeasFlag':'','cmmdtyQty':'1','serviceStoreCode':'','serviceStoreName':'','commodityType':'','carShopSerWay':''}}}],
'supportYB':'1','publishDate':'20190508'
}
}
response_通达信股票 数据接口,data = {
'api':'ccf.cart1.quickbuy',
'code':'1',
'通达信股票 数据接口,data':{'errorInfos':[],'result':{'cart2No':'620200000207521425','customerNo':'7157450907','isSuccess':'Y','reserve':'','safeDps':'0','showRecommend':'1'}},
'msg':'','v':'1.0'
}
cart2No = response_通达信股票 数据接口,data['通达信股票 数据接口,data']['result']['cart2No']
# 支付
request_url = 'https://shopping.suning.com/app/V2/private/confirmOrder.do'
request_通达信股票 数据接口,data = {'cart2No':cart2No,
'salesPerson':'',
'channelType':02,
'terminalVersion':MOBILE|02|01|7.7.3|11007,
'terminalModel':HUAWEI|DUK-AL20,
'orderMemoJson':[],
'saleChannel':000000011116457666|9264|121.492479|31.247221|00|06|;000000011039772482|9264|121.492479|31.247221|00|06|,
'showGift':1,
'cipher':'',
'detect':'mmds_a_._920c68ed-4fcc-440e-a717-28b23d2a26fd_._YQQQ**1_Pc9*cd****DY5**1_Pc9*cd**jx4Y5**1_Pc9*cd**PODY5**1_Pc9*cd**9T4Y5**1_Pc9*cd**PMDY5**1_Pc9*cd**X04Y5**1_Pc9*cd**PeDY5**1_Pc9*cd**4q4Y5**1_Pc9*cd**PkDY5**1_Pc9*cd**Dm4Y5**1_Pc9*cd**PkDY5**1_Pc9*cd**E34Y5**1_Pc9*cd**PlDY5**1_P0jS*y*SjM4*X**1_P0jS*y**1ND*X******Pv*****ty****1_P0DZcH*11i42u**1_P0DZcH**1_D2u**1_PcB_cD**mY42A**1_PcB_cD**1oD2A******MS****Muy****1_P0jS*_**pG4*m**1_P0jS*_**1SD*m******Pv*****qy****1_P0DZci*3bJ4MK**1_P0DZci**1-DMK**1_PcB_c**YjB4RB**1_PcB_c***1oDRB******MS****MPy****1_Pc9*ct*1To4YC**1_Pc9*ct**1CDYC**1_P0jS*C1sPt4*J**1_P0jS*C**1CD*J******Pv*****yy****1_PaaX*C**E-4*n**1_Paa0*C**1-D*n******2_*****oy****1_PbTSXH*1J54.o*******1XH**1LD.o*o1_PaA7XH****k.o******Pv****Pdy****1_P0DZcc**iU4Mq**1_P0DZcc**1-DMq**1_PcB_c2**lm4M9**1_PcB_c2**1-DM9******MS****OHy****1_Pc9*ce**GH4YZ**1_Pc9*ce**1kDYZ**1_Pc9*ce**Iq4YZ**1_Pc9*ce**17DYZ**1_Pc9*cH**DU4Yn**1_Pc9*cH**1CDYn**1_Pc9*cc**3m4Yn**1_Pc9*cc**P3DYn**1_Pc9*cd**X0441**1_Pc9*cd**1AD41**1_Pc9*cm**3R44Z**1_Pc9*cZ**1-D4Z**1_Pc9*cZ**Pa44Z**1_Pc9*cZ**1oD4Z*******1cZ**1p44Z**1_Pc9*cZ**ReD4Z**1_Pc9*cZ**1m44Z**1_Pc9*cZ**1lD4Z**1_Pc9*cm**1X44Z**1_Pc9*cm**1eD4Z**1_Pc9*ck**1l44Z**1_Pc9*ck**1lD4Z**1_Pc9*ck**Px44Z**1_Pc9*ck****D4Z**1_Pc9*cL**9m4Y_**1_Pc9*cL**1kDY_*******1cL**1S4Y_**1_Pc9*cL**RkD41**1_Pc9*cJ**18441**1_Pc9*cJ**1iD41**1_Pc9*cJ**1m441**1_Pc9*cJ**1kD41**1_Pc9*ch*1Sx441**1_Pc9*ch**1aD41QQQNvJjJhSpefQQQMMceTs**aYcXDfPGXDsuXcYGMXuCaebCQQQsaCMDCXuDYQQQMDMYuQQQMQQQP*sPYDCMMusCuQQQMQPQM73a04a9cdb50e2faa2bf8d79252434e3',
'dfpToken':'TFItvV179MauUij2SsWqz0b18',
'deviceNo':'868334782216554',
'specDesc':[{'itemNo':'620200000344251973','pictureLink':'//imgservice.suning.cn/uimg1/b2c/image/5lHDNQYOPSu5tQWQt9JdHA.jpg','specInfos':[{'specTypeName':'颜色','specContent':'秘境黑'},{'specTypeName':'规格','specContent':'6GB+64GB'}]}],
'splitFlag':01,
'publishDate': 20190508,
}
response_通达信股票 数据接口,data = {
'api':'ccf.cart2.submitOrder',
'code':'1',
'通达信股票 数据接口,data':{'cardInfoss':[],'cartHeadInfo':{'alipayWakeFlag':'1','cart2No':'','customerNo':'','dfpTokenStatus':'','isSuccess':'N','miniCartRouteSwitch':'','payStatus':'','toastTime':'5'},
'errorInfos':[{'cmmdtyPrice':'','dareType':'','earlyPrice':'',
'errorCode':'CSC-71-0002',
'errorMessage':'销售火爆,请稍后再试(E234)',
'itemNo':'0','itemType':'0','needImageCode':'','ticket':''}],
'orderItems':[],'voucherInfoss':[]},
'msg':'','v':'1.0'
}
博主在handle_通达信股票 数据接口,data_dependent模块中定义一个方法print_test_通达信股票 数据接口,data用于打印出我们想要的测试数据,代码很简单就不说了
class HandleData(object):
def __init__(self, case_id):
self.case_id = case_id
self.op_excel = operationExcel()
self.通达信股票 数据接口,data = getData()
self.com_util = CommonUtil()
self.pass_count = []
self.fail_count = []
def print_test_通达信股票 数据接口,data(self,url,method,module,is_run,通达信股票 数据接口,data,header,expect,res,x):
'''打印测试数据'''
print('模块名:', module)
print('请求地址:', url)
print('请求方式:', method)
print('是否运行:', is_run)
print('请求数据:', 通达信股票 数据接口,data)
print('请求头:', header)
print('预期结果:', expect)
print(res.text)
if self.com_util.is_contains(expect, res.text):
print('测试通过')
print('*' * 60 + '分割线' + '*' * 60)
self.通达信股票 数据接口,data.write_reality_通达信股票 数据接口,data(x, 'pass')
self.pass_count.append(x)
else:
print('测试失败')
print('*' * 60 + '分割线' + '*' * 60)
self.通达信股票 数据接口,data.write_reality_通达信股票 数据接口,data(x, 'fail')
self.fail_count.append(x)
return self.pass_count, self.fail_count
然后运行以上代码,登录2384005622@qq.com邮箱,查看是否收到邮件,并核实邮件内容和主题是否与设置的一致
运行启动文件run_test,成功打印出case成功失败以及测试case总量数
然后退出登录,在浏览器中输入以上fiddler抓取的下单接口,服务器就会重定向到登录的接口
然后在send_main中调用send_mail方法,将自动化测试报告发送到目标邮箱中
紧接着在项目utils工具包下创建send_emaipy文件,在该文件中编写代码登录连接163邮箱的POP3/SMTP服务向目标邮箱发送指定主题以及内容的邮件
# -*- coding: utf-8 -*-
__author__ = 'cdtaogang'
__date__ = '2019/6/25 18:05'
import smtplib
from email.mime.text import MIMEText
class SendEmail(object):
global send_user
global pwd
global email_host
def send_mail(self,user_list,content,sub):
'''
:param user_list: 收件人列表
:param content: 邮件内容
:param sub: 主题
:return:
'''
send_user = 'cdtaogang@163.com'
password = '设置的授权码'
email_host = 'smtp.163.com'
sender_msg = 'cdtaogang'+'<'+send_user+'>'
message = MIMEText(content, _subtype='plain', _charset='utf-8')
message['Subject'] = sub
message['From'] = sender_msg
message['To'] = ';'.join(user_list)
server = smtplib.SMTP()
server.connect(email_host)
server.login(send_user,password)
server.sendmail(sender_msg,user_list,message.as_string())
server.close()
if __name__ == '__main__':
user_list = ['2384005622@qq.com']
sub = '测试邮件'
content = '这是用来测试的邮件!!!'
SendEmail().send_mail(user_list,content,sub)
八丶持续集成
七丶接口自动化框架设计到开发
查看邮箱邮件,成功将自动化测试报告发送至邮箱中
为了进一步的测试,需要在excel表中填写下单接口的请求数据json的key值,博主这里命令为cart_通达信股票 数据接口,data2
在excel表中依赖返回数据中添加的返回响应的关键字必须是以这种格式进行层级关系的填写
除了在编辑器中直接run运行run_test.py启动文件以外,还可以在windowscmd终端以及PycharmTerminal终端使用python解释器直接运行,如下所示
文章为作者独立观点,不代表股票交易接口观点