如果你不太明白这篇文章是做什么的,点击下方进入介绍篇:
点击跳转到介绍篇,你可以知道自己能收获什么,和将要做的功能点和是否值得学习,别再迷茫了,不日进,则日退,学习才是你应该做的事情。
进入介绍篇了解你将要走的路:python接口自动化测试(第一篇)
开始改变人生之旅,不在被开发嫌弃,不在害怕面试没有亮点,没有竞争力。
上一章已经可以把element相关接口的配置文件读取出来了,接下来咱们读取testcase文件:
文件下载地址可以加qq群进行获取,也可以通过下载地址进行获取
在seautotest下增加testcase文件,将testcase.xlsx放入这个文件夹下
testcase.xlsx内容如截图:
思路如下:
-
第一步:将数据全部读取出来,使用上一章里面封装好的读取Excel的方法进行
-
第二步:获取到的数据,组成json结构(不懂什么是json的可以自行百度下)
-
第三步:替换数据,将excel的数据进行替换,调用python函数(这样可以灵活的处理数据)
接下来进行读取:
在utlis.py方法里面
加入这几行代码:
if __name__ == '__main__':
# file = '../element/elements.xlsx'
# e = Excel('r', file)
# list_read = e.read()
# ele = element_tojson(list_read)
# print(ele['获取短信验证码'])
test_case = '../testcase/testcase.xlsx'
e_case = Excel('r', test_case)
# 打印输出结果
for case in e_case.read():
print(case)
将获得的结果打印出来,输出结果如下:
看来封装的方法还是挺好用的~~~可以直接读取出来内容,接下来对testcase内容进行处理
这里进行第二步,将testcase.xlsx文件读取出来的内容,重组成为json格式
在utlis.py里面增加datatojson方法,代码如下:
"""
1.讲excel头部替换成英文的
2.处理成json格式
"""
def datatodict(data):
header = {
'用例编号': 'id',
'用例标题': 'title',
'前置条件': 'condition',
'测试功能点': 'testdot',
'测试步骤': 'step',
'操作': 'keyword',
'页面': 'page',
'元素': 'element',
'测试数据': 'data',
'预期结果': 'expected',
'设计者': 'designer',
'步骤结果': 'score',
'备注': 'remark',
}
head = []
list_dict_data = []
for d in data[1]:
# 获取到英文的头部内容如果为中文,则替换成英文 进行改成一个k
# 传入两个参数的作用是 查到则返回查到的数据查不到则返回传入的原数据
d = header.get(d, d)
# 将去除的头部英文装进list中
head.append(d)
# 获取到数据进行切片处理,0坐标为标题,1坐标是头部
for b in data[2:]:
# 头部和内容拼接为json串
dict_data = {}
for i in range(len(head)):
# 之所以判断类型,如果不进行判断会出现str的错误,strip去除空格也有转str的用法
if isinstance(b[i], str):
dict_data[head[i]] = b[i].strip()
else:
dict_data[head[i]] = b[i]
# list里面是字典格式
list_dict_data.append(dict_data)
return list_dict_data
写完之后运行检查下函数是否可用,也是检查下代码,写了一堆代码后来发现不能用是不是很尴尬,所以写一个就调试一下
if __name__ == '__main__':
# file = '../element/elements.xlsx'
# e = Excel('r', file)
# list_read = e.read()
# ele = element_tojson(list_read)
# print(ele['获取短信验证码'])
test_case = '../testcase/testcase.xlsx'
e_case = Excel('r', test_case)
re=e_case.read()
for c in datatodict(re):
print(c)
运行结果如下:
下一步,数据处理为json格式,可执行json格式:
我还是在utlis.py里面增加suite_format函数
讲dict格式的数据处理为测试套件格式
# dict格式的数据处理为测试套件格式
def suite_format(data):
# 用例套件list
testsuite = []
# 每个用例的testcase
testcase = {}
# 得到用例的所有数据
# 循环遍历判断里面是不是一组用例生成用例集
for d in data:
# 判断用例有没有标题,没有标题则认为是统一用例,有标题则认为是第二条第三条用例依次类推
if d['id'].strip():
# 判断是否为空 true false
if testcase:
# 不为空则只认为用例直接添加到list里面
testsuite.append(testcase)
# 讲testcase置空
testcase = {}
# 这里生成了用例的标题行,里面没有step
for key in ('id', 'title', 'condition', 'testdot', 'designer', 'remark'):
# test[key] 为id等值,d[key]为内容值
testcase[key] = d[key]
# 添加steps字段,并设置为list
testcase['steps'] = []
# 取出的是测试步骤第一步第二步
step = {}
# 步骤里面添加control字段
step['control'] = ''
# 步骤
step['no'] = str(d['step'])
# 去除这些对应的内容放入step里面
for key in ('testdot', 'keyword', 'element', 'data', 'expected', 'output', 'score', 'remark'):
# 获取用例内容字段进行拼接
step[key] = d.get(key, '')
# 仅作为测试结果输出时,保持原样
# 进行的操作
step['_keyword'] = d['keyword']
# 对应的key取值
step['_element'] = d['element']
# 测试数据
step['_data'] = d['data']
# 预期结果
step['_expected'] = d.get('expected', '')
# 输出结果
step['_output'] = ''
# 测试结果信息
step['_resultinfo'] = ''
# 添加测试步骤
testcase['steps'].append(step)
testsuite.append(testcase)
# 返回处理好的值
return testsuite
接下来咱们将写好的方法调用一下试试
if __name__ == '__main__':
# file = '../element/elements.xlsx'
# e = Excel('r', file)
# list_read = e.read()
# ele = element_tojson(list_read)
# print(ele['获取短信验证码'])
test_case = '../testcase/testcase.xlsx'
e_case = Excel('r', test_case)
re = e_case.read()
data = datatodict(re)
testsuite = suite_format(data)
print(testsuite)
输出结果这里不演示了太长了...
通过json格式在线校验,可以清楚的看到结构:
下面我们将测试数据的内容进行替换:
有的同学已经问到提交表单等信息怎么进行提交
下面可以将测试数据进行替换成咱们想要的内容:
test-case的测试数据内容,进行重组
parmars={'phone': '<b.create_phone()>', 'type': '1'}
进行处理成咱们想要的内容:
代码结构新增data.py文件和lib文件夹,lib文件下,创建b.py文件
init.py如下:
__all__=['b']
b.py:如下
import random
from pathlib import Path
"""
自定义函数,生成相对于的加密串,手机号等信息
"""
path = str(Path('config') / ('txt_final.txt'))
def create_phone():
# 第二位数字
second = [3, 4, 5, 7, 8][random.randint(0, 4)]
# 第三位数字
third = {
3: random.randint(0, 9),
4: [5, 7, 9][random.randint(0, 2)],
5: [i for i in range(10) if i != 4][random.randint(0, 8)],
7: [i for i in range(10) if i not in [4, 9]][random.randint(0, 7)],
8: random.randint(0, 9),
}[second]
# 最后八位数字
suffix = random.randint(9999999, 100000000)
phone = "1{}{}{}".format(second, third, suffix)
writetxt(phone)
# 拼接手机号
return phone
# 方法可以写入token和普通常量
def writetxt(phone):
print(phone)
f = open(path, 'a')
f.write(phone + '\n')
f.close()
def gettxt():
try:
f = open(path, 'r')
sourceInLines = f.readlines() # 按行读出文件内容
return sourceInLines[0]
except:
# print('null')
pass
f.close()
def gettoken():
f = open(path, 'r')
sourceInLines = f.readlines() # 按行读出文件内容
try:
return sourceInLines[1]
except:
print('no found token')
f.close()
data.py中增加如下方法:
import re
import time
#因为在data.py中replace函数会调用lib文件下b.py文件,所以咱们data.py中引入
from lib import *
var = []
# 这个方法是将自定义函数计算出来,eval函数可以用过字符的方法计算出结果内容,函数嵌套函数也是可以的
def replace(data):
# 正则匹配出 data 中所有 中的变量,返回列表 不包含这些内容则返回空
keys = re.findall(r'<(.*?)>', data)
# 返回是个list,采用替换的方法进行数据重组
for r in keys:
# 第一个参数是原来的值,第二个是参数是计算出来之后得到的值
data = data.replace('<' + r + '>', eval(r))
return data
b.py中增加如下方法:
def create_phone():
# 第二位数字
second = [3, 4, 5, 7, 8][random.randint(0, 4)]
# 第三位数字
third = {
3: random.randint(0, 9),
4: [5, 7, 9][random.randint(0, 2)],
5: [i for i in range(10) if i != 4][random.randint(0, 8)],
7: [i for i in range(10) if i not in [4, 9]][random.randint(0, 7)],
8: random.randint(0, 9),
}[second]
# 最后八位数字
suffix = random.randint(9999999, 100000000)
phone = "1{}{}{}".format(second, third, suffix)
# 拼接手机号
return phone

