python - 接口自动化测试实战 - case1 - 再次优化版
本次优化:
1. 各级分Package
2. 封装【ReadExcel】类
3. 封装【ReadConfig】类
4. 封装【GetLog】类
5. 引入ddt数据驱动测试,优化测试用例代码
工程如下:

代码分享:
get_logger.py
# -*- coding:utf-8 -*- '''
@project: jiaxy
@author: Jimmy
@file: get_logger.py
@ide: PyCharm Community Edition
@time: 2018-12-08 16:08
@blog: https://www.cnblogs.com/gotesting/ ''' import logging
import time class GetLog: def __init__(self):
curTime = time.strftime('%Y-%m-%d')
self.logname = 'TestReport/log/' + 'AutoTest' + '_' + curTime + '_' + '.log' def get_log(self,level,msg): # 创建日志收集器
logger = logging.getLogger()
logger.setLevel('DEBUG') # 创建handler
fh = logging.FileHandler(self.logname,'a',encoding='gbk')
fh.setLevel('INFO')
ch = logging.StreamHandler()
ch.setLevel('INFO') # 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(filename)s - %(name)s - %(levelname)s - 日志信息: %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter) # 给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch) if level == 'DEBUG':
logger.debug(msg)
elif level == 'INFO':
logger.info(msg)
elif level == 'WARNING':
logger.warning(msg)
elif level == 'ERROR':
logger.error(msg)
elif level == 'CRITICAL':
logger.critical(msg) logger.removeHandler(fh)
logger.removeHandler(ch)
fh.close() def log_debug(self,msg):
self.get_log('DEBUG',msg) def log_info(self,msg):
self.get_log('INFO',msg) def log_warning(self,msg):
self.get_log('WARNING',msg) def log_error(self,msg):
self.get_log('ERROR',msg) def log_critical(self,msg):
self.get_log('CRITICAL',msg)
http_request.py
# -*- coding:utf-8 -*- '''
@project: jiaxy
@author: Jimmy
@file: http_request.py
@ide: PyCharm Community Edition
@time: 2018-12-05 10:06
@blog: https://www.cnblogs.com/gotesting/ ''' import requests class HttpRequest: def http_request(self,url,param,method,cookies=None):
if method == 'get':
res = requests.get(url,param,cookies = cookies)
elif method == 'post':
res = requests.post(url,param,cookies = cookies)
else:
print('请求方法错误!')
return res
read_config.py
# -*- coding:utf-8 -*- '''
@project: jiaxy
@author: Jimmy
@file: read_config.py
@ide: PyCharm Community Edition
@time: 2018-12-08 14:45
@blog: https://www.cnblogs.com/gotesting/ ''' import configparser class ReadConfig: def read_config(self,file,section,option):
cf = configparser.ConfigParser()
cf.read(file)
value = cf.get(section,option)
return value
read_excel.py
# -*- coding:utf-8 -*- '''
@project: jiaxy
@author: Jimmy
@file: read_excel.py
@ide: PyCharm Community Edition
@time: 2018-12-05 11:57
@blog: https://www.cnblogs.com/gotesting/ ''' from openpyxl import load_workbook class ReadExcel: def read_excel(self,wbname,sheetname):
wb = load_workbook(wbname)
sheet = wb[sheetname] # 双重for循环 获取excel表中测试数据
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) return test_data
test_api.py
# -*- coding:utf-8 -*- '''
@project: jiaxy
@author: Jimmy
@file: TestApi.py
@ide: PyCharm Community Edition
@time: 2018-12-05 10:09
@blog: https://www.cnblogs.com/gotesting/ ''' import unittest
from ddt import ddt,data
from TestApi.Common.http_request import HttpRequest
from TestApi.Common.read_excel import ReadExcel
from TestApi.Common.get_logger import GetLog cookies = None
login_data = ReadExcel().read_excel('TestData/test_login.xlsx','登录及充值测试数据') @ddt
class TestHttpApi(unittest.TestCase): def setUp(self):
self.log = GetLog() def tearDown(self):
pass # # 改写__init__方法,使用超继承
# def __init__(self,url,param,method,expected,methodName):
# self.url = url
# self.param = param
# self.method = method
# self.expected = expected
# super(TestHttpApi,self).__init__(methodName) # 换用data来处理test_data
@data(*login_data)
def test_api(self,item):
global cookies
self.log.log_info('执行第{0}条测试用例:{1}'.format(item['case_id'],item['title']))
res = HttpRequest().http_request(item['url'],eval(item['param']),item['method'],cookies)
self.log.log_info('请求结果:{0}'.format(res.json()))
if res.cookies:
cookies = res.cookies
try:
self.assertEquals(item['excepted'],res.json()['msg'])
self.log.log_info('测试结果:PASSED')
except AssertionError as e:
self.log.log_error('断言异常:{0}'.format(e))
self.log.log_error('测试结果:FAILED')
raise e
test_run.py
# -*- coding:utf-8 -*- '''
@project: jiaxy
@author: Jimmy
@file: test_run.py
@ide: PyCharm Community Edition
@time: 2018-12-05 10:28
@blog: https://www.cnblogs.com/gotesting/ ''' import unittest
import HTMLTestRunner
import time
from TestApi.TestCses.test_api import TestHttpApi # 加载测试集
def run_test():
suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestHttpApi)) curTime = time.strftime('%Y-%m-%d_%H_%M_%S')
report_name = 'TestReport/report/' + 'TestResult-' + curTime + '.html' # 执行测试,输出测试报告
with open(report_name,'wb+') as file:
runner = HTMLTestRunner.HTMLTestRunner(stream=file,
verbosity=2,
title='接口测试报告',
description='基于python+unittest进行的数据驱动接口自动化测试',
tester='Jimmy')
runner.run(suite) if __name__ == '__main__':
run_test()
测试报告:

测试日志:

python - 接口自动化测试实战 - case1 - 再次优化版的更多相关文章
- python - 接口自动化测试实战 - case1 - 优化版
题目: 基于以下两个接口和数据完成接口自动化测试,并生成测试报告: '''登录 login='http://47.107.168.87:8080/futureloan/mvc/api/member/l ...
- Python接口自动化测试实战-----附源码
目录 1. 接口定义 2. 基本流程 3. 需求分析 4. 用例设计 5. 脚本开发 6. 结果分析 接口定义: 接口普遍有两种意思,一种是API(Application Program Interf ...
- ptyhon - 接口自动化测试实战case1
work_20181203_httprequest.py: import requestsclass http_request: def http_get(url,params): res = req ...
- Python接口自动化测试框架实战 从设计到开发
第1章 课程介绍(不要错过)本章主要讲解课程的详细安排.课程学习要求.课程面向用户等,让大家很直观的对课程有整体认知! 第2章 接口测试工具Fiddler的运用本章重点讲解如何抓app\web的htt ...
- 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码
引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...
- python接口自动化测试二十七:密码MD5加密 ''' MD5加密 ''' # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待加密信息 str = 'asdas89799,.//plrmf' # 创建md5对象 hl = hashlib.md5() # Tips # 此处必须声明encode # 若写法为
python接口自动化测试二十七:密码MD5加密 ''' MD5加密 '''# 由于MD5模块在python3中被移除# 在python3中使用hashlib模块进行md5操作import has ...
- python接口自动化测试七:获取登录的Cookies
python接口自动化测试七:获取登录的Cookies,并关联到下一个请求 获取登录的cookies:loginCookies = r.cookies 把获取到的cookies传入请求:cooki ...
- 面面俱到的Java接口自动化测试实战
第1章 接口自动化测试整体认知了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程. 1-1 导学章节 1-2 什么是接口 1-3 为什么要做接口测试 ...
- Python接口自动化测试框架: pytest+allure+jsonpath+requests+excel实现的接口自动化测试框架(学习成果)
废话 最近在自己学习接口自动化测试,这里也算是完成一个小的成果,欢迎大家交流指出不合适的地方,源码在文末 问题 整体代码结构优化未实现,导致最终测试时间变长,其他工具单接口测试只需要39ms,该框架中 ...
随机推荐
- Vue2.0 官方文档学习笔记
VUE2.0官方文档 基础部分: 1.VUE简介 Vue是一个基于MVVM的框架,其中M代表数据处理层,V代表视图层即我们在Vue组件中的html部分,VM即M和V的结合层,处理M层相应的逻辑数据,在 ...
- React日常注意点
1.在定义组件的时候,名字首字母一定要大写 最近刚学,我会持续把自己学习过程中的的注意点在这里逐个列出,敬请等待!
- Windows中将nginx添加到服务
下载安装nginx http://nginx.org/en/download.html 下载后解压到C盘 C:\nginx-1.14.0 添加服务 需要借助"Windows Service ...
- Beta_版本发布
学号 姓名 201731041215 王阳 201731062302 鲜雨珂 201731062128 邓捷 201731062305 周蓉 201731062131 龙继平 201731062304 ...
- Java 反射机制(二)
<Core Java Volume I --- Fundamentals>介绍了三种创建Class对象的方法.本文将举例说明这三种创建Class对象---创建类的方法. 一.public ...
- SCCM Collection 集合获取计算机最后启动时间
获取计算机客户端最后一次启动时间,我们可以通过多种来源获取,如活动目录组 ,而不仅仅是SCCM 收集,希望对您有所帮助,下面分享PowerShell 脚本 # 1 $CollectionName = ...
- 使用nginx搭建一个简单的负载均衡
在windows系统上使用IIS模拟出两个不同服务器的站点: 然后再NGINX使用轮询机制配置两个服务器以及虚拟服务器的端口: 需要注意的是,配置虚拟代理域名的话需要找到windowsC盘下的host ...
- DROP RULE - 删除一个重写规则
SYNOPSIS DROP RULE name ON relation [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP RULE 删除一个规则. PARAMETE ...
- Java替换手机号掩码
String tel = "18304072984"; // 括号表示组,被替换的部分$n表示第n组的内容 tel = tel.replaceAll("(\\d{3})\ ...
- c#中接口、抽象类、继承综合小练习
namespace Test { class Program { static void Main(string[] args) { //作业:橡皮rubber鸭子.木wood鸭子.真实的鸭子real ...