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"] # 数据使用字典来保存,改成这样