Python+unittest+requests+HTMLTestRunner框架
1 目录说明
common:公共文档,存放包含HTMLTestRunner.py,logUtils.py等公用文件
data:数据文档,存放测试数据;接口数据使用excel存储
log:存放日志文件
report:存放测试报告
page:编写模块对象层的代码,即把模块公共的方法封装成对象以供调用
testCase:测试用例代码,按照模块划分
runTest:执行所有测试用例的文件项目目录
2 common
#helper.py
#helper.py
import os, xlrd, json, demjson, unittest
class Helper(object):
'''公共方法'''
def base_dir(self,filename,folder='data'):
'''返回文件路径
params filename:文件名称
params folder:文件夹 '''
return os.path.join(os.path.dirname(__file__),os.path.pardir, folder, filename)
def read_excel(self,rowx,filename='data.xlsx'):
'''
:return:读取excel中数据并且返回
:params filepath :xlsx文件名称
:params rowx:在excel中的行数
'''
book = xlrd.open_workbook(self.base_dir(filename))
sheet = book.sheet_by_index(0)
return sheet.row_values(rowx)
def get_url(self,rowx):
'''
获取请求地址
:params rowx:url所在的行数
'''
return self.read_excel(rowx)[1]
def get_data(self,rowx):
'''
获取请求数据
:params rowx:url所在的行数
'''
return demjson.decode(json.loads(demjson.encode(self.read_excel(rowx)[2], encoding='utf-8')))
if __name__ == '__main__':
t = Helper()
print(t.get_url(1))
print(t.get_data(1))
HTMLTestRunner.py,logUtils.py文件在网上找自己喜欢的格式下载放到目录即可
3 page
#user.py
import requests
def getHeaders(Authorization=""):
'''返回请求头'''
headers = {"Content-Type": "application/json", "Authorization": Authorization}
return headers
def post(url,params={},data={}):
'''对post二次封装'''
r = requests.post(
url=url,
headers=getHeaders(),
timeout=6,
json=data,
params=params
)
return r
def get(url,params={},data={}):
'''对get二次封装'''
r = requests.get(
url=url,
headers=getHeaders(),
timeout=6,
json=data,
params=params
)
return r
if __name__ == '__main__':
print(getHeaders())
4 testCase
#test_user.py
from page.user import *
from common.helper import *
class TestUser(unittest.TestCase,Helper):
@classmethod
def setUpClass(cls):
print("start===============!")
@classmethod
def tearDownClass(cls):
print("end===============!")
def test_user_001(self):
'''登录'''
r = post(self.get_url(1), params=self.get_data(1))
print(r.json())
self.assertEqual(r.json()['code'],200)
self.assertIn('token',r.text)
with open(self.base_dir('pctoken'),'w',encoding='utf-8') as f:
f.write(r.json()['data']['token'])
@property
def getPctoken(self):
'''获取成功登录的token'''
with open(self.base_dir('pctoken'), 'r', encoding='utf-8') as f:
return f.read()
if __name__ == '__main__':
unittest.main(verbosity=2)
5 runTest
#!/usr/bin/env python
#author xq
import unittest
import os
from common import HTMLTestRunner
from common.helper import Helper
from common.logUtils import LogUtils
import time
def getSuites():
suites = unittest.defaultTestLoader.discover(
start_dir=os.path.join(os.path.dirname(__file__),'testCase'),
pattern='test_*.py',
top_level_dir=None
)
return suites
def getNowTime():
return time.strftime('%y-%m-%d-%H-%M-%S',time.localtime())
def run():
report_filename = Helper().base_dir(folder='report', filename=getNowTime()+'report.html')
HTMLTestRunner.HTMLTestRunner(stream=open(report_filename,'wb'),
verbosity=2,
title='自动化测试报告',
description='自动化测试详细的报告'
).run(getSuites())
LogUtils.log().info('测试结束,生成基于HTML的测试报告')
if __name__ == '__main__':
run()