python接口自动化测试 ( 第四章)

上一章已经可以把element相关接口的配置文件读取出来了,接下来咱们读取testcase文件:

在seautotest下增加testcase文件,将testcase.xlsx放入这个文件夹下

python接口自动化测试 ( 第四章)

testcase.xlsx内容如截图:

python接口自动化测试 ( 第四章)

python接口自动化测试 ( 第四章)

思路如下:

第一步:将数据全部读取出来,使用上一章里面封装好的读取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)


将获得的结果打印出来,输出结果如下:

python接口自动化测试 ( 第四章)

看来封装的方法还是挺好用的~~~可以直接读取出来内容,接下来对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)


运行结果如下:

python接口自动化测试 ( 第四章)

下一步,数据处理为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>’, ‘type’: ‘1’}/<b.create>

进行处理成咱们想要的内容:

代码结构新增data.py文件和lib文件夹,lib文件下,创建b.py文件

python接口自动化测试 ( 第四章)

python接口自动化测试 ( 第四章)

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('', 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

python接口自动化测试 ( 第四章)


接下来咱们调用试一下,直接在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('', eval(r))

return data

if __name__=='__main__':

parmars = "{'phone': '<b.create>', 'type': '1'}"/<b.create>

print(replace(parmars))


输出结果如下:

python接口自动化测试 ( 第四章)

原文链接:https://blog.csdn.net/weixin_45344334/java/article/details/94492898


分享到:


相關文章: