本次优化:

  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 - 再次优化版的更多相关文章

  1. python - 接口自动化测试实战 - case1 - 优化版

    题目: 基于以下两个接口和数据完成接口自动化测试,并生成测试报告: '''登录 login='http://47.107.168.87:8080/futureloan/mvc/api/member/l ...

  2. Python接口自动化测试实战-----附源码

    目录 1. 接口定义 2. 基本流程 3. 需求分析 4. 用例设计 5. 脚本开发 6. 结果分析 接口定义: 接口普遍有两种意思,一种是API(Application Program Interf ...

  3. ptyhon - 接口自动化测试实战case1

    work_20181203_httprequest.py: import requestsclass http_request: def http_get(url,params): res = req ...

  4. Python接口自动化测试框架实战 从设计到开发

    第1章 课程介绍(不要错过)本章主要讲解课程的详细安排.课程学习要求.课程面向用户等,让大家很直观的对课程有整体认知! 第2章 接口测试工具Fiddler的运用本章重点讲解如何抓app\web的htt ...

  5. 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码

    引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...

  6. 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 ...

  7. python接口自动化测试七:获取登录的Cookies

    python接口自动化测试七:获取登录的Cookies,并关联到下一个请求   获取登录的cookies:loginCookies = r.cookies 把获取到的cookies传入请求:cooki ...

  8. 面面俱到的Java接口自动化测试实战

    第1章 接口自动化测试整体认知了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程. 1-1 导学章节 1-2 什么是接口 1-3 为什么要做接口测试 ...

  9. Python接口自动化测试框架: pytest+allure+jsonpath+requests+excel实现的接口自动化测试框架(学习成果)

    废话 最近在自己学习接口自动化测试,这里也算是完成一个小的成果,欢迎大家交流指出不合适的地方,源码在文末 问题 整体代码结构优化未实现,导致最终测试时间变长,其他工具单接口测试只需要39ms,该框架中 ...

随机推荐

  1. win7 dos窗口模拟帧刷新

    前几天是白色情人节,临时脑抽写了个表白神器 高端大气上档次,就是不知道该送给谁,经过两天的反射弧思考决定还是写给博客娘吧.- -~ 这个程序就是打开后,在Dos窗口内模拟写出几行字母.其实主要就是模拟 ...

  2. react中constructor和super()以及super(props)的区别。

    react中这两个API出镜率超级高,但是一直不太懂这到底是干嘛的,有什么用:今天整理一下,方便自己查看同时方便大家. 1.constructor( )-----super( )的基本含义 const ...

  3. linux下设置SSH无密码登录

    ssh配置 主机A:10.0.5.199 主机B:10.0.5.198 需要配置主机A无密码登录主机A,主机B 先确保所有主机的防火墙处于关闭状态. 在主机A上执行如下: 1. $cd ~/.ssh ...

  4. Beginning Python Chapter 3 Notes

    变量(variable)是储存数据的实体,在Python中也被称为"名称"(name). 1.Python"名称"基本命名法则 1.1) "名称&qu ...

  5. 本号讯 | 微软和百度携手推进全球自动驾驶技术; 微软发布新一代可垂直可水平滚动的Arc鼠标

    7 月 13 日,微软宣布了与宝马的最新合作进展,继语音助手 Cortana .云服务 Azure.Office 365 和微软 Exchange 安装在部分宝马车型后——Skype for Busi ...

  6. python3操作excel01(对excel的基础操作)

    #!/usr/bin/env python# -*- coding:UTF-8 -*- import requestsfrom bs4 import BeautifulSoupfrom bs4 imp ...

  7. 关于“为何Unicode中文字符占取2个字节,而 UTF-8却占3个字节”的网络解释修正

    学到编码时,有个疑问——好好的占2字节的Unicode不用,却要用占3字节的UTF-8编码.发明 UTF-8的初衷不就是为了修正Unicode中任何字符至少占用2个字节的弊端吗? 虽然UTF-8英文字 ...

  8. java面试题(杨晓峰)---第一讲谈谈你对java平台的理解

    本人总结: 面向对象(封装,继承,多态) 平台无关性(jvm运行,class文件) 语言(泛型,lambda) 类库(集合,并发,网络,io/nio) jre(java运行环境,JVM,类库) JDK ...

  9. 10.1 plan

    1951    [Sdoi2010]古代猪文  Sdoi2010 Contest2   807 1928 1566    [NOI2009]管道取珠       806 1429 2756    [S ...

  10. Adobe登陆出现Access denied解决方法

    当我安装好Adobe Acrobat Reader DC时,想要登陆Adobe账号时被Access denied. 一般说需要梯子,然而本人亲测这种方法不行(香港主机,全局模式下). 一个简单有效的方 ...