在上一節 (009、【前程貸—簡化版,實戰 03】 用excel設計測試用例,把測試資料分離) 用excel表格設計測試用例、分離資料後,就需要用到openpyxl 來擷取表格中的資料,本節主要示範封裝 操作 excel 表格 ;
a、沿用上一節設計的測試用例表格,如下:

c、各代碼如下:
my_requests.py 代碼如下:
# -*- coding:utf-8 -*-
# Author: Sky
# Email: [email protected]
import requests
class MyRequests:
def __init__(self):
"""
初始化方法,初始化請求頭;
"""
self.headers = {"X-Lemonban-Media-Type": "lemonban.v2"}
# 方法 post/put... json=xxx, get方法用 params=xxx
def send_reuqests(self, method, url, req_data, token=None):
"""
調用requests庫裡面的方法去發起請求,并得到響應結果;
:param url: 接口url
:param method: 請求方法,get,psot
:param req_data: 請求資料
:param token: 如果有token,添加token
"""
# 如果有token,添加token
self.__del_header(token)
# 注意 request() 方法是不帶s的,requests庫是帶s的;
if method.upper() == "GET":
resp = requests.request(method, url, params=req_data, headers=self.headers)
return resp
if method.upper() == "POST":
# 為了便于學習,簡單的認為就是用 json 格式傳;
resp = requests.request(method, url, json=req_data, headers=self.headers)
return resp
def __del_header(self, token=None):
"""
如果有token,添加token處理
:param token: 如果有token,添加token處理
"""
if token:
self.headers["Authorization"] = f"Bearer {token}"
excel_handler.py 代碼如下:
# -*- coding:utf-8 -*-
# Author: Sky
# Email: [email protected]
import openpyxl
# 封裝一個xlsx表格操作類
class ExcelHandler:
# 操作一個excel表格:
# 第一步:打開工作簿
# 第二步:選取表單
# 第三步:讀取資料
# 第四步:關閉打開的工作簿
def __init__(self, xlsx_file_path: str):
"""
傳入一個xlsx檔案路徑,用load_workbook()方法加載,如果檔案加載不成功,抛出異常。如果成功,打開一個工作簿。
:param xlsx_file_path: xlsx檔案路徑
"""
try:
self.wb = openpyxl.load_workbook(xlsx_file_path)
except FileNotFoundError:
print('打開檔案失敗')
raise
# 不确定打開的是哪個表單
self.sh = None
def close_workbook(self):
"""
關閉目前打開的工作簿
:return:
"""
self.wb.close()
def select_sheet_by_name(self, sheet_name: str):
"""
根據傳入的工作表的名字,打開工作表。
:param sheet_name: 作表的名字
"""
self.sh = self.wb[f'{sheet_name}']
def read_all_rows_data(self):
"""
從標明的表單當中,第一行作為key.
将後面的每一行資料,與第一行拼接成一個字典資料,作為一條測試用例資料。
将所有測試用例資料,添加到一個清單當中。
:return: 測試用例資料清單
"""
# 擷取表單的所有行,即擷取表單的所有資料
sheet_all_rows = list(self.sh.values)
# 把第一行作為資料的keys
keys = sheet_all_rows[0]
# print(keys)
# 定義 cases_list 存放測試用例
cases_list = []
# 以下代碼功能:excel表單第2行開始的每一行測試資料,與第一行的keys拼接成一個字典。
for single_row in sheet_all_rows[1:]:
case_dict = dict(zip(keys, single_row))
cases_list.append(case_dict)
return cases_list
if __name__ == '__main__':
eh = ExcelHandler(r'D:\SkyWorkSpace\WorkSpace\API_test\lm\day11\test_datas\test_register_cases.xlsx')
eh.select_sheet_by_name('register_case')
print(eh.read_all_rows_data())
eh.close_workbook()
test_my_requests.py 代碼如下 :
from cases.my_requests import MyRequests
import pytest
from common.excel_handler import ExcelHandler
import os
import json
# 一、準備 資料 cases
# A、用os.path找到 xlsx 檔案
file_dir = os.path.dirname(os.path.realpath('__file__'))
base_dir = os.path.dirname(file_dir)
test_datas = os.listdir(base_dir)[-2]
file_name = os.path.join(base_dir, test_datas, 'test_register_cases.xlsx')
# print(file_name)
# B、調用common——>excel_handler.py 中已封裝好的ExcelHandler類來操作excel表格
# # 1、打開xlsx表格;2、根據表單名字擷取表格資料;3、讀取資料;
excel_handler = ExcelHandler(file_name)
excel_handler.select_sheet_by_name('register_case')
all_cases = excel_handler.read_all_rows_data()
# print(all_cases)
mrq = MyRequests()
# 二、參數化測試用例
# pytest.mark.parametrize("item", cases) 中的 "item" 必須 和 def test_my_requests(item): 中的 item 名字一樣
@pytest.mark.parametrize("item", all_cases)
def test_my_requests(item):
# json.loads()把json字元串轉換成字典 ;
resp = mrq.send_reuqests(item['method'], item['url'], json.loads(item['req_data']))
print(resp.json())
執行結果如下( 删除了表格中的一些資料,隻保留了3行) :
這一節需要補充的知識點:
1、json字元串
自己用 requests.post(json=字典) 發起請求時,會把字典自動轉換成 json格式 ;
json對象 與 json格式的字元串 差別:
json字元串是一個用單引号或者雙引号引起來的字元串,因為字元串的格式符合json的格式,是以叫做json字元串。
在python中不管怎麼轉換,他還是python的基本資料類型,使用dumps将資料轉換成json格式的,在python中也是json串:字元串類型
json裡面:對象中的字元串是使用雙引号表示的 ;
import json
# 把字典 轉換成json格式的字元串
# python中的字典key可以是 雙引号
a = {"aa": None, "bb": True, "cc": False, "dd": [1, 2, 3]}
json_a = json.dumps(a)
print(json_a)
# 把字典 轉換成json格式的字元串
# python中的字典key可以是 單引号 ,轉成json後key是雙引号;
b = {'aa': None, 'bb': True, 'cc': False, 'dd': [1, 2, 3]}
json_b = json.dumps(b)
print(json_b)
# 把json格式的字元串 轉換成字典
# json 中是 null,true,false, 如果填寫 None,True,False 會報錯
c = '{"aa": null, "bb": true, "cc": false, "dd": [1, 2, 3]}'
dict_c = json.loads(c)
print(dict_c)
# 字元串 中的最外層是 雙引号,裡面的 key 是雙引号
d = "{'aa': null, 'bb': true}"
dict_d = json.loads(d) # 報錯
print(dict_d)
執行結果如下: