天天看點

010、011、012【前程貸—簡化版,實戰 04】用openpyxl 操作 excel表格, json.loads() 方法

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

a、沿用上一節設計的測試用例表格,如下:

010、011、012【前程貸—簡化版,實戰 04】用openpyxl 操作 excel表格, json.loads() 方法
b、項目的層級目錄如下:
010、011、012【前程貸—簡化版,實戰 04】用openpyxl 操作 excel表格, json.loads() 方法

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行) :

010、011、012【前程貸—簡化版,實戰 04】用openpyxl 操作 excel表格, json.loads() 方法

這一節需要補充的知識點:

1、json字元串

010、011、012【前程貸—簡化版,實戰 04】用openpyxl 操作 excel表格, json.loads() 方法

自己用 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)

      

執行結果如下:

010、011、012【前程貸—簡化版,實戰 04】用openpyxl 操作 excel表格, json.loads() 方法