zoukankan      html  css  js  c++  java
  • day21-20200508_配置文件处理_封装_日志器

    1、配置文件-系统自带模块ConfigParser和yaml模块

    方法一:系统自带的配置文件读取(了解)-一般后缀为.conf或.ini-痛点:不同的数据类型得用不同的读取方法

    配置文件

    testcases.conf
    [excel]
    filename = testcase.xlsx
    actual_result_column = 7
    result_column = 8
    
    [api]
    api_version = lemonban.v2
    base_url = http://api.lemonban.com/futureloan
    
    [report]
    filename = testcase.html
    verbosity = 1
    title = py28期第一份测试报告
    description= 非常美的报告
    tester = 可优
    
    [test]
    a = 1.2
    b = on
    c = True
    d = off
    e = false

    python读取方式导入模块 

    from configparser import ConfigParser
    痛点:不同的数据类型得用不同的读取方法

    # 系统自带
    from configparser import ConfigParser
    
    # 1、创建ConfigParser对象
    config = ConfigParser()
    
    # 2、加载配置文件
    config.read("testcases.conf", encoding="utf-8")
    
    # 3、读取数据
    # getint
    # getfloat
    # getboolean
    result = config.get("excel", "filename")

    方法二:yaml模块(推荐使用-5.1.2版本)

    yaml格式:

    yaml强缩进格式

    格式为:

    注释另起一行

    定义区域名:
        选项名: 选项值

    yaml读取注意事项

        如果选项值为数字,那么会自动转化为数字类型(int、float)
        如果选项值为true、on、True,那么会自动转化为True
        如果选项值为false、off、False,那么会自动转化为False
        其他有字母的,读取出来都为字符串类型

    testcases.yaml配置文件如下:

    excel:
      filename: "testcase.txt"
      real_result_column: 7
      result_column: 8
    
    api:
    #  api_version: lemonban.v2
      api_version: {"X-Lemonban-Media-Type": "lemonban.v2"}
      base_url: 'http://api.lemonban.com/futureloan'
    
    report:
      filename: "testcase.html"
      verbosity: 1
      title: py28期第一份测试报告
      description: 非常美的报告
      tester: 可优
    
    test:
      a: 1.2
      b: on
      c: True
      d: off
      e: false
      f: true

    python读取方式:

    步骤:

    1、打开文件

    2、full_load方法加载所有的数据data--字典格式

    3、data[section][option] 区域名 选项名来获取字段的值

    # 安装第三方模块pyyaml  5.1.2
    # 0、导入yaml模块
    import yaml
    
    # 1、打开yaml配置文件
    with open("testcases.yaml", encoding="utf-8") as file:
        # full_load方法去加载
        # 第二个参数为文件对象
        # yaml.load_all(file, Loader=yaml.FullLoader)
        data = yaml.full_load(file)

    2、配置文件封装

    封装的时候注意文件名参数可以不传,给个默认值的方法

    class HandleYaml:
    
        def __init__(self, filename=None):
            if filename is None:
                filename = "testcases.yaml"
            else:
                filename = filename
            with open(filename, encoding="utf-8") as file:
                self.config_data = yaml.full_load(file)
    
        def get_data(self, section, option):
            """
            读取配置文件数据
            :param section: 区域名
            :param option: 选项名
            :return: 值
            """
            return self.config_data[section][option]
    
    
    if __name__ == '__main__':
        do_yaml = HandleYaml()
        print(do_yaml.get_data("api", "api_version"))

    3、日志器-系统自带模块logging-有点懵

    步骤:

    1、创建Logger对象,相当于日志记录工具logging.getLogger

    2、设置日志登记setLevel

    3、创建日志输出地方屏幕或者文件,两个方法StreamHandler 和fileHandler

    4、创建日志的显示样式,并关联输出地方

    5、日志器对象与日志输出渠道(展示的地方)进行关联

    import logging
    
    # 1、创建Logger对象
    # 相当于日志记录工具
    my_logger = logging.getLogger("testcase")
    
    # 2、设置日志器的日志等级
    # 日志等级
    # NOTSET(0), DEBUG(10), INFO(20), WARNING(30), ERROR(40), CRITICAL(50)
    # 只能记录日志级别大于等于当前日志级别的日志
    my_logger.setLevel("DEBUG")
    # my_logger.setLevel(logging.DEBUG)
    
    # 3、创建日志输出渠道(日志显示的地方)
    console_handler = logging.StreamHandler()
    console_handler.setLevel("WARNING")
    
    file_handler = logging.FileHandler("testcase.log", encoding="utf-8")
    
    # 4、创建日志的显示样式(格式)并与渠道进行关联
    formater = logging.Formatter('%(asctime)s - [%(levelname)s] - [msg]: %(message)s - %(name)s - %(lineno)d')
    console_handler.setFormatter(formater)
    file_handler.setFormatter(formater)
    
    # 5、日志器对象与日志输出渠道(展示的地方)进行关联
    my_logger.addHandler(console_handler)
    my_logger.addHandler(file_handler)
    
    
    if __name__ == '__main__':
        # 手动产生不同级别的日志
        my_logger.debug("这是一条debug级别的日志!")
        my_logger.info("这是一条info级别的日志!")
        my_logger.warning("这是一条warning级别的日志!")
        my_logger.error("这是一条error级别的日志!")
        my_logger.critical("这是一条critical级别的日志!")

    用例处抛出异常-my_logger.error(f"{name}:具体异常为{e}")

    try:
                self.assertEqual(testcase_dict["expected_value"],
                                 real_code,
                                 testcase_dict["name"])
            except AssertionError as e:
                # print("此处需要使用日志器来记录日志!")
                my_logger.error(f"{name}:具体异常为{e}")
                # print(f"具体异常为:{e}")
                self.do_excel.write_data(row, 8, "失败")
                raise e
            else:
                self.do_excel.write_data(row, 8, "成功")

    4、测试报告模板-HTMLTestRunnerNew  以及 discover-以及把用例名追加到ddt中

    一个接口的用例需要考虑 正确的、错误的、异常的、边界值等诸多情况,然后你需要写很多个同样代码,参数不同的用例,ddt 可以实现数据驱动,ddt+unittest进行接口测试不错

    HTMLTestRunnerNew  为测试报告模板文件,用例完成后生成测试报告testcase1.html

    discover执行所有Test开头的py文件

    import unittest
    
    from HTMLTestRunnerNew import HTMLTestRunner
    
    suite = unittest.defaultTestLoader.discover(".")
    
    
    with open("testcase1.html", "wb") as file:
        runner = HTMLTestRunner(file,
                                verbosity=1,
                                title="py28期第一份测试报告",
                                description="非常美的报告",
                                tester="滔滔")
        runner.run(suite)

     

     建议用注释部分,这样可以读取用例为字典的也能读取为对象的

                    test_data_docstring = v["name"]
    
                    # try:
                    #     test_data_docstring = v.title  # 数据使用对象来保存,改成这样
                    # except Exception as e:
                    #     test_data_docstring = v["title"]  # 数据使用字典来保存,改成这样                
  • 相关阅读:
    程序员兄弟们,我们的基本素质怎么样?
    从GridView中直接导出数据到Excel文件 处理导出乱码 类型“GridView”的控件“XXXX”必须放在具有 runat=server 的窗体标记内。”的异常
    在SQLServer 2005附加SQLServer 2008数据库异常处理
    大型企业如何搭建私有云计算平台
    GIS在石油行业中的应用
    win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程
    三维空间数据模型及结构
    oracle适配器连接不上解决方案
    单态设计模式
    java实现排序的几种方法
  • 原文地址:https://www.cnblogs.com/shishibuwan/p/12861319.html
Copyright © 2011-2022 走看看