• day17_项目框架搭建1


    项目的工程目录:

    在这里插入图片描述

    • py_53 --根目录
      • py_api --子目录
        • day18_项目框架搭建 --项目工程目录
          • common —公用模块
            • excle.py -获取Excel表单的数据
            • handler_log.py -日志的封装
          • config --配置模块
            • setting.py -相关文件的配置
            • init.py
          • conf_ini --配置模块
            • d1_ini.ini
            • d2_ini文件读取.py
          • data --用例读取模块
            • case.xlsx
          • logs --日志模块
            • py53.log
          • reports --case报告模块
            • report.html
          • tests --用例模块
            • test_register.py
            • test_login.py
          • unitcase
            • test_excel.py
              main.py --主程序入口
              总结.md
              init.py
    day_18项目框架搭建
    	- api
    		* helper.py
    		* __init__.py
    	- common
    		* headler_excel.py
    		* headler_log.py
    	- conf_ini
    		* d1_ini.ini
    		* d2_ini文件读取.py
    	- data 
    		* case.xlsx
    	- logs --日志模块
    		* py53.log
    	- reports --case报告模块
    		* report.html
    	- tests --用例模块
    		* test_register.py
    		* test_login.py
    	- unitcase
    		* test_excel.py
    	main.py --主程序入口
    	总结.md
    	__init__.py
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    # helper.py
    def login(username, passwd):
        """业务"""
        # 到底怎么才能去访问接口
        """登录功能。 开发写的接口"""
        response = {"message": None,
                    "code": None,
                    "token": None}
    
        if username == 'kino' and passwd == '123456':
            response['message'] = 'success'
            response['code'] = 200
            response['token'] = "good token"
            return response
        if username == '':
            response['message'] = '用户名为空'
            response['code'] = 400
            return response
        if passwd == '':
            response['message'] = '密码为空'
            response['code'] = 400
            return response
        else:
            response['message'] = '用户名或密码错误'
            response['code'] = 400
            return response
    # hander_excel.py
    import openpyxl
    from openpyxl.worksheet.worksheet import Worksheet
    
    
    def read_excel_dict(file, sheet_name="Sheet1"):
        """读取excel"""
        # 打开文件
        workbook = openpyxl.load_workbook(file)
        # 选择表单,表格 Sheet1
        sheet: Worksheet = workbook[sheet_name]
    
        data = list(sheet.values)
        title = data[0]
        rows = data[1:]
    
        data = [dict(zip(title, row)) for row in rows]
        return data
    
    
    if __name__ == '__main__':
        # 1,当你想测试这个模块功能的时候,单独来点击播放件,执行下面的测试代码。
        # 2,当其他模块调用这个模块时候,下面的测试代码就不会执行了。
        # 模块当中就是只有各种定位,函数,类
        fspath = r'/Users/zhangping/Documents/py_53/py_api/day18_项目框架搭建/data/cases.xlsx'
        data = read_excel_dict(fspath)
        print(data)
    # handler_log.py
    from loguru import logger
    from py_api.day18_项目框架搭建.config.setting import Config
    
    
    logger.add(Config.LOG_FILE, encoding='utf-8')
    # d1_ini.ini
    [default]
    host=http://www.yuz.com
    hobby=[1,2,3]
    
    [db]
    host=http://www.yuzwang.com
    port=3306
    name="py"
    connected=true
    # d2_ini文件读取.py
    from configparser import ConfigParser
    
    parser = ConfigParser()
    parser.read('d1_ini.ini', encoding='utf-8')
    
    # 读取配置项
    host = parser.get('default', 'host')
    print(host)
    
    port = parser.get('db', 'port')
    print(port)
    print(type(port))
    
    hobby = parser.get('default', 'hobby')
    print(hobby)
    print(type(hobby))
    # setting.py
    class Config:
        # 域名
        HOST = 'http://example.com'
        # 端口
        PORT = 8080
    
        # 测试用例文件名
        CASE_FILE = r'/Users/zhangping/Documents/py_53/py_api/day18_项目框架搭建/data/cases.xlsx'
    
        # log 存储的文件
        LOG_FILE = r'/Users/zhangping/Documents/py_53/py_api/day18_项目框架搭建/logs/py53.log'
    # case.xlsx
    # py53.log
    2022-09-05 17:45:46.586 | INFO     | test_login_8:test_login:28 - 正在测试...
    2022-09-05 17:45:46.587 | ERROR    | test_login_8:test_login:39 - {'message': 'success', 'code': 200, 'token': 'good token'} != None
    2022-09-05 17:45:46.588 | INFO     | test_login_8:test_login:28 - 正在测试...
    # report.html
    # test_login.py
    import unittest
    from py_api.day18_项目框架搭建.api.helper import login
    from py_api.day18_项目框架搭建.common.excel import read_excel_dict
    from unittestreport import ddt, list_data
    from py_api.day18_项目框架搭建.common.log_handler import logger
    from py_api.day18_项目框架搭建.config.setting import Config
    
    # 从配置文件倒入用例文件
    data_file = Config.CASE_FILE
    cases = read_excel_dict(data_file, "Sheet1")
    
    
    @ddt
    class TestLogin(unittest.TestCase):
    
        @list_data(cases)
        def test_login(self, case):
            # 获取参数
            data_str = case['data']
            logger.info("正在测试...")
            # 字符串要转成字典
            data = eval(data_str)
            # 把单元(被函数) 改成被测接口, 接口访问过程
            actual = login(data['username'], data['passwd'])
    
            expected = case['expected']
            expected = eval(expected)
            try:
                self.assertEqual(expected, actual)
            except AssertionError as e:
                logger.error(e)
                raise e
     # test_excel
     from py_api.day18_项目框架搭建.common.excel import read_excel_dict
    
    
    def test_excel():
        fspath = r'/Users/zhangping/Documents/py_53/py_api/day18_项目框架搭建/data/cases.xlsx'
        data = read_excel_dict(fspath)
        print(data)
    # main
    # 主程序
    
    
    import unittest
    import unittestreport
    
    # 填入开始目录, 符合规则的用例会被自动收集
    suit = unittest.defaultTestLoader.discover('tests')
    print(suit)
    
    # 运行
    # result = unittest.TextTestRunner().run(suit)
    # print(result)
    
    # 定制化的运行器和测试报告。
    runner = unittestreport.TestRunner(suit,
                                       title='项目测试报告',
                                       tester='Memory.荒年〆',
                                       desc="企业专用项目",
                                       templates=2
                                       )
    runner.run()
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • case.xlsx
      在这里插入图片描述
    • report.html
      在这里插入图片描述

    总结

    项目框架搭建(面试题)

    目标:执行接口自动化测试

    • 必须要支持可以编写自动化用例(测试函数) DONE
    • 用例数据,Excel, yaml, py DONE
    • 大多数的自动化测试用例都是手工测试转成的。
    • 支持读取Excel操作 DONE
    • 收集用例,运行,生成报告 DONE
    • 支持日志处理 logging DONE
    • 支持配置文件处理 py DONE
    • 支持邮件发送(框架实现, Jenkins)
    • 支持数据驱动 DONE
    • 支持接口访问 doing…

    怎么实现的:

    • 分层设计, 介绍各种包,各个模块的用途

    对自己写的代码简单的自测

    • main 函数

    分层设计

    好处:方便维护和管理

    • cases 用例
    • 通用程序, common
    • 辅助函数,通常和项目,业务有关, api
    • 测试数据独立管理
  • 相关阅读:
    JavaScript中常用字符串方法总结
    面试题库(九):ORM框架 Mybatis,Hibernate和JPA
    微服务架构从阿里掀起变革,微服务全彩手册趁势崛起 (容器 k8s)
    金仓数据库 KingbaseES 插件DBMS_UTILITY
    【递归】汉诺塔问题(Java版)
    比特币ord程序wallet_constructor.rs文件支持一次性铸造1000个代币,并将它们分配到40个UTXO上(每个UTXO上分配25个代币),并设置找零地址
    使用asp.net core web api创建web后台,并连接和使用Sql Server数据库
    echarts的一些技巧
    索引(二)
    抖音开放平台第三方代小程序开发,一整套流程
  • 原文地址:https://blog.csdn.net/weixin_47057243/article/details/126708348