Python_自动化_ATP框架
接口自动化测试框架-数据驱动-ATP 优点:用例特别多,批量运行,缺点:每条用例之间没有关系
整体描述:从启动文件看start,
1.glob找测试用例.xls文件们,
2.获取所有用例:readExcel()函数,是打开EXCEL,打不开返回异常,打开了获取sheet页,循环获取所有用例,拿回来存在一个变量里all_case,
3.执行用例:run_case(all_case),把所有的用例拿过来循环,url,请求参数,方法,校验结果获取,请求参数转字典,判断请求方式调接口,然后校验结果,调用check_res(),判断‘’通过‘’失败‘,循环的结果放在一个list(all_res[res,check])里返回
4.写回到原来的文件里write_res()
5.所有用例得个数 case_count
6.通过用列得个数
7.累加每个文件里面的用例
8.累加通过得用例数
9.附件加入
一、作业思路--(写一个一个组件)
1.读取Excel所有的测试用例------xlrd模块
2.根据测试用例调用接口--requests
3.校验结果--if
4.结果写入Excel xlutils
5.生成报告,发送邮件 yagmail
二、解决方案
框架:一些工具的集合。对功能进行封装,提高复用性
1.获取用例
2.执行用例
3.校验结果
4.生成报告
数据驱动:根据数据去测试
代码驱动:根据代码去测试
关键字驱动:根据关键字去测试
三、程序清单
atp-----------------程序目录
bin-----------------可执行文件
start.py---------启动文件
cases--------------测试用例目录
测试用例.xls------用例文件
测试用例1.xls-----用例文件
config--------------配置文件目录
setting.py--------配置信息
lib-------------------主程序(逻辑)目录
my_request---------封装请求方法
tools------------------封装工具
logs------------------日志目录
atp.log--------日志文件
readme------------说明文件
lib
tools.py
import xlrd,os
#1.读取Excel所有的测试用例------xlrd模块
def readExcel(file_name):
try:
book = xlrd.open_workbook(file_path) #打开Excel
except Exception as e:
log.error('打开用例出错,文件名为%s'%file_path)
return[]
else:
all_case = [] #存放所有用例
sheet = book.sheet_by_index(0) #读取sheet页
for i in range(1,sheet.nrows):
row_data = sheet.row_values(1)
all_case.append(row_data[4:8]) #切片顾头不顾尾
return all_case
#校验结果
def check_res(res:str,check:str)
'''
res:返回得是Json串转换成["code=200", "userId=1'],
check:转变成一个list 然后遍历比较 判断check里的值是否存在在res里
"product":
"code": "200"
‘’‘
new_res = res.replace(' “: ” ’,'=‘).replace(' ": ','=')
#check.split(',') #code=200,userId=1 变为list ['code=200', 'userId=1']
for c in check.split(','):
if c not in new_res:
return '失败'
return ’成功‘
from xlutils.copy import copy #3.结果报告写入Excel --------- xlutils
###res_list= {'code :200,userId :1’,'通过'}
def write_res(file_name,res_list):
book = xlrd.open_workbook(file_name)
new_book = copy(book)
sheet = new_book.get_sheet(0)
for row, data in enumerate(res_list,1):
res,status = data
sheet.write(row,8,res)
sheet.write(row,9,status)
new_book.save(file_name)
def str_to_dict(s:str, seq = '&'):
#username=niuhanyang&password=123456
#['username : niuhanyang','password : 123456' ]
d = {}
if s:
for tmp in s.split(seq): #username=niuhanyang,password = 123456
user,passwd = tmp.split('=') #username:niuhanyang, password:123456
d[user] = passwd #加入字典
return d
def run_case(all_case):
all_res = [] #好多条用例存在list里返回
for case in all_case:
log.info('正在运行%s'%log)
url, method,data,check = case #传过来的case有四个值
data = str_to_dict(data) #把EXCEL里得字符串转换成字典再进行判断
if method.upper() == 'POST':
res = my_requests.post(url,data) #requests调取接口post,get
else:
res = my_requests.get(url, data)
status = check_res(res,check)
all_res.append([res,status])
import yagmail
def send_mail(content,files): #附件
mail = yagmail.STMP(**MAIL_INFO)
subject = '%s_接口测试报告'%time.strftime('%Y-%m-%d %H:%M:%S')
#连接上邮箱
mail.send(to = TO, cc = CC, content = content, subject = subject, attachments = files)
#2.调用接口--requests
my_requests.py
from config.settings import log
def my_Requests(post(url, data, header = none, cookies = none, is_Json = Flase)):
try:
if is_Json:
res = requests.post(url = url, json = data, header = header, cookies = cookies).text #.json返回为字典 .text返回为字符串
else:
res = requests.post(url = url, data = data, header = header, cookies = cookies).text
except Exception as e:
log.error('接口请求失败,失败原因%s'%e)
res = str(e)
return res
def get(url, data, header = None, cookies = None):
try:
res = requests.get(url, params = data, headers = header, cookies = cookies).text
except Exception as e:
my_log.error('接口请求出错,%s'%e)
res = str(e)
return res
bin
start.py
import os,sys
BATH_PATH = os.path.dirname(os.name.dirname(os.path.abspath(__file__)))
sys.path.insert(0,BATH_PATH)
from lib firm tools
from config.setting import CASE_PATH
import glob #listdir 要和循环配合使用找到自己想要的文件
def main():
all_count = 0
all_pass_count = 0
files = []
for file in glob.glob(os.path.join(CSAE_PATH,'*xls')):
all_case = tools.readExcel(file) #读取用例
all_res = tools.run_case(all_case) #执行用例
tools.write_res(file,all_res) #4.写回到原来的文件里write_res()
case_count = len(all_case) #5.所有用例得个数 case_count
pass_count = str(all_res).count('通过') #6.通过用列得个数
all_count += case_count #7.累加每个文件里面的用例
all_pass_count += pass_count #8.累加通过得用例数
files.append(file) #返回一个执行完的Excel文件,很多用例执行,9.附件加入
msg='''
本次运行%s条用例,通过%s条用例,失败%s条用例,请见详细信息。
'''%(all_count,all_pass_count, all_count-all_pass_count)
tools.send.mail('mgs',files) #发邮件
5.生成报告,发送邮件 yagmail
config
settings.py
import os,nnlog
BATH_PATH = os.path.dirname(os.name.dirname(os.path.abspath(__file__))) #程序目录路径atp;dirname上级目录 abspath 绝对路径 __file__当前路径
LOG_NAME = 'atp.log'
ABS_FILE_PATH = BATH_PATH,'logs',LOG_NAME
log = log.Logger('ABS_FILE_PATH') #实例化
CASES_PATH = BATH_PATH,‘case’
MAIL_INFO = {
'user':' ',
'password':' ',
’host‘:' smtp.163.com'
} #邮箱信息
TO = [ ] #发送
CC = [ ] #抄送
#写完配置文件make source root 添加到环境变量中以备使用 from config.settings import log
118.24.3.40/api/product/all
118.24.3.40/api/user/login niuhanyang aA123456
字典,集合,json串区别
集合:{’1,2,3,4‘}
字典:{'key‘;’value‘}
Json串:{“key”:"value"}
pip install pyyaml