騰訊出品小程式自動化測試框架【Minium】系列(七)測試框架的設計和開發

2023-04-08 12:00:40

前言

整個框架的開發及調通是在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系列暫時告一段路了,感謝大家對我的支援,覺得我的文章對您有幫助,請幫忙轉發!

我是六哥,後面還會陸續更新其他教學文章,還請繼續關注我!