• 腾讯出品小程序自动化测试框架【Minium】系列(七)测试框架的设计和开发


    前言

    整个框架的开发及调通是在3月27日晚上22点完成,如下:

    image.png

    这篇文章真的是拖了太久了,久到我居然把代码部分完成后,彻底给忘了,这记性,真的是年纪大了!

    框架的设计开发

    1、框架搭建设计要素

    • 日志&测试步骤
    • 报告&失败截图
    • 配置文件&数据源设计
    • 公共函数&API封装
    • 测试数据&参数化、解耦
    • 测试套件&测试用例设计、组装

    2、工程结构

    image.png

    3、日志

    日志可以很好辅助我们定位问题,示例代码如下:

    python
    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,示例如下:

    image.png

    示例代码如下:

    python
    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的封装,部分代码示例如下图:

    image.png

    image.png

    6、测试用例

    action层写测试用例,示例代码如下:

    python
    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层,执行测试用例,示例代码如下:

    python
    # -*- 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的测试报告颜值还可以,还可以看到历史的,感觉还不错,如下:

    image.png

    失败有截图还有日志:

    image.png

    image.png

    B站看运行效果:
    https://www.bilibili.com/video/BV1Dk4y147Sn

    写在最后

    到此,关于minium系列暂时告一段路了,感谢大家对我的支持,觉得我的文章对您有帮助,请帮忙转发!

    我是六哥,后面还会陆续更新其他教程文章,还请继续关注我!


    __EOF__

  • 本文作者: 久曲健的测试窝
  • 本文链接: https://www.cnblogs.com/longronglang/p/17298138.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    【二】软核学习
    按文件类型自动分类文件的快速方法
    外贸SOHO新手指南来了!六大注意事项!
    LitePal在Kotlin中使用的一个小问题
    java毕业设计超市购物系统mybatis+源码+调试部署+系统+数据库+lw
    5.浮点数及其运算
    【node进阶】浅析Koa框架---ejs模板|文件上传|操作mongoDB
    CVE-2023-5129:libwebp开源库10分漏洞
    springBoot整合redis使用介绍(详细案例)
    【C++】STL详解(九)—— set、map、multiset、multimap的介绍及使用
  • 原文地址:https://www.cnblogs.com/longronglang/p/17298138.html