一、接口自动化的实现总流程图
逻辑流程
:
代码模块流程:
二、各个环节概述
2.1 case的管理
推荐方式
:数据库、excel
示例
:
2.2 主要模块简介
util---operation_excel:操作excel
#-*-encoding:utf-8-*-
import xlrd
from xlutils.copy import copy
import os
dir=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
class OperationExcel():
'''
操作excel,获取testcase
'''
def __init__(self,filename=None,sheet_id=None):
if filename:
self.filename=filename
self.sheet_id=sheet_id
else:
self.filename = dir+"\\dataconfig\\interface.xlsx"
self.sheet_id = 0
self.data = self.get_data()
#获取sheet的内容
def get_data(self):
data=xlrd.open_workbook(self.filename)
table = data.sheets()[self.sheet_id]
return table
#获取sheet的行数
def get_lines(self):
self.lines=self.data.nrows
return self.lines
#获取某一个单元格的内容
def get_cell_value(self,row,column):
self.cell_value=self.data.cell_value(row,column)
return self.cell_value
#写入单元格内容
def write_cell_value(self,row,column,value):
read_data = xlrd.open_workbook(self.filename)
write_data = copy(read_data)
sheet_data = write_data.get_sheet(self.sheet_id)
sheet_data.write(row,column,value)
write_data.save(self.filename)
#根据caseid,找到对应用例所在行的内容
def get_row_data(self,case_id):
row_num = self.get_row_num(case_id)
row_data=self.get_row_values(row_num)
return row_data
#根据case_id找到对应用例的行的行所在的索引号(行号)
def get_row_num(self,case_id):
row_num=0
cols_data = self.get_col_data()
for col_data in cols_data:
if case_id in col_data:
return row_num
row_num = row_num+1
#根据行号row,找到该行的内容
def get_row_values(self,row):
row_data = self.data.row_values(row)
return row_data
#根据列column获取某一列的内容
def get_col_data(self,column=None):
if column != None:
col_data=self.data.col_values(column)
else:
col_data = self.data.col_values(0)
return col_data
util-operation_json:操作json
# -*- encoding:utf-8 -*-
import json
class OperationJson():
'''
操作json文件
'''
def __init__(self,surce_path=None):
if surce_path == None:
self.surce_path ="../dataconfig/test_request_data.json"
else:
self.surce_path=surce_path
self.data = self.read_data()
#读取json文件
def read_data(self):
with open(self.surce_path) as fp:
data=json.load(fp)
return data
#根据关键字获取数据
def get_data(self,key):
return self.data[key]
#写json:cookie时用
def write_data(self,data):
with open("../dataconfig/cookie.json",'w') as fp:
fp.write(json.dumps(data))
runmethod:
基于requests封装的函数
#-*-encoding:utf-8-*-
import requests,json,urllib3
from urllib3.exceptions import InsecureRequestWarning
#避免添加verify参数后,安全请求警告
urllib3.disable_warnings(InsecureRequestWarning)
class RunMethod():
def post_main(self,url,data,header=None):
'''
备注这里header主要是cookies;如果之后接口不仅是cookies,需要重新添加header、cookies
:param url:
:param data:
:param header:
:return:
'''
res=None
if header !=None:
res=requests.post(url=url,data=data,cookies=header,verify=False)
try:
res=res.json()
return json.dumps(res, ensure_ascii=False, indent=2, sort_keys=True)
except:
return res.text
else:
res=requests.post(url=url,data=data,verify=False)
try:
res=res.json()
return json.dumps(res, ensure_ascii=False, indent=2, sort_keys=True)
except:
return res.text
def get_main(self,url,data=None,header=None):
'''
备注这里header主要是cookies;如果之后接口不仅是cookies,需要重新添加header、cookies
:param url:
:param data:
:param header:
:return:
'''
res=None
if header !=None:
res=requests.get(url=url,data=data,cookies=header,verify=False)
try:
res=res.json()
return json.dumps(res, ensure_ascii=False, indent=2, sort_keys=True)
except:
return json.dumps(res.text)
else:
res=requests.get(url=url,data=data,verify=False)
try:
res=res.json()
return json.dumps(res, ensure_ascii=False, indent=2, sort_keys=True)
except:
return json.dumps(res.text)
def run_main(self,method,url,data,header=None):
res=None
if method =="post":
res=self.post_main(url,data,header)
else:
res=self.get_main(url,data,header)
return res
main--run_main
:
#-*-encoding:utf-8-*-
import os,sys
#备注在jenkins构建项目时,有可能找不到项目地址、python项目的环境地址;所以需要加入
#加入项目地址
dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(dir)
#加入环境的三方包地址
sys.path.append("D:\\environment\\pyhon\\Lib\\site-packages")
from base.runmethod import RunMethod
from util import operation_excel,common_util
from data.get_data import GetData
from data.dependent_data import DependentData
from util.send_email import SendEmial
from util.operation_header import OperatonHeader
from util.operation_json import OperationJson
class RunTest:
def __init__(self):
self.run_method = RunMethod()
self.data = GetData()
self.com_util = common_util.CommonUtil()
def go_on_run(self):
res=None
pass_row=[]#excel中通过用例的行号
fail_row=[]#excel中失败用例的行号
rows_count=self.data.get_case_lines()
print(str(rows_count)+"-----------------------------------------------")
for i in range(1,rows_count):
print(i)
is_run = self.data.is_run(i)
if is_run:
url = self.data.get_request_url(i)
method = self.data.get_request_method(i)
header = self.data.is_header(i)
data = self.data.get_request_data_for_json(i)
expect = self.data.get_expect_data(i)
depend_fied = self.data.is_depend(i)
if depend_fied !=None:
self.depend_data = DependentData()
#获取的依赖用例响应的数据的那个字段的值
depend_response_data = self.depend_data.get_depend_data_for_key(i)
#获取依赖的所属字段
depend_key = self.data.is_depend(i)
data[depend_key] = depend_response_data
#header有无判断,进行不同操作
if header == 'write':
operaheader=OperatonHeader()
res = operaheader.write_cookie_in_json(url,data)
elif header !=None and header != 'write':
res = self.run_method.run_main(method, url, data, header)
else:
res = self.run_method.run_main(method, url, data)
print(res)
if self.com_util.is_contain(expect,res):
pass_row.append(i)
self.data.write_result(i,"测试通过")
print("测试通过——————————————————————————————》")
else:
fail_row.append(i)
self.data.write_result(i, res)
print("测试失败————————————————————————————————》")
send_email = SendEmial()
send_email.send_main(pass_row,fail_row)
if __name__ == '__main__':
run = RunTest()
res=run.go_on_run()