前言
整個框架的開發(fā)及調(diào)通是在3月27日晚上22點完成,如下:
這篇文章真的是拖了太久了,久到我居然把代碼部分完成后,徹底給忘了,這記性,真的是年紀大了!
框架的設(shè)計開發(fā)
1、框架搭建設(shè)計要素
- 日志&測試步驟
- 報告&失敗截圖
- 配置文件&數(shù)據(jù)源設(shè)計
- 公共函數(shù)&API封裝
- 測試數(shù)據(jù)&參數(shù)化、解耦
- 測試套件&測試用例設(shè)計、組裝
2、工程結(jié)構(gòu)
3、日志
日志可以很好輔助我們定位問題,示例代碼如下:
class LogUtils:
def __init__(self, log_path=log_path):
"""
通過python自帶的logging模塊進行封裝
"""
self.logfile_path = log_path
# 創(chuàng)建日志對象logger
self.logger = logging.getLogger(__name__)
# 設(shè)置日志級別
self.logger.setLevel(level=logging.INFO)
# 設(shè)置日志的格式
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")
# 創(chuàng)建文件處理程序并實現(xiàn)追加
self.file_log = logging.FileHandler(self.log_name_path, 'a', encoding='utf-8')
# 設(shè)置日志文件里的格式
self.file_log.setFormatter(formatter)
# 設(shè)置日志文件里的級別
self.file_log.setLevel(logging.INFO)
# 把日志信息輸出到文件中
self.logger.addHandler(self.file_log)
# 關(guān)閉文件
self.file_log.close()
"""在控制臺輸出日志"""
# 日志在控制臺
self.console = logging.StreamHandler()
# 設(shè)置日志級別
self.console.setLevel(logging.INFO)
# 設(shè)置日志格式
self.console.setFormatter(formatter)
# 把日志信息輸出到控制臺
self.logger.addHandler(self.console)
# 關(guān)閉控制臺日志
self.console.close()
def get_log(self):
return self.logger
4、數(shù)據(jù)源
這里我用的是Excel
,示例如下:
示例代碼如下:
class ExcelUtils(object):
@staticmethod
def get_element_Data():
"""
通過pandas讀取excel中的數(shù)據(jù),返回字典映射
"""
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
可能評論區(qū)會有人說用yml、json、csv
做數(shù)據(jù)源會更好,我不認同!
為什么用Excel
做數(shù)據(jù)源?
- 所有的測試框架和測試工具,都應(yīng)該以使用者角度考慮問題,以易用性和上手難度為先。
- 所有做測試工具及平臺、測試框架,都是為他人服務(wù),所以越簡單,越好操作,更好,后期可以再優(yōu)化、
- 上面做數(shù)據(jù)源,可能自我感覺技術(shù)上顯得高大上,很牛逼,但是抱歉,使用者,根本不知道
yml、json
是啥你怎么辦,可以學(xué),沒錯(互聯(lián)網(wǎng)時代時間成本太昂貴了),不是不可能遇到,是因為最不可控的是使用者人群,不是嗎?
框架的一開始設(shè)計很重要,所以整體的設(shè)計要清晰明了。
感動自己的實現(xiàn)不重要,而是被團隊需要的實現(xiàn),才會顯得自己重要!
5、基礎(chǔ)層
這里主要用于處理,元素對象和原生API的封裝,部分代碼示例如下圖:
6、測試用例
在action
層寫測試用例,示例代碼如下:
class PageAction(BasePage):
def order(self, taste: str):
"""
根據(jù)口味選餐
:param taste:
:return:
"""
# 將第一個五花肉石鍋拌飯加入購物車
self.element_click("將第一個五花肉石鍋拌飯加入購物車")
# 選擇口味
self.element_click(taste)
# 確定選擇
self.element_click("確定選擇")
# 共選擇份數(shù)
total = self.get_elementText("共選擇份數(shù)")
return total
調(diào)用action
層,執(zhí)行測試用例,示例代碼如下:
# -*- 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
寫在最后
到此,關(guān)于minium
系列暫時告一段路了,感謝大家對我的支持,覺得我的文章對您有幫助,請幫忙轉(zhuǎn)發(fā)!文章來源:http://www.zghlxwxcb.cn/news/detail-402464.html
我是六哥,后面還會陸續(xù)更新其他教程文章,還請繼續(xù)關(guān)注我!文章來源地址http://www.zghlxwxcb.cn/news/detail-402464.html
到了這里,關(guān)于騰訊出品小程序自動化測試框架【Minium】系列(七)測試框架的設(shè)計和開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!