讀寫excel表格和結果回寫
一、需求
- 1.將用例代碼和用例數據進行分離
- 2.用例中的參數,和預期結果參數化處理
- 3.用例數據放到excel中存儲
- 4.用例執行的結果回寫到excel中
二、實現流程
-
1.設計測試用例,excel中編寫用例數據
-
2.定義測試用例類,編寫測試用例方法
-
定義一個繼承於unittest的測試用例類
-
定義一個測試用例方法(test開頭)
-
重寫____init___方法,實現(用例參數和預期結果)參數化
-
對斷言進行異常捕獲,出現斷言異常回寫結果測試用例執行未通過,沒有出現異常,回寫結果用例執行通過
import unittest # 導入登錄功能函數 from login import login_check from readexcel import ReadExcel from register import register excel = ReadExcel("cases.xlsx", "login") # 定義登錄的測試用例類 class LoginTestCase(unittest.TestCase): def __init__(self, methodName, data, expected, case_id): super().__init__(methodName) self.data = data self.expected = expected self.case_id = case_id def test_login(self): # 第一步:准備用例數據 # 1、用例的參數: data = self.data # 2、預期結果: expected = self.expected # 第二步:執行功能函數,獲取實際結果 result = login_check(*data) # 第三步:比對實際結果和預期結果 try: self.assertEqual(expected, result) except AssertionError as e: # 用例執行未通過 excel.write_data(row=self.case_id + 1, column=5, value="未通過") raise e else: excel.write_data(row=self.case_id + 1, column=5, value="通過")
-
-
3.創建測試套件
suite=unittest.TestSuite()
-
4.將用例添加到套件
-
讀取excel中的用例數據
-
遍歷用例數據,創建用例對象
-
將用例對象加入套件
excel = ReadExcel("cases.xlsx", "login") cases = excel.read_data() for item in cases: # 通過創建對象去獲取測試用例 case = LoginTestCase("test_login", eval(item["data"]), eval(item["expected"])) suite.addTest(case)
-
-
5.使用HTMLTestRunnerNew創建測試運行程序
runner = HTMLTestRunner(stream=open("report.html", "wb"), # 打開的報告,將句柄傳給stream tester="小眼睛", description="報告的描述信息", title="報告的標題")
-
6.運行測試套件中的所有的用例,生產測試報告
runner.run(suite)
三、封裝讀取和寫入excel的方法
import openpyxl
# 用來保存用例數據
class CaseData:
pass
class ReadExcel(object):
def __init__(self, filename, sheet_name):
self.filename = filename
self.sheet_name = sheet_name
def open(self):
"""打開工作薄,選擇表單"""
self.workbook = openpyxl.load_workbook(self.filename)
self.sheet = self.workbook[self.sheet_name]
def close(self):
"""關閉工作薄對象,釋放內存"""
self.workbook.close()
def read_data(self):
self.open()
# 按行獲取所有的格子
rows = list(self.sheet.rows)
# 獲取表頭行數據
title = []
for r in rows[0]:
title.append(r.value)
# 創建一個空列表 用來存放所有的用例數據
cases = []
# 遍歷除了表頭剩余的行
for row in rows[1:]:
# 創建一個空列表,用來存儲該行的數據
data = []
# 再次遍歷該行的每一個格子
for r in row:
# 將格子中的數據,添加到data中
data.append(r.value)
case = dict(zip(title, data))
cases.append(case)
# 關閉工作薄
self.close()
return cases
def read_data_obj(self):
self.open()
# 按行獲取所有的格子
rows = list(self.sheet.rows)
# 獲取表頭行數據
title = []
for r in rows[0]:
title.append(r.value)
# 創建一個空列表 用來存放所有的用例數據
cases = []
# 遍歷除了表頭剩余的行
for row in rows[1:]:
# 創建一個空列表,用來存儲該行的數據
data = []
# 再次遍歷該行的每一個格子
for r in row:
# 將格子中的數據,添加到data中
data.append(r.value)
# 將表頭和數據打包轉換為列表
case = list(zip(title, data))
# 創建一個對象用來保存該行用例數據
case_obj = CaseData()
# 遍歷列表中該行用例數據,使用setattr設置為對象的屬性和屬性值
for k, v in case:
setattr(case_obj, k, v)
# print(case_obj,case_obj.__dict__)
# 將對象添加到cases這個列表中
cases.append(case_obj)
# 關閉工作薄
self.close()
# 返回cases(包含所有用例數據對象的列表)
return cases
def write_data(self, row, column, value):
# 打開工作薄
self.open()
# 寫入數據
self.sheet.cell(row=row,column=column,value=value)
# 保存文件
self.workbook.save(self.filename)
# 關閉工作薄
self.close()
四、運行程序
import unittest
from HTMLTestRunnerNew import HTMLTestRunner
from readexcel import ReadExcel
from testcases import LoginTestCase, RegisterTestCase
# 第一步,創建一個測試套件
suite = unittest.TestSuite()
# 第二步:將測試用例,加載到測試套件中
# 1、讀取登錄功能函數的用例數據,創建用例對象,添加到套件
excel = ReadExcel("cases.xlsx", "login")
cases = excel.read_data()
for item in cases:
# 創建一個用例對象
case = LoginTestCase("test_login", eval(item['data']), eval(item["expected"]), item["case_id"])
suite.addTest(case)
# 2、讀取注冊功能函數的用例數據,創建用例對象,添加到套件
excel = ReadExcel("cases.xlsx", "register")
cases = excel.read_data()
for item in cases:
case = RegisterTestCase("test_register", eval(item["data"]), eval(item["expected"]), item["case_id"])
suite.addTest(case)
# 第三步:創建一個測試運行程序啟動器
runner = HTMLTestRunner(stream=open("report.html", "wb"), # 打開一個html格式報告文件,將句柄傳給stream
tester="musen", # 報告中示的測試人員
description="python24第二次作業報告", # 報告中顯示描述信息
title="24期上課的測試報告") # 報告中的標題
# 第四步:使用啟動器去執行測試套件
runner.run(suite)