python-单元测试优化,加入日志
HttpRequests.py
#-*- coding:utf-8 -*- import requests
class HttpRequests():
def http_requests(self,url,params,http_mothed,cookies=None):
if http_mothed=='get':
res=requests.get(url,params,cookies=cookies)
return res
else:
res=requests.post(url,params,cookies=cookies)
return res
my_log.py
#-*- coding:utf-8 -*- import logging
from common import project_path
from common.read_config import ReadConfig
class MyLog: def my_log(self,level,msg):
# 创建一个日志收集器并命名
my_logger=logging.getLogger(ReadConfig().read_config(project_path.conf_path,'LOGS','logger_name'))
my_logger.setLevel(ReadConfig().read_config(project_path.conf_path,'LOGS','log_level'))# 设置收集器的级别 # 设置输出格式
formatter = logging.Formatter(ReadConfig().read_config(project_path.conf_path,'LOGS','formatter')) # 指定输出渠道,输出到控制台
ch=logging.StreamHandler()#输入到控制台
ch.setLevel(ReadConfig().read_config(project_path.conf_path,'LOGS','console_handle'))# 设置输出渠道的级别;
# 如果收集器中的级别与输出渠道级别不同,取两者的交集
ch.setFormatter(formatter)#日志输出时,按指定的输出格式输出 #输出到本地文件
fh=logging.FileHandler(project_path.log_path,encoding='utf-8')#输出到本地log_file文档中;日志中有中文,需要设置编码
fh.setLevel(ReadConfig().read_config(project_path.conf_path,'LOGS','file_handle'))#输出级别为debug
fh.setFormatter(formatter)#日志输出时,按指定的输出格式输出 #对接:收集器与输出渠道
my_logger.addHandler(ch)
my_logger.addHandler(fh) if level == 'DEBUG':
my_logger.debug(msg)
elif level == 'INFO':
my_logger.info(msg)
elif level == 'WARNING':
my_logger.warning(msg)
elif level == 'ERROR':
my_logger.error(msg)
elif level == 'CRITICAL':
my_logger.critical(msg) #将渠道移除
my_logger.removeHandler(ch)
my_logger.removeHandler(fh)
fh.close() def debug(self,msg):
self.my_log('DEBUG',msg)
def info(self,msg):
self.my_log('INFO',msg)
def warning(self,msg):
self.my_log('WARNING',msg)
def error(self,msg):
self.my_log('ERROR',msg)
def crtical(self,msg):
self.my_log('CRTICAL',msg) if __name__ == '__main__':
my_logger=MyLog()
my_logger.debug('haha')
my_logger.info('heng')
project_path.py
# @File : project_path.py #-*- coding:utf-8 -*-
#存放路径变量
import os
base_path=os.path.split(os.path.split(os.path.realpath(__file__))[0])[0] #api_auto目录 #配置文件路径
conf_path=os.path.join(base_path,'conf','test_api.conf') #测试报告路径
report_path=os.path.join(base_path,'test_result','report','test_api.html') #测试用例的路径
case_path=os.path.join(base_path,'test_case','http_requests.xlsx') #日志的路径
log_path=os.path.join(base_path,'test_result','log','log_file.txt')
read_config.py
# @File : read_config.py #-*- coding:utf-8 -*- import configparser
class ReadConfig():
def read_config(self,file_name,section,option):
cf = configparser.ConfigParser()#创建对象
cf.read(file_name,encoding ='utf-8')#打开配置文件
value=cf.get(section,option)
return value
if __name__ == '__main__':
value=ReadConfig().read_config('test_api.conf','student1','name')
print(value)
read_excel.py
#-*- coding:utf-8 -*- from openpyxl import load_workbook
import configparser class TestExcel(): def get_TestExcel(self,file_name,sheet_name,button):
workbook = load_workbook(file_name)#打开表格
sheet = workbook[sheet_name]#定位表单 test_data = []#把所有行的数据放到列表中 for i in range(2,sheet.max_row+1):
sub_data = {}#把每行的数据放到字典中
for j in range(1,sheet.max_column+1): sub_data[sheet.cell(1,j).value] = sheet.cell(i,j).value test_data.append(sub_data)#把每一行数据添加到test_data列表里 final_data=[]#最后的测试数据
if button == 'all':
final_data=test_data
else:
for item in test_data: #遍历test_data里面的数据
if item['case_id'] in eval(button):
#如果表格中case_id在button里面,就把这条用例加到final_data里面
final_data.append(item) return final_data
test_HttpRequests.py
#-*- coding:utf-8 -*- #存放测试用例
import unittest from ddt import ddt,data from common.HttpRequests import HttpRequests
from common.read_config import ReadConfig
from common.read_excel import TestExcel
from common.my_log import MyLog
from common import project_path COOKIES=None #利用配置类,从配置文件case.conf里面读取section:case;option:button的values值
button=ReadConfig().read_config(project_path.conf_path,'case','button') #调用task_04_do_excel这个模块里面的TestExcel类里面的get_TestExcel方法
#此方法需要 文件名,表单名,配置的值 这几个参数
test_data=TestExcel().get_TestExcel(project_path.case_path,'Sheet1',button) @ddt
class TestHttpRequests(unittest.TestCase): def setUp(self):
# self.url='http://47.107.168.87:8080/futureloan/mvc/api/member/login'
pass @data(*test_data)
def test_api(self,item):#登录成功 :手机号正确、密码正确;用例里面不可以传参数;但是如果用@data装饰以后,要用等量的变量接收,必须赋值
global COOKIES#声明全局变量
my_logger=MyLog() my_logger.info('目前正在执行第{}条用例:{}'.format(item['case_id'],item['title']))
my_logger.info('------开始检查url地址----------')
my_logger.info('url:{}'.format(item['url']))
my_logger.info('------开始检查params----------')
my_logger.info('params:{}'.format(item['params']))
my_logger.info('---------开始http请求----------') res=HttpRequests().http_requests(item['url'],eval(item['params']),item['http_method'],COOKIES)
my_logger.info('---------结束http请求----------') try:
self.assertEqual(item['excepted'],res.json()['msg'])
# TestReslt='pass'
except AssertionError as e:
# TestReslt='Failed'
my_logger.error('断言结果是:{}'.format(e))
raise e
# finally:
# my_logger.info('本次用例的测试结论是:{}'.format(e))
# my_logger.info('看看TestReslt的值') if res.cookies:
COOKIES=res.cookies#当res.cookies非空时,修改COOKIES的值
test_runner.py
#-*- coding:utf-8 -*- import unittest
from common import project_path
import HTMLTestRunnerNew from common.test_HttpRequests import TestHttpRequests suit=unittest.TestSuite()##装用例的地方
loader=unittest.TestLoader()
suit.addTest(loader.loadTestsFromTestCase(TestHttpRequests)) #执行用例
with open(project_path.report_path,'bw+') as file:
Runner=HTMLTestRunnerNew.HTMLTestRunner(stream=file,verbosity=2,
title='HTTP请求作业-单元测试报告',description='测试一下HTTP请求',tester='huimin'
)
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
执行结果
python-单元测试优化,加入日志的更多相关文章
- Python单元测试框架
目录 概况 系统要求 使用PyUnit构建自己的测试 安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代码的 ...
- Python单元测试PyUnit框架轻度整改
原理 参考:单元测试原理 背景 年后有段时间没写代码了,所以趁着周末找了个python单元测试玩下,测试自己的Android应用.发现PyUnit虽然在单个脚本文件中添加多个测试用例,比如官网提供的方 ...
- Python性能优化(转)
分成两部分:代码优化和工具优化 原文:http://my.oschina.net/xianggao/blog/102600 阅读 Zen of Python,在Python解析器中输入 import ...
- python单元测试框架 pyunit
概况 系统要求 使用PyUnit构建自己的测试 安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代码的放置位 ...
- The Hacker's Guide To Python 单元测试
The Hacker's Guide To Python 单元测试 基本方式 python中提供了非常简单的单元测试方式,利用nose包中的nosetests命令可以实现简单的批量测试. 安装nose ...
- [译]PyUnit—Python单元测试框架(1)
1. 原文及参考资料 原文链接:http://docs.python.org/2/library/unittest.html# 参考文档: http://pyunit.sourceforge.net/ ...
- python性能优化
注意:本文除非特殊指明,”python“都是代表CPython,即C语言实现的标准python,且本文所讨论的是版本为2.7的CPython. python为什么性能差: 当我们提到一门编程语言的 ...
- Python内存优化
实际项目中,pythoner更加关注的是Python的性能问题,之前也写过一篇文章<Python性能优化>介绍Python性能优化的一些方法.而本文,关注的是Python的内存优化,一般说 ...
- 一种数据与逻辑分离的Python单元测试工具
一种数据与逻辑分离的Python单元测试工具 几个概念 TestCase TestCase是一个完整的测试单元,最小的测试执行实体,就是我们常说的测试用例. TestSuite 以某种特性将测试用例组 ...
- python中的第三方日志模块logging
基本上每个系统都有自己的日志系统,可以使自己写的,也可以是第三方的.下面来简单介绍一下python中第三方的日志模块,入手还是比较简单的,但是也很容易给自己埋雷. 下面是我参考的资料链接 入手demo ...
随机推荐
- 正确学习Linux系统的5个建议
摘要: 最近几年Linux系统应用越来越广泛,以至于很多人开始热衷学习Linux.但是我们都是从小都是学习windows系统长大的,从windows 98到现在的windows 10,而根据学习win ...
- [Codeforces440D]Berland Federalization
Problem 给你一棵树,最少删掉哪些边,能使得余下的至少有1个大小刚好为k的残树. 1 ≤ k ≤ n ≤ 400 Solution 用f[i][j]表示以i为根有j个节点的最少删边数量 因为此题 ...
- 厨娘ui设计文档
厨娘ui设计文档 一.概述 中国的饮食文化从古到今源远流长.在生活日益丰富的今天,人们对饮食的要求不仅仅是温饱,更讲究健康和美味.近年来,饮食甚至成为娱乐的一部分,关于吃的流行用语层出不穷,可见在当今 ...
- C++ 抽象类与接口
1. 抽象类 在面向对象编程中,抽象类是一种只能定义类型,不能生成对象的类,它是对一系列看上去不同,但是本质相同的具体概念的抽象.最典型的的抽象类就是”图形”,三角形.矩形.梯形都是图形,它们都具有 ...
- 网络性能测试工具-Iperf
一.简单介绍 Iperf是一个网络性能测试工具,Iperf可以测试TCP和UDP带宽质量,Iperf可以测量最大TCP带宽,具有多种参数和UDP特性.Iperf可以报告带宽,延迟抖动和数据包丢失.利用 ...
- nginx 支持的命令行参数
Command-line parameters 命令行参数 nginx supports the following command-line parameters: nginx支持以下命令行参数 - ...
- git一些有用的命令
更改本地和远程分支的名称 git branch -m old_branch new_branch # Rename branch locally 本地分支改名 git push origin :old ...
- FCC JS基础算法题(0):Reverse a String(翻转字符串)
题目描述: 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串.你的结果必须得是一个字符串. 算法: function reverseString(str) { ...
- api管理平台
安装和介绍 安装要求:(centos安装环境) nodejs(7.6+) mongodb(2.6|+) 安装get和编译的工具 yum -y install wget make gcc gcc-c++ ...
- 一款我常用到的手机app
我从初中开始接触电子书,后来渐渐养成了看电子书的习惯.在阅读电子书的过程中自然要接触到各种各样的阅读类的手机app,比如书旗.qq阅读.百度阅读器等等.个人感觉掌阅使用起来好一些. 首先,它的界面很简 ...