python接口自动化测试实战条件发射导弹_python - 接口自动化测试实战 - case1 - 再次优化版...

本次优化:

1.  各级分Package

2.  封装【ReadExcel】类

3.  封装【ReadConfig】类

4.  封装【GetLog】类

5.  引入ddt数据驱动测试,优化测试用例代码

工程如下:

2fdfa65c2da3bfa590a119fce3cae714.png

代码分享:

get_logger.py

48304ba5e6f9fe08f3fa1abda7d326ab.png

# -*- 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)

48304ba5e6f9fe08f3fa1abda7d326ab.png

http_request.py

48304ba5e6f9fe08f3fa1abda7d326ab.png

# -*- 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

48304ba5e6f9fe08f3fa1abda7d326ab.png

read_config.py

48304ba5e6f9fe08f3fa1abda7d326ab.png

# -*- 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

48304ba5e6f9fe08f3fa1abda7d326ab.png

read_excel.py

48304ba5e6f9fe08f3fa1abda7d326ab.png

# -*- 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

48304ba5e6f9fe08f3fa1abda7d326ab.png

test_api.py

48304ba5e6f9fe08f3fa1abda7d326ab.png

# -*- 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

48304ba5e6f9fe08f3fa1abda7d326ab.png

test_run.py

48304ba5e6f9fe08f3fa1abda7d326ab.png

# -*- 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()

48304ba5e6f9fe08f3fa1abda7d326ab.png

测试报告:

199de59a734dad527ed5ac418364c8cb.png

测试日志:

44883ad699079d1edfa0b620d4cd998f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值