python单元测试复盘
unittest框架---4大核心:
1)TestCase---测试用例
2)TestSuite---测试套件:收集用例,引进测试用例
常使用【目录】unittest.TestLoader().discover(搜索目录)--- 默认在test*.py中搜索用例
3)TextTestRunner---执行用例/呈现结果
4)Fixture---前置后置
流程:
1、引入unittest模块,创建类并继承unittest.TestCase;
2、定义测试函数,函数名以test_开头(表示一个测试用例)
3、测试用例中:
3.1 测试数据、期望结果
3.2 用例步骤
3.3 断言
由此产生三个文件(以注册为例):register.py(功能逻辑)、test_cases.py、main.py(测试报告生成)
优化代码:
1)ddt数据驱动,配合测试框架使用,将多组数据依次传递给一个测试流程;
2)将数据写入excel中后读取,引入模块openpyxl:
①加载excel数据文件
②根据表单名称选择表单,wb['表单名称']
③单元格对象
1 sh = wb["register"] 2 # 拿到字典的key值 3 titles = [] 4 for item in list(sh.rows)[0]: # 遍历第一行中的每一列
# (<Cell 'login'.A1>, <Cell 'login'.B1>, <Cell 'login'.C1>) 5 titles.append(item.value) 6 7 data_lists = [] 8 # 把key和value组合到一起,形成一个字典,再将字典放到列表当中 9 for item in list(sh.rows)[1:]: # 遍历每一行 10 value_dict = {} 11 for index in range(len(item)): # 获取每一行的单元格数据 12 value_dict[titles[index]] = item[index].value 13 data_lists.append(value_dict) # 将每一行测试数据追加到列表中
14 # 或者使用zip()函数
15 for item in list(sh.rows)[1:] # 遍历数据行
16 value = []
17 for val in item: # 获取每一行的值
18 values.append(val.value)
20 res = dict(zip(titles, values)) # titles和每一行数据打包成字典
21 res["check"] = eval(res["check"]) # 将check的字符串转换为字典对象
22 all_datas.append(res) # 追加到列表
④封装成文件handle_excel.py
3)增加日志(封装)---> my_logger.py
第一步:创建一个日志收集器logging.getLogger("收集器的名字")
第二步:给日志收集器,设置日志级别:logger.setLevel(logging.INFO)
第三步:给日志收集器创建一个输出渠道handle=logging.StreamHandler()
第四步:给渠道,设置一个日志输出内容的格式
第五步:将设置的格式,绑定到渠道当中,将格式与渠道关联起来
第六步:将设置好的渠道,添加到日志收集器上
import logging logger = logging.getLogger("收集器") logger.setLevel(logging.INFO) # 设置日志输出在哪些渠道 handle1 = logging.StreamHandler() handle1.setLevel(logging.ERROR) # 设置渠道的输出内容格式 fmt = '%(asctime)s %(name)s %(levelname)s %(filename)s' formatter = logging.Formatter(fmt) # 将日志格式绑定到渠道中 handle1.setFormatter(formatter) # 将设置好的渠道添加到日志收集器上 logger.addHandler(handle1) # 添加fileHandle handle2 = logging.FileHandler("my_log.log",encoding="utf-8") handle2.setFormatter(formatter) logging.addHandler(handle2)
4)增加配置文件(重点.ini)---> 对my_logger.py文件进行再加工
①创建一个.ini的配置文件 [section] option=value
②python读取ini文件的数据
首先引入ConfigParse类
其次实例化ConfigParse类,调用read方法,读取ini文件
conf = ConfigParse() conf.read(file,encoding="utf-8")
读取出来默认是字符串
conf.get(section名字,option名字)
支持读取出来为:bool,int,float
conf.getboolean(section,option)
conf.getint(section,option)
conf.getfloat(section,option)
加工后的my_logger.py:
1 import logging 2 from class_config.handle_config import conf 3 4 class MyLogger(logger.Logger): 5 6 def __init__(self,file=None): 7 # 设置输出级别、输出渠道、输出日志格式 8 super().__init__(conf.get("log","name"),conf.get("log","level")) 9 # 日志格式 10 fmt = '%(asctime)s %(name)s %(levelname)s %(filename)' 11 formatter = logging.Formatter(fmt) 12 13 # 控制台渠道 14 handle1 = logging.StreamHandler() 15 handle.setFormatter(formatter) 16 self.addHandler(handle1) 17 18 if file: 19 # 文件渠道 20 handle2 = logging.FileHandler(file,encoding="utf-8") 21 handle2.setFormatter(formatter) 22 self.addHandler(handle2) 23 24 # 是否需要写入文件 25 if conf.getboolean("log","file_ok"): 26 file_name=conf.get("log","file_name") 27 else: 28 file_name=None 29 30 logger = MyLogger(file_name)
以上,写于西安科技大学临潼校区2021.4.11凌晨。

浙公网安备 33010602011771号