接下来咱们调用试一下,直接在data.py里面调试即可,完整版代码如下:
import re
import time
from lib import *
var = []
# 这个方法是将自定义函数计算出来,eval函数可以用过字符的方法计算出结果内容,函数嵌套函数也是可以的
def replace(data):
# 正则匹配出 data 中所有 中的变量,返回列表 不包含这些内容则返回空
keys = re.findall(r'<(.*?)>', data)
# 返回是个list,采用替换的方法进行数据重组
for r in keys:
# 第一个参数是原来的值,第二个是参数是计算出来之后得到的值
data = data.replace('<' + r + '>', eval(r))
return data
if __name__=='__main__':
parmars = "{'phone': '<b.create_phone()>', 'type': '1'}"
print(replace(parmars))
输出结果如下:
接口自动化第五章,开始继续学习吧~
源码下载地址复制地址打开,不然会没有权限:https://gitee.com/zhangmeng1314/seautotet-public.git
感谢您的阅读,本人是希望能帮助到想进步学习的同学,大佬勿喷,我会一直维护此项目争取做的更好,我也是一个小白,希望和大家一起成长,第一次写博客文章,大家有意见感觉写的不好不清楚,评论区留言都可以的哦,我会用最简单的方式去解答您的问题,谢谢
qq群:234922431
网友评论