本次优化:

  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. Mysql有什么办法批量去掉某个字段字符中的空格

    Mysql有什么办法批量去掉某个字段字符中的空格?不仅是字符串前后的空格,还包含字符串中间的空格,答案是 replace,使用mysql自带的 replace 函数,另外还有个 trim 函数.   ...

  2. [转载]—Health Check Reports Problem: Dependency$ p_timestamp mismatch for VALID objects (文档 ID 781959.1)

    Health Check Reports Problem: Dependency$ p_timestamp mismatch for VALID objects (文档 ID 781959.1) AP ...

  3. ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error: 0

    最近遇到一个MySQL连接的问题,远程连接MySQL时遇到"ERROR 2013 (HY000): Lost connection to MySQL server at 'reading a ...

  4. LR脚本示例之常用函数

    1.变量和参数的设置 //将IP地址和端口放入到参数中lr_save_string("127.0.0.1:1080","ip"); //退出脚本建议使用lr_e ...

  5. External Pricing in C4C and ERP

    从下图可以看出,C4C的Opportunity,Sales Quote和Sales Order这些business transaction没有自己的pricing engine,使用的是在ERP Pr ...

  6. 2018.5.5 phpStorm破解2017.3版本方法

    方法一 注册时,在打开的License Activation窗口中选择"License server",在输入框输入下面的网址: http://im.js.cn:8888 (新) ...

  7. python_84_os模块

    'os模块:提供对操作系统进行调用的接口' import os print(os.getcwd())#获取当前脚本工作目录,即当前Python脚本工作的目录路径 os.chdir('C:\\Users ...

  8. Python 进程 线程总结

    操作系统的底层是 进程 线程 实现的 进程 操作系统完成系统进程的切换,中间有状态的保存.进程有自己独立的空间,进程多,资源消耗大 进程是最小的资源管理单位 可以理解为盛放线程的容器 线程 线程是最小 ...

  9. 01_3_查询指定id的单个对象

    01_3_查询指定id的单个对象 1. 映射文件配置如下信息 <select id="selectStudentById" resultClass="Student ...

  10. Element表单验证(2)

    Element表单验证(2) 上篇讲的是async-validator的基本要素,那么,如何使用到Element中以及怎样优雅地使用,就在本篇. 上篇讲到async-validator由3大部分组成 ...