前言
整個框架的開發及調通是在3月27日晚上22點完成,如下:
這篇文章真的是拖了太久了,久到我居然把程式碼部分完成後,徹底給忘了,這記性,真的是年紀大了!
框架的設計開發
1、框架搭建設計要素
- 日誌&測試步驟
- 報告&失敗截圖
- 配置檔案&資料來源設計
- 公共函式&API封裝
- 測試資料&引數化、解耦
- 測試套件&測試用例設計、組裝
2、工程結構
3、日誌
日誌可以很好輔助我們定位問題,示例程式碼如下:
class LogUtils:
def __init__(self, log_path=log_path):
"""
透過python自帶的logging模組進行封裝
"""
self.logfile_path = log_path
# 建立日誌物件logger
self.logger = logging.getLogger(__name__)
# 設定日誌級別
self.logger.setLevel(level=logging.INFO)
# 設定日誌的格式
formatter = logging.Formatter('%(asctime)s - %(filename)s [line:%(lineno)d] - %(levelname)s: %(message)s')
"""在log檔案中輸出日誌"""
# 日誌檔名稱顯示一天的日誌
self.log_name_path = os.path.join(self.logfile_path, "log_%s" % time.strftime('%Y_%m_%d')+".log")
# 建立檔案處理程式並實現追加
self.file_log = logging.FileHandler(self.log_name_path, 'a', encoding='utf-8')
# 設定日誌檔案裡的格式
self.file_log.setFormatter(formatter)
# 設定日誌檔案裡的級別
self.file_log.setLevel(logging.INFO)
# 把日誌資訊輸出到檔案中
self.logger.addHandler(self.file_log)
# 關閉檔案
self.file_log.close()
"""在控制檯輸出日誌"""
# 日誌在控制檯
self.console = logging.StreamHandler()
# 設定日誌級別
self.console.setLevel(logging.INFO)
# 設定日誌格式
self.console.setFormatter(formatter)
# 把日誌資訊輸出到控制檯
self.logger.addHandler(self.console)
# 關閉控制檯日誌
self.console.close()
def get_log(self):
return self.logger
4、資料來源
這裡我用的是Excel
,示例如下:
示例程式碼如下:
class ExcelUtils(object):
@staticmethod
def get_element_Data():
"""
透過pandas讀取excel中的資料,返回字典對映
"""
data_list = pd.read_excel(excel_path).values.tolist() # reading file
dict_elements = {}
for data in data_list:
dict_elements[data[0]] = data[1] + "," + data[2]
return dict_elements
可能評論區會有人說用yml、json、csv
做資料來源會更好,我不認同!
為什麼用Excel
做資料來源?
- 所有的測試框架和測試工具,都應該以使用者角度考慮問題,以易用性和上手難度為先。
- 所有做測試工具及平臺、測試框架,都是為他人服務,所以越簡單,越好操作,更好,後期可以再最佳化、
- 上面做資料來源,可能自我感覺技術上顯得高大上,很牛逼,但是抱歉,使用者,根本不知道
yml、json
是啥你怎麼辦,可以學,沒錯(網際網路時代時間成本太昂貴了),不是不可能遇到,是因為最不可控的是使用者人群,不是嗎?
框架的一開始設計很重要,所以整體的設計要清晰明瞭。
感動自己的實現不重要,而是被團隊需要的實現,才會顯得自己重要!
5、基礎層
這裡主要用於處理,元素物件和原生API的封裝,部分程式碼示例如下圖:
6、測試用例
在action
層寫測試用例,示例程式碼如下:
class PageAction(BasePage):
def order(self, taste: str):
"""
根據口味選餐
:param taste:
:return:
"""
# 將第一個五花肉石鍋拌飯加入購物車
self.element_click("將第一個五花肉石鍋拌飯加入購物車")
# 選擇口味
self.element_click(taste)
# 確定選擇
self.element_click("確定選擇")
# 共選擇份數
total = self.get_elementText("共選擇份數")
return total
呼叫action
層,執行測試用例,示例程式碼如下:
# -*- coding: utf-8 -*-
"""
# @Time : 2023/03/20 20:55
# @Author : longrong.lang
# @FileName: order_test.py
# @Software: PyCharm
# @Blog :https://www.cnblogs.com/longronglang/
# @Motto:ABC(Always Be Coding)
"""
import minium
from action.page_action import PageAction
@minium.ddt_class
class OrderTest(minium.MiniTest):
"""
測試登入功能
"""
pageAction = None
@minium.ddt_case(
{"taste": "蒜香味", "count": " 1 "},
{"taste": "姜蔥味", "count": " 1 "},
{"taste": "鹽焗味", "count": "3"}
)
def test_Order(self, value):
try:
self.pageAction = PageAction(self.mini, self.page)
total = self.pageAction.order(value["taste"])
self.assertEqual(total, value["count"])
except AssertionError as err:
self.pageAction.screen_shot()
self.fail(err)
7、測試報告
覺得minium
的測試報告顏值還可以,還可以看到歷史的,感覺還不錯,如下:
失敗有截圖還有日誌:
B站看執行效果:
https://www.bilibili.com/video/BV1Dk4y147Sn
寫在最後
到此,關於minium
系列暫時告一段路了,感謝大家對我的支援,覺得我的文章對您有幫助,請幫忙轉發!
我是六哥,後面還會陸續更新其他教程文章,還請繼續關注我!