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"]  # 数据使用字典来保存,改成这样                
原文地址:https://www.cnblogs.com/shishibuwan/p/12861319.html