边学习~
边进步~
一步一个脚印~
代码仓库:https://gitee.com/hedyyi/yiq_api_demo.git
首先,本文excel中case涉及的字段以及顺序为:
- 创建Base包;封装base_request请求方法
import requests
class BaseRequests:
#1-1:封装发送post方法;
def send_post(self, url, data, header=None):
res = requests.post(url=url, data=data, headers=header)
return res
#1-1:封装发送get方法;
def send_get(self, url, data, header=None):
res = requests.post(url=url, params=data, headers=header)
return res
#1-1:封装请求的主方法;
def run_main(self, method, url, data, header=None):
if method =='get':
res = self.send_get(url, data, header)
else:
res = self.send_post(url, data, header)
return res
base_request = BaseRequests()
- 创建Util包;封装获取excel中数据的各种方法;(前提需要有一个Case包用来存放excel的用例,本文使用的是testcase.xlsx)
import openpyxl
import os
base_path = os.getcwd() #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd())) #上级路径
"""
1.加载excel信息 ——load_excel
2.加载excel中所有sheet信息 ——get_sheet_data
3.获取行数 ——get_rows
4.获取某一行的信息 ——get_rows_value
5.获取某一列的数据 ——get_columns_value
6.获取行号 ——get_rows_number
7.获取某一个单元格的内容 ——get_cell_value
8.获取excel里面的所有的数据(也就是最终的用例) ——get_excel_data
9.写入数据
"""
class GetExcel:
#加载excel: 需要路径,告知哪里的excel
def load_excel(self):
excel = openpyxl.load_workbook(path+'/Case/testcase.xlsx')
return excel
#加载excel中所有sheet信息;需要给个下标,告知是哪一个sheet,默认为第一张excel
def get_sheet_data(self, index=None):
sheet_name = self.load_excel().sheetnames
if index == None:
index = 0
data = self.load_excel()[sheet_name[index]] #获取excel中sheet的数
return data
#获取行数
def get_rows(self):
data = self.get_sheet_data().max_row #max_row 表示总行数
return data
#获取某一行的所有内容,那么就需要传递一个行数的参数
def get_rows_value(self, row):
row_list = [] #每一行的数据都是一个列表;所有先定义一个空列表
for i in self.get_sheet_data()[row]: #通过行数 遍历循环excel的sheet中的数据
row_list.append(i.value) #然后添加到首先定义好的空列表中
return row_list
#获取某一列的所有内容;那么就需要传递一个列的参数
def get_columns_value(self, key=None):
column_list = []
if key == None: #如果列的key是空的,那么就默认获取A列数据
key = 'A'
column_list_data =self.get_sheet_data()[key] #通过 列 遍历循环excel的sheet中的数据
for i in column_list_data:
column_list.append(i.value)
return column_list
#获取行号,如果要指定获取哪一行,那就需要传递一个参数以便告知,此用例中 也就可以传递一个case_id
def get_row_number(self, case_id):
num = 1
cols_data =self.get_columns_value() #首先获取某一行所有内容
for col_data in cols_data: # 遍历循环每一行的数据,如果遍历出来的某个字段 = case_id 就返回
if case_id == col_data:
return num
num +=1
return num
#获取某一个单元格的内容; 此时就需要传递 行 和列 俩个参数
def get_cell_value(self, rows, cols):
data = self.get_sheet_data().cell(row=rows, column=cols).value
return data
#获取excel里面的所有的数据
def get_excel_data(self):
data_list = []
for i in range(self.get_rows()):
data_list.append(self.get_rows_value(i+2))
return data_list
#写入数据;要知道写入的行,列,以及数值
def write_excel_data(self, rows, cols, value):
wb = self.load_excel() #加载excel
wr = wb.active #获取sheet对应对象
wr.cell(rows, cols, value)
wb.save(path + '/Case/testcase.xlsx')
excel_data = GetExcel()
3.创建Run包;主要是run_main主程序运行
import os
base_path = os.getcwd() #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd())) #上级路径
from Util.get_excel import excel_data
class RunMain:
def run_main(self):
rows = excel_data.get_rows()
for i in range(rows):
data = excel_data.get_rows_value(i+2)
print(data)
4.使用ini文件做公共配置;创建Config包;创建server.ini文件
[server]
host=https://xx.xxxx.net
phone=xxxx
pwd=xxxxxx
is_run=3
5.此时需要读取server.ini文件中配置的信息;于是在Util文件中,封装get_server.py
import configparser
import os
base_path = os.getcwd() #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd())) #上级路径
class GetServer:
def load_ini(self):
file_path = path +'/Config/server.ini' #读取ini文件的路径
cf = configparser.ConfigParser()
cf.read(file_path, encoding='utf-8-sig')
return cf
def get_value(self, key, section=None):
if section == None:
section = 'server'
cf = self.load_ini()
try:
data = cf.get(section, key)
except Exception:
print("没有获取到值")
data = None
return data
server_data = GetServer()
6.此时;在Base(base_request)中;将通过get_server.py获取到的host与url进行拼接;此时base_request.py整体如下:
import requests
from Util.get_server import server_data
class BaseRequests:
#1-1:封装发送post方法;
def send_post(self, url, data, header=None):
res = requests.post(url=url, data=data, headers=header)
return res
#1-1:封装发送get方法;
def send_get(self, url, data, header=None):
res = requests.post(url=url, params=data, headers=header)
return res
#1-1:封装请求的主方法;
def run_main(self, method, url, data, header=None):
#通过封装读取server配置后,拼接url
base_url = server_data.get_value('host') #获取host
if 'http' not in url: #如果原来url中没有http,那么新的url = host+url
url = base_url + url
if method =='get':
res = self.send_get(url, data, header)
else:
res = self.send_post(url, data, header)
return res
base_request = BaseRequests()
7.进一步完善Run(run_main.py);引入excel中的数据;具体如下:
import os
base_path = os.getcwd() #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd())) #上级路径
from Util.get_excel import excel_data
from Base.base_request import base_request
class RunMain:
def run_main(self):
rows = excel_data.get_rows()
for i in range(rows):
data = excel_data.get_rows_value(i+2)
is_run = data[2] #是否执行
if is_run == 'yes':
method = data[6]
url = data[5]
data1 = data[7]
res = base_request.run_main(method, url, data1, header).json()
print(res)
8.在Config中;创建data.json数据;主要是对应接口返回的信息做参考,大概如下:
{
"/web/web_login": {
"code":0,
"data":{
"name":"xxx",
"token":"xxxxx"},
"msg":"请求成功"},
"/find_orders": {
"code":0,
"data":{
"name":"xxx",
"token":"xxxxx"},
"msg":"请求成功"}
}
9.在Util中;创建get_json.py文件,以便读取json数据
import os
base_path = os.getcwd() #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd())) #上级路径
import json
def read_json(file_name= None):
if file_name == None:
file_path = path + "/Config/data.json"
print("file_path路径为:", file_path)
else:
file_path = path + file_name
with open(file_path, encoding='UTF-8') as f:
data = json.load(f)
return data
def get_value(key, file_name=None):
data = read_json(file_name)
return data.get(key)
10.在Config中;创建header.json文件,主要是用来定义header格式,如下所示:
{
"Content-Type" : "application/x-www-form-urlencoded"
}
10.Util中;创建get_header.py文件;主要是用来获取header
import os
from Util.get_json import read_json
base_path = os.getcwd() #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd())) #上级路径
def get_header():
data = read_json("/Config/header.json")
return data
11.在Run中;run_main.py文件中,将header写入进入;
import os
from Util.get_header import get_header
base_path = os.getcwd() #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd())) #上级路径
from Util.get_excel import excel_data
from Base.base_request import base_request
class RunMain:
def run_main(self):
rows = excel_data.get_rows()
for i in range(rows):
header = None
data = excel_data.get_rows_value(i+2)
is_run = data[2] #是否执行
if is_run == 'yes':
method = data[6]
url = data[5]
data1 = data[7]
is_header = data[9]
if is_header == 'yes':
header = get_header()
res = base_request.run_main(method, url, data1, header).json()
print(res)
-------此时运行代码时的示例:
12.Config中;创建code_message.json文件;主要是写入接口对应的code和message的对应关系
{
"/pub/api/v1/web/web_login":[
{
"0":"请求成功"},
{
"-1":"请求失败"}
],
"/user/api/v1/favorite/page":[
{
"0":"请求成功"},
{
"-1":"请求失败"}
],
"/user/api/v1/order/find_orders":[
{
"0":"请求成功"},
{
"-1":"请求失败"}
]
}
13.Util中;创建get_result.py;主要是用来读取code_message.json中的数据
def handle_result(url, code):
data = get_value(url, "/Config/code_message.json")
if data !=None:
for i in data:
message = i.get(str(code))
if message:
return message
return None
14.完善Run;将get_result.py数据带入进去;主要是将请求获得的msg与code_message.json里面封装的进行对比
import os
from Util.get_result import handle_result
from Util.get_header import get_header
base_path = os.getcwd() #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd())) #上级路径
from Util.get_excel import excel_data
from Base.base_request import base_request
class RunMain:
def run_main(self):
rows = excel_data.get_rows()
for i in range(rows):
header = None
data = excel_data.get_rows_value(i+2)
is_run = data[2] #是否执行
if is_run == 'yes':
method = data[6]
url = data[5]
data1 = data[7]
is_header = data[9]
if is_header == 'yes':
header = get_header()
res = base_request.run_main(method, url, data1, header).json()
code = res['code']
message = res['msg']
config_message = handle_result(url, code)
if message == config_message:
print("测试case通过")
else:
print("测试case失败")
print(res)
15.完善Run(run_main.py);主要是通过code处理