• python-单元测试优化,加入日志


     

    HttpRequests.py

     1 #-*- coding:utf-8 -*-
     2 
     3 import requests
     4 class HttpRequests():
     5     def http_requests(self,url,params,http_mothed,cookies=None):
     6         if http_mothed=='get':
     7             res=requests.get(url,params,cookies=cookies)
     8             return res
     9         else:
    10             res=requests.post(url,params,cookies=cookies)
    11             return res

    my_log.py

     1 #-*- coding:utf-8 -*-
     2 
     3 
     4 import logging
     5 from common import project_path
     6 from common.read_config import ReadConfig
     7 class MyLog:
     8 
     9  def my_log(self,level,msg):
    10   # 创建一个日志收集器并命名
    11     my_logger=logging.getLogger(ReadConfig().read_config(project_path.conf_path,'LOGS','logger_name'))
    12     my_logger.setLevel(ReadConfig().read_config(project_path.conf_path,'LOGS','log_level'))# 设置收集器的级别
    13 
    14   # 设置输出格式
    15     formatter = logging.Formatter(ReadConfig().read_config(project_path.conf_path,'LOGS','formatter'))
    16 
    17   # 指定输出渠道,输出到控制台
    18     ch=logging.StreamHandler()#输入到控制台
    19     ch.setLevel(ReadConfig().read_config(project_path.conf_path,'LOGS','console_handle'))# 设置输出渠道的级别;
    20   # 如果收集器中的级别与输出渠道级别不同,取两者的交集
    21     ch.setFormatter(formatter)#日志输出时,按指定的输出格式输出
    22 
    23   #输出到本地文件
    24     fh=logging.FileHandler(project_path.log_path,encoding='utf-8')#输出到本地log_file文档中;日志中有中文,需要设置编码
    25     fh.setLevel(ReadConfig().read_config(project_path.conf_path,'LOGS','file_handle'))#输出级别为debug
    26     fh.setFormatter(formatter)#日志输出时,按指定的输出格式输出
    27 
    28   #对接:收集器与输出渠道
    29     my_logger.addHandler(ch)
    30     my_logger.addHandler(fh)
    31 
    32     if level == 'DEBUG':
    33         my_logger.debug(msg)
    34     elif level == 'INFO':
    35         my_logger.info(msg)
    36     elif level == 'WARNING':
    37         my_logger.warning(msg)
    38     elif level == 'ERROR':
    39         my_logger.error(msg)
    40     elif level == 'CRITICAL':
    41         my_logger.critical(msg)
    42 
    43     #将渠道移除
    44     my_logger.removeHandler(ch)
    45     my_logger.removeHandler(fh)
    46     fh.close()
    47 
    48 
    49  def debug(self,msg):
    50     self.my_log('DEBUG',msg)
    51  def info(self,msg):
    52     self.my_log('INFO',msg)
    53  def warning(self,msg):
    54     self.my_log('WARNING',msg)
    55  def error(self,msg):
    56     self.my_log('ERROR',msg)
    57  def crtical(self,msg):
    58     self.my_log('CRTICAL',msg)
    59 
    60 
    61 if __name__ == '__main__':
    62   my_logger=MyLog()
    63   my_logger.debug('haha')
    64   my_logger.info('heng')

    project_path.py

     1 # @File : project_path.py
     2 
     3 #-*- coding:utf-8 -*-
     4 #存放路径变量
     5 import os
     6 base_path=os.path.split(os.path.split(os.path.realpath(__file__))[0])[0] #api_auto目录
     7 
     8 #配置文件路径
     9 conf_path=os.path.join(base_path,'conf','test_api.conf')
    10 
    11 #测试报告路径
    12 report_path=os.path.join(base_path,'test_result','report','test_api.html')
    13 
    14 #测试用例的路径
    15 case_path=os.path.join(base_path,'test_case','http_requests.xlsx')
    16 
    17 #日志的路径
    18 log_path=os.path.join(base_path,'test_result','log','log_file.txt')

    read_config.py

     1 # @File : read_config.py
     2 
     3 #-*- coding:utf-8 -*-
     4 
     5 import configparser
     6 class ReadConfig():
     7     def read_config(self,file_name,section,option):
     8         cf = configparser.ConfigParser()#创建对象
     9         cf.read(file_name,encoding ='utf-8')#打开配置文件
    10         value=cf.get(section,option)
    11         return value
    12 if __name__ == '__main__':
    13     value=ReadConfig().read_config('test_api.conf','student1','name')
    14     print(value)

    read_excel.py

     1 #-*- coding:utf-8 -*-
     2 
     3 from openpyxl import load_workbook
     4 import configparser
     5 
     6 
     7 class TestExcel():
     8 
     9     def get_TestExcel(self,file_name,sheet_name,button):
    10         workbook = load_workbook(file_name)#打开表格
    11         sheet = workbook[sheet_name]#定位表单
    12 
    13         test_data = []#把所有行的数据放到列表中
    14 
    15         for i in range(2,sheet.max_row+1):
    16             sub_data = {}#把每行的数据放到字典中
    17             for j in range(1,sheet.max_column+1):
    18 
    19                 sub_data[sheet.cell(1,j).value] = sheet.cell(i,j).value
    20 
    21             test_data.append(sub_data)#把每一行数据添加到test_data列表里
    22 
    23         final_data=[]#最后的测试数据
    24         if button == 'all':
    25             final_data=test_data
    26         else:
    27             for item in test_data: #遍历test_data里面的数据
    28                 if item['case_id'] in eval(button):
    29                     #如果表格中case_id在button里面,就把这条用例加到final_data里面
    30                     final_data.append(item)
    31 
    32         return final_data

    test_HttpRequests.py

     1 #-*- coding:utf-8 -*-
     2 
     3 #存放测试用例
     4 import unittest
     5 
     6 from ddt import ddt,data
     7 
     8 from common.HttpRequests import HttpRequests
     9 from common.read_config import ReadConfig
    10 from common.read_excel import TestExcel
    11 from common.my_log import MyLog
    12 from common import project_path
    13 
    14 COOKIES=None
    15 
    16 #利用配置类,从配置文件case.conf里面读取section:case;option:button的values值
    17 button=ReadConfig().read_config(project_path.conf_path,'case','button')
    18 
    19 #调用task_04_do_excel这个模块里面的TestExcel类里面的get_TestExcel方法
    20 #此方法需要 文件名,表单名,配置的值 这几个参数
    21 test_data=TestExcel().get_TestExcel(project_path.case_path,'Sheet1',button)
    22 
    23 @ddt
    24 class TestHttpRequests(unittest.TestCase):
    25 
    26 
    27     def setUp(self):
    28         # self.url='http://47.107.168.87:8080/futureloan/mvc/api/member/login'
    29         pass
    30 
    31     @data(*test_data)
    32     def test_api(self,item):#登录成功 :手机号正确、密码正确;用例里面不可以传参数;但是如果用@data装饰以后,要用等量的变量接收,必须赋值
    33         global COOKIES#声明全局变量
    34         my_logger=MyLog()
    35 
    36         my_logger.info('目前正在执行第{}条用例:{}'.format(item['case_id'],item['title']))
    37         my_logger.info('------开始检查url地址----------')
    38         my_logger.info('url:{}'.format(item['url']))
    39         my_logger.info('------开始检查params----------')
    40         my_logger.info('params:{}'.format(item['params']))
    41         my_logger.info('---------开始http请求----------')
    42 
    43         res=HttpRequests().http_requests(item['url'],eval(item['params']),item['http_method'],COOKIES)
    44         my_logger.info('---------结束http请求----------')
    45 
    46 
    47         try:
    48             self.assertEqual(item['excepted'],res.json()['msg'])
    49             # TestReslt='pass'
    50         except AssertionError as e:
    51             # TestReslt='Failed'
    52             my_logger.error('断言结果是:{}'.format(e))
    53             raise e
    54         # finally:
    55         #     my_logger.info('本次用例的测试结论是:{}'.format(e))
    56         #     my_logger.info('看看TestReslt的值')
    57 
    58         if res.cookies:
    59             COOKIES=res.cookies#当res.cookies非空时,修改COOKIES的值

    test_runner.py

     1 #-*- coding:utf-8 -*-
     2 
     3 
     4 import unittest
     5 from common import project_path
     6 import HTMLTestRunnerNew
     7 
     8 
     9 from common.test_HttpRequests import TestHttpRequests
    10 
    11 
    12 suit=unittest.TestSuite()##装用例的地方
    13 loader=unittest.TestLoader()
    14 suit.addTest(loader.loadTestsFromTestCase(TestHttpRequests))
    15 
    16 
    17 #执行用例
    18 with open(project_path.report_path,'bw+') as file:
    19     Runner=HTMLTestRunnerNew.HTMLTestRunner(stream=file,verbosity=2,
    20                                             title='HTTP请求作业-单元测试报告',description='测试一下HTTP请求',tester='huimin'
    21                                             )
    22     Runner.run(suit)

    test_api.conf

    #button = all 执行表格中所有用例
    #button=[x,y] int(x)<int(y),执行x-y行之间的用例

    [case]
    button=all

    [LOGS]
    log_level=DEBUG
    console_handle=ERROR
    file_handle=DEBUG
    formatter=%%(asctime)s - %%(filename)s - %%(name)s - %%(levelname)s - 日志信息: %%(message)s
    logger_name=Mina

    http_requests.xlsx

    执行结果

  • 相关阅读:
    全体自然数的和是负十二分之一?
    隐马尔可夫模型(二)维特比算法
    隐马尔可夫模型
    freemarker实现单元格动态合并-行合并
    工具类_JavaPOI_Office文件内容读取
    SpringBoot-自动装配对象及源码ImportSelector分析
    SpringBoot-文件在线预览解决方案-基于OpenOffice及jacob
    Elasticsearch6.4.0-windows环境部署安装
    单列模式与多线程
    基于SpringMVC的文件(增删改查)上传、下载、更新、删除
  • 原文地址:https://www.cnblogs.com/Aphrodite/p/10150778.html
Copyright © 2020-2023  润新知