This commit is contained in:
lileilei
2020-05-08 18:29:34 +08:00
parent 1aa7644c9f
commit 49e45d00fa
19 changed files with 971 additions and 29 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
# -*- coding: utf-8 -*-

16
Public/create_report.py Normal file
View File

@@ -0,0 +1,16 @@
# encoding: utf-8
"""
@author: lileilei
@file: create_report.py
@time: 2017/8/3 12:27
"""
from Public.log import LOG,logger
@logger('保存测试结果')
def save_result(testtime,toial,passnum,fail):
try:
f=open('result.txt','a')
f.write("%s=%s=%s=%s \n"%(testtime,toial,passnum,fail))
f.close()
except:
LOG.info('保存测试结果出错,原因:%s'%Exception)
print('记录测试结果失败')

32
Public/emmail.py Normal file
View File

@@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# @Author : leizi
import smtplib,time,os
from email.mime.text import MIMEText
from email.utils import formataddr,parseaddr
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
def load_emil_setting():#从配置文件中加载获取email的相关信息
import yaml
data_file = open(r".\\config\\email.yaml","r")
datas = yaml.load(data_file)
data_file.close()
return (datas['foremail'],datas['password'],datas['toeamil'],datas['title'])
def sendemali(filepath): #发送email
from_addr,password,mail_to,mail_body=load_emil_setting()
msg = MIMEMultipart()
msg['Subject'] = '接口自动化测试报告'
msg['From'] ='自动化测试平台'
msg['To'] = mail_to
msg['Date'] = time.strftime('%a, %d %b %Y %H:%M:%S %z')
att = MIMEText(open(r'%s'%filepath, 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename="pyresult.html"'
txt = MIMEText("这是测试报告的邮件,详情见附件",'plain','gb2312')
msg.attach(txt)
msg.attach(att)
smtp = smtplib.SMTP()
server = smtplib.SMTP_SSL("smtp.qq.com",465)
server.login(from_addr, password)
server.sendmail(from_addr, mail_to, msg.as_string())
server.quit()

102
Public/pyreport_excel.py Normal file
View File

@@ -0,0 +1,102 @@
# encoding: utf-8
"""
@author: lileilei
@file: pyreport_excel.py
@time: 2017/6/7 8:47
"""
import xlrd ,os,xlwt,yaml,xlsxwriter #导入库
from xlwt import *
def yangshi1():
style = XFStyle()
fnt = Font()
fnt.name = u'微软雅黑'
fnt.bold = True
style.font = fnt
alignment = xlwt.Alignment()
alignment.horz = xlwt.Alignment.HORZ_CENTER
alignment.vert = xlwt.Alignment.VERT_CENTER
style.alignment = alignment # 给样式添加文字居中属性
style.font.height = 430 # 设置字体大小
return style
def yangshi2():
style1 = XFStyle()
alignment = xlwt.Alignment()
alignment.horz = xlwt.Alignment.HORZ_CENTER
alignment.vert = xlwt.Alignment.VERT_CENTER
style1.alignment = alignment # 给样式添加文字居中属性
style1.font.height = 330 # 设置字体大小
return style1
def yangshi3():
style1 = XFStyle()
style1.font.height = 330 # 设置字体大小
return style1
def yangshique(me):
if me =='pass':
style=yangshi1()
Pattern=xlwt.Pattern()
Pattern.pattern=xlwt.Pattern.SOLID_PATTERN
Pattern.pattern_fore_colour=xlwt.Style.colour_map['green']
style.pattern=Pattern
else :
style=yangshi2()
Pattern=xlwt.Pattern()
Pattern.pattern=xlwt.Pattern.SOLID_PATTERN
Pattern.pattern_fore_colour=xlwt.Style.colour_map['red']
style.pattern=Pattern
return style
def create(filename,list_pass,list_fail,listids,listnames,listkeys,listconeents,listurls,listfangshis,listqiwangs,list_json,listrelust):
filepath = open(r'.\config\test_report.yaml', encoding='utf-8')
file_config = yaml.load(filepath)
file = Workbook(filename)
table = file.add_sheet('测试结果',cell_overwrite_ok=True)
style=yangshi1()
for i in range(0, 7):
table.col(i).width = 380*20
style1=yangshi2()
table.write_merge(0,0,0,6,'测试报告',style=style)
table.write_merge(1,1,0,6,'',style=style)
table.write_merge(2,3,0,6,'测试详情',style=style1)
table.write(4,0,'项目名称',style=style1)
table.write(5,0,'接口版本',style=style1)
table.write(6,0,'提测时间',style=style1)
table.write(7,0,'提测人',style=style1)
table.write(4,2,'测试人',style=style1)
table.write(5,2,'测试时间',style=style1)
table.write(6,2,'审核人',style=style1)
table.write(4,4,'通过',style=style1)
table.write(5,4,'失败',style=style1)
table.write(6,4,'成功率',style=style1)
table.write(4, 1, (file_config['projectname']),style=style1)
table.write(5, 1, file_config['interfaceVersion'],style=style1)
table.write(6, 1, file_config['tijiao_time'],style=style1)
table.write(7, 1, file_config['tijiao_person'],style=style1)
table.write(4, 3, file_config['ceshi_person'],style=style1)
table.write(5, 3, file_config['ceshi_time'],style=style1)
table.write(6, 3, file_config['shenhename'],style=style1)
table.write(4, 5, (list_pass), style=style1)
table.write(5, 5, (list_fail), style=style1)
table.write(6, 5, ('%.2f%%'%((list_pass)/(len(listrelust)))), style=style1)
table1 = file.add_sheet('测试详情',cell_overwrite_ok=True)
table1.write_merge(0,0,0,8,'测试详情',style=style)
for i in range(0, 8):
table1.col(i).width = 400*20
table1.write(1,0,'用例ID',style=yangshi3())
table1.write(1,1,'用例名字',style=yangshi3())
table1.write(1,2,'key',style=yangshi3())
table1.write(1,3,'请求内容',style=yangshi3())
table1.write(1,4,' url',style=yangshi3())
table1.write(1,5,'请求方式',style=yangshi3())
table1.write(1,6,'预期',style=yangshi3())
table1.write(1,7,'实际返回',style=yangshi3())
table1.write(1,8,'结果',style=yangshi3())
for i in range(len(listids)):
table1.write(i+1, 0, listids[i],style=yangshi3())
table1.write(i+1, 1, listnames[i],style=yangshi3())
table1.write(i+1, 2, listkeys[i],style=yangshi3())
table1.write(i+1, 3, listconeents[i],style=yangshi3())
table1.write(i+1, 4, listurls[i],style=yangshi3())
table1.write(i+1, 5, listfangshis[i],style=yangshi3())
table1.write(i+1, 6, listqiwangs[i],style=yangshi3())
table1.write(i+1, 7, str(list_json[i]),style=yangshi3())
table1.write(i+1, 8, listrelust[i], style=yangshique(listrelust[i]))
file.save(filename)

View File

@@ -1,36 +1,9 @@
# 接口测试框架基于json格式、http协议dubbo协议请求,python3,不兼容python2.x版本
##  java实现版本https://github.com/liwanlei/java_jiekou
# 接口测试框架基于json格式、http请求,python3,不兼容python2.x版本
## 注现在基于Excel文件管理测试用例基本实现,)
# 2018-9-14版本修改
### 1.失败用例重试功能,失败用例可以重试,重试次数可配置
### 2.去掉重复的功能
### 3.基础url可以在config配置只需要写api
# 2018-3-13版本修改
### 原来的测试报告更加详细的展示错误类型,对部分代码进行了优化,断言结果返回更加详细,更快的定位测试问题
## (目前在部分window上会出现FileNotFoundError [Errno 2] No such file or directory这个bug是路径过长,解决方案为吧log日志放在当前目录或者修改动态生成的文件的名字给了第一种方式测试日志放在当前目录
## qq交流群194704520  一群 683894834 二群
# 个人公众号![Alt text](https://github.com/liwanlei/jiekou-python3/blob/master/img/weixin.png)
## qq交流群194704520  
### 使用的库 requests绝大部分是基于Python原有的库进行的这样简单方便
# 友情推荐本人其他开源代码:
# 1.python接口测试平台版本!https://github.com/liwanlei/FXTest
# 2.python app自动化测试平台版本https://github.com/liwanlei/UFATestPlan
# 3.python+flask 做后台实现微信小程序https://github.com/liwanlei/webchat_app
### 使用脚本参数分离等思想,尽可能降低代码的耦合度。
# 2017-11-1版本修改
## 引入ddt数据驱动和BSTestRunner并且测试过程使用python的unittest库运行可以使用run_new来运行测试新的运行更加简单对预期结果进行了自定义
## 并且对预期结果的自定义格式进行转换,升级后的接口测试框架提供了两套的运行模式,一套是封装后基于自定义的断言格式的接口测试的框架,比较简单粗糙,但是
## 定义的报告更加具有代表性一套是封装好完全基于python库的接口测试。使用起来简单可以供大家选择新增加测试用例格式为ddt_case.py的格式。
# 运行后的测试报告如下
![Alt text](https://github.com/liwanlei/jiekou-python3/blob/master/img/%E6%96%B0%E7%89%88%E6%9C%AC%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.png)
# log日志
![Alt text](https://github.com/liwanlei/jiekou-python3/blob/master/img/xinbanbenlog.png)
# 新增后可以提供两个入口让供你选择,
## 一自定义断言方式自定义测试报告提供Excelhtml格式报告均为自定义。
## 二引用unittestddt和BSTestRunner等让测试用例更加简单明了代码更加简洁。通俗易懂且使用更多成熟的框架。
# ---------------旧版本内容---------
# 首先我们来看下我们的目录
##
![Alt text](https://github.com/liwanlei/jiekou-python3/blob/master/img/xiangmujiegoutu.png)
@@ -42,6 +15,7 @@
### 5.report 存放测试报告,
### 6.run_excel_re.py/run_html.py 主运行文件。运行后可以生成相应的测试报告
##
## 产生的html测试报告如下
![Alt text](https://github.com/liwanlei/jiekou/blob/master/img/cebaogaotu.png)
##
@@ -52,3 +26,6 @@
![Alt text](https://github.com/liwanlei/jiekou/blob/master/img/excel2.png)
### 现在的测试结构更加完整最新的一次提交增加了log日志的展示使功能更加完善log日志在控制台展示如下对目录进行优化
![Alt text](https://github.com/liwanlei/jiekou/blob/master/img/log.png)

4
config/email.yaml Normal file
View File

@@ -0,0 +1,4 @@
foremail: '952943386@qq.com'
password: "zzaikjtenujtbaif"
toeamil: "leileili126@163.com,952943386@qq.com"
title: "测试报告"

7
config/test_report.yaml Normal file
View File

@@ -0,0 +1,7 @@
projectname: '图灵'
interfaceVersion: '1.0.1'
tijiao_time: 2017-3-12
tijiao_person: 小仓娃
ceshi_person: leizibeijing
ceshi_time: 2017-4-13
shenhename: 雷子

View File

@@ -0,0 +1,24 @@
[2017-10-16 20:54:46.439386] INFO: jiekou: 当前模块 requests封装
[2017-10-16 20:54:46.900412] INFO: jiekou: 当前模块 解析测试用例文件
[2017-10-16 20:54:47.323436] INFO: jiekou: 当前模块 解析测试用例文件
[2017-10-16 20:54:47.332437] INFO: jiekou: 当前模块 测试
[2017-10-16 20:54:47.554450] INFO: jiekou: inputdata> 参数:sasa, url:http://www.tuling123.com/openapi/api ,返回:{'code': 40001, 'text': '亲爱的key不对哦。'},预期:code=40001
[2017-10-16 20:54:47.556450] INFO: jiekou: 当前模块 断言测试结果
[2017-10-16 20:54:47.654455] INFO: jiekou: inputdata> 参数:, url:http://www.tuling123.com/openapi/api
,返回:{'code': 40002, 'text': '有啥事吗?'},预期:code=40002
[2017-10-16 20:54:47.656455] INFO: jiekou: 当前模块 断言测试结果
[2017-10-16 20:54:48.161484] INFO: jiekou: inputdata> 参数:, url:https://api.douban.com/v2/photo/:id ,返回:{'msg': 'uri_not_found', 'code': 1001, 'request': 'POST /v2/photo/:id'},预期:code=1001&msg=uri_not_found
[2017-10-16 20:54:48.163484] INFO: jiekou: 当前模块 断言测试结果
[2017-10-16 20:54:48.230488] INFO: jiekou: 当前模块 保存测试结果
[2017-10-16 20:54:56.272948] INFO: jiekou: 当前模块 requests封装
[2017-10-16 20:54:56.295950] INFO: jiekou: 当前模块 解析测试用例文件
[2017-10-16 20:54:56.323951] INFO: jiekou: 当前模块 解析测试用例文件
[2017-10-16 20:54:56.330952] INFO: jiekou: 当前模块 测试
[2017-10-16 20:54:56.548964] INFO: jiekou: inputdata> 参数:sasa, url:http://www.tuling123.com/openapi/api ,返回:{'code': 40001, 'text': '亲爱的key不对哦。'},预期:code=40001
[2017-10-16 20:54:56.548964] INFO: jiekou: 当前模块 断言测试结果
[2017-10-16 20:54:56.636969] INFO: jiekou: inputdata> 参数:, url:http://www.tuling123.com/openapi/api
,返回:{'code': 40002, 'text': '有些话,难以说出口?'},预期:code=40002
[2017-10-16 20:54:56.638969] INFO: jiekou: 当前模块 断言测试结果
[2017-10-16 20:54:56.844981] INFO: jiekou: inputdata> 参数:, url:https://api.douban.com/v2/photo/:id ,返回:{'msg': 'uri_not_found', 'code': 1001, 'request': 'POST /v2/photo/:id'},预期:code=1001&msg=uri_not_found
[2017-10-16 20:54:56.846981] INFO: jiekou: 当前模块 断言测试结果
[2017-10-16 20:54:56.888984] INFO: jiekou: 当前模块 保存测试结果

View File

@@ -0,0 +1,284 @@
[2017-11-01 10:06:23.188881] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:06:23.264885] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:06:23.264885] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:06:23.278886] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:06:23.278886] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:06:23.278886] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:06:23.311888] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:06:23.311888] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:06:23.312888] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:06:23.313888] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:06:23.313888] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:06:23.313888] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:06:23.343890] INFO: jiekou: 返回结果:{'code': 40002, 'text': '有啥事吗?'}
[2017-11-01 10:06:23.343890] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:06:23.344890] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:06:23.344890] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:06:23.344890] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式GET
[2017-11-01 10:06:23.344890] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式None
[2017-11-01 10:06:23.344890] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:07:06.760373] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:07:06.838377] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:07:06.838377] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:07:06.852378] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:07:06.853378] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:07:06.853378] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:07:06.886380] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:07:06.886380] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:07:06.886380] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:07:06.887380] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:07:06.887380] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:07:06.887380] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:07:06.920382] INFO: jiekou: 返回结果:{'code': 40002, 'text': '此时无声胜有声?'}
[2017-11-01 10:07:06.920382] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:07:06.921382] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:07:06.921382] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:07:06.921382] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式GET
[2017-11-01 10:07:06.921382] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式None
[2017-11-01 10:07:06.921382] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:07:20.637167] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:07:20.736172] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:07:20.737172] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:07:20.749173] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:07:20.749173] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:07:20.750173] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:07:20.789175] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:07:20.789175] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:07:24.632395] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:07:24.732401] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:07:24.733401] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:07:24.745401] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:07:24.746402] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:07:24.746402] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:07:24.785404] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:07:24.785404] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:07:53.710058] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:07:53.714058] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:07:53.715058] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:07:53.715058] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:07:53.748060] INFO: jiekou: 返回结果:{'code': 40002, 'text': '干哈呀?'}
[2017-11-01 10:07:53.749060] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:07:56.700229] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:07:56.801235] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:07:56.801235] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:07:56.813236] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:07:56.814236] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:07:56.814236] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:07:56.849238] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:07:56.849238] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:08:04.610682] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:08:04.689686] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:08:04.689686] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:08:04.704687] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:08:04.704687] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:08:04.704687] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:08:04.738689] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:08:04.738689] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:08:04.738689] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:08:04.740689] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:08:04.740689] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:08:04.740689] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:08:04.776691] INFO: jiekou: 返回结果:{'code': 40002, 'text': '有啥事吗?'}
[2017-11-01 10:08:04.776691] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:08:04.777691] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:08:04.777691] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:08:04.778691] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式GET
[2017-11-01 10:08:04.778691] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式None
[2017-11-01 10:08:04.778691] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:20:30.384337] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:20:30.459342] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:20:30.459342] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:20:30.474343] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:20:30.474343] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:20:30.474343] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:20:30.513345] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:20:30.513345] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:20:30.514345] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:20:30.515345] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:20:30.515345] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:20:30.515345] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:20:30.544347] INFO: jiekou: 返回结果:{'code': 40002, 'text': '你想说什么就直说,不用藏在心里哈~'}
[2017-11-01 10:20:30.544347] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:20:30.544347] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:20:30.545347] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:20:30.545347] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式GET
[2017-11-01 10:20:30.545347] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式None
[2017-11-01 10:20:30.545347] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:21:01.846137] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:21:01.921141] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:21:01.921141] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:21:01.936142] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:21:01.936142] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:21:01.936142] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:21:01.972144] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:21:01.972144] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:21:01.973144] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:21:01.973144] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:21:01.974144] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:21:01.974144] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:21:02.003146] INFO: jiekou: 返回结果:{'code': 40002, 'text': 'what?'}
[2017-11-01 10:21:02.003146] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:21:02.004146] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:21:02.005146] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:21:02.005146] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式GET
[2017-11-01 10:21:02.005146] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式None
[2017-11-01 10:21:02.006146] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:21:44.590582] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:21:44.667586] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:21:44.667586] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:21:44.682587] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:21:44.682587] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:21:44.683587] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:21:44.717589] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:21:44.718589] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:21:44.718589] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:21:44.719589] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:21:44.719589] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:21:44.719589] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:21:44.755591] INFO: jiekou: 返回结果:{'code': 40002, 'text': '你想和我说什么呢?'}
[2017-11-01 10:21:44.755591] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:21:44.756591] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:21:44.757591] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:21:44.757591] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式GET
[2017-11-01 10:21:44.757591] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式None
[2017-11-01 10:21:44.757591] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:23:21.727138] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:23:21.806142] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:23:21.806142] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:23:21.821143] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:23:21.821143] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:23:21.821143] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:23:21.855145] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:23:21.855145] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:23:21.855145] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:23:21.856145] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:23:21.856145] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:23:21.857145] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:23:21.886147] INFO: jiekou: 返回结果:{'code': 40002, 'text': 'what?'}
[2017-11-01 10:23:21.886147] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:23:21.886147] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:23:21.886147] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:23:21.887147] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式GET
[2017-11-01 10:23:21.887147] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式None
[2017-11-01 10:23:21.887147] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:23:48.852689] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:23:48.928694] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:23:48.928694] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:23:48.943694] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:23:48.943694] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:23:48.943694] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:23:48.981697] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:23:48.981697] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:23:48.981697] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:23:48.982697] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:23:48.983697] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:23:48.983697] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:23:49.021699] INFO: jiekou: 返回结果:{'code': 40002, 'text': '干哈呀?'}
[2017-11-01 10:23:49.021699] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:23:49.021699] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:23:49.022699] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:23:49.022699] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式GET
[2017-11-01 10:23:49.022699] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式None
[2017-11-01 10:23:49.022699] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:24:24.567732] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:24:24.644736] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:24:24.644736] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:24:24.659737] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:24:24.659737] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:24:24.659737] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:24:24.694739] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:24:24.694739] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:24:24.694739] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:24:24.696739] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:24:24.696739] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:24:24.696739] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:24:24.728741] INFO: jiekou: 返回结果:{'code': 40002, 'text': '干啥呀?'}
[2017-11-01 10:24:24.728741] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:24:24.728741] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:24:24.729741] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:24:24.729741] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式GET
[2017-11-01 10:24:24.729741] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式None
[2017-11-01 10:24:24.729741] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:24:31.959155] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:24:32.040159] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:24:32.040159] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:24:32.054160] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:24:32.055160] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:24:32.055160] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:24:32.089162] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:24:32.090162] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:24:32.090162] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:24:32.091162] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:24:32.091162] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:24:32.091162] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:24:32.126164] INFO: jiekou: 返回结果:{'code': 40002, 'text': '有些话,难以说出口?'}
[2017-11-01 10:24:32.127164] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:24:32.127164] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:24:32.127164] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:24:32.127164] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式GET
[2017-11-01 10:24:32.128164] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式None
[2017-11-01 10:24:32.128164] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:24:40.651652] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:24:40.728656] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:24:40.728656] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:24:40.743657] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:24:40.743657] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:24:40.743657] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:24:40.777659] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:24:40.777659] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:24:40.777659] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:24:40.778659] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:24:40.778659] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:24:40.779659] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:24:40.814661] INFO: jiekou: 返回结果:{'code': 40002, 'text': '干啥呀?'}
[2017-11-01 10:24:40.815661] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:24:40.815661] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:24:40.816661] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:24:40.816661] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式GET
[2017-11-01 10:24:40.816661] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式None
[2017-11-01 10:24:40.817661] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:25:40.019048] INFO: jiekou: 当前模块 requests封装
[2017-11-01 10:25:40.093052] INFO: jiekou: 当前模块 生成数据驱动所用数据
[2017-11-01 10:25:40.094052] INFO: jiekou: 当前模块 解析测试用例文件
[2017-11-01 10:25:40.109053] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:25:40.109053] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:25:40.109053] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:25:40.143055] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:25:40.143055] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:25:40.144055] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:25:40.144055] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:25:40.144055] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:25:40.144055] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:25:40.177057] INFO: jiekou: 返回结果:{'code': 40002, 'text': 'what?'}
[2017-11-01 10:25:40.177057] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:25:40.178057] INFO: jiekou: 测试用例执行完毕
[2017-11-01 10:25:40.178057] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:25:40.178057] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式GET
[2017-11-01 10:25:40.178057] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式None
[2017-11-01 10:25:40.178057] INFO: jiekou: 测试用例执行完毕

2
result.txt Normal file
View File

@@ -0,0 +1,2 @@
记录测试时间测试总数pass数量失败数量 用‘=’拼接
2017-10-16 20:54:56.323951=3=3=0

32
run_excel_re.py Normal file
View File

@@ -0,0 +1,32 @@
# encoding: utf-8
"""
@author: lileilei
@file: run_excel_re.py
@time: 2017/6/9 12:45
"""
from Public.pyreport_excel import create
import os,threading,datetime
from testCase.case import testinterface
from Public.emmail import sendemali
from Public.get_excel import datacel
from Public.create_report import save_result
def start():
starttime=datetime.datetime.now()
m=datetime.datetime.now().strftime("%Y%m%d")
basdir = os.path.abspath(os.path.dirname(__file__))
listid,listkey,listconeent,listurl,listfangshi,listqiwang,listname=datacel()
listrelust,list_fail, list_pass, list_json =testinterface()
filepath = os.path.join(basdir + '\\test_Report\\%s-result.xls'%m)
if os.path.exists(filepath) is False:
os.system(r'touch %s' % filepath)
save_result(starttime, len(listrelust), ((list_pass)), list_fail)
create(filename=filepath,list_fail=list_fail, list_pass=list_pass, list_json=list_json, listurls=listurl,
listkeys=listkey,listconeents=listconeent, listfangshis=listfangshi, listqiwangs=listqiwang,
listids=listid, listrelust=listrelust, listnames=listname)
def teThread():
st = datetime.datetime.now()
m = threading.Thread(target=start, args=())
m.run()
end = datetime.datetime.now()
if __name__ == '__main__':
teThread()

34
run_html.py Normal file
View File

@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# @Author : leizi
import unittest,os,datetime,time
from testCase.case import testinterface
from Public.py_Html import createHtml
from Public.get_excel import datacel
from Public.emmail import sendemali
from Public.create_report import save_result
import threading
def stast():
starttime=datetime.datetime.now()
day= time.strftime("%Y%m%d%H%M", time.localtime(time.time()))
basdir=os.path.abspath(os.path.dirname(__file__))
listid, listkey, listconeent, listurl, listfangshi, listqiwang, listname = datacel()
listrelust, list_fail, list_pass, list_json = testinterface()
filepath =os.path.join(basdir+'\\test_Report\\%s-result.html'%day)
if os.path.exists(filepath) is False:
os.system(r'touch %s' % filepath)
save_result(starttime,len(listrelust),((list_pass)),list_fail)
endtime=datetime.datetime.now()
createHtml(titles='接口测试报告',filepath=filepath,starttime=starttime,
endtime=endtime,passge=list_pass,fail=list_fail,
id=listid,name=listname,key=listkey,coneent=listconeent,url=listurl,meth=listfangshi,
yuqi=listqiwang,json=list_json,relusts=listrelust)
# sendemali(filepath)
def tThread():
m=threading.Thread(target=stast,args=())
m.run()
if __name__ == '__main__':
tThread()

15
run_new.py Normal file
View File

@@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
# @Author : leizi
from testCase.ddt_case import MyTest
import unittest,time,os
from Public import BSTestRunner
if __name__=='__main__':
suite = unittest.TestSuite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(MyTest))
now = time.strftime('%Y-%m%d', time.localtime(time.time()))
basedir = os.path.abspath(os.path.dirname(__file__))
file_dir = os.path.join(basedir, 'test_Report')
file = os.path.join(file_dir, (now + '.html'))
re_open = open(file, 'wb')
runner = BSTestRunner.BSTestRunner(stream=re_open, title='接口测试报告', description='测试结果')
runner.run(suite)

20
testCase/ddt_case.py Normal file
View File

@@ -0,0 +1,20 @@
from Interface.testFengzhuang import TestApi
from Public.get_excel import datacel,makedata
from Public.log import LOG,logger
from Public.panduan import assertre
import ddt,unittest,time,os
data_test=makedata()
@ddt.ddt
class MyTest(unittest.TestCase):
def setUp(self):
LOG.info('测试用例开始执行')
def tearDown(self):
LOG.info('测试用例执行完毕')
@ddt.data(*data_test)
def test_api(self,data_test):
api = TestApi(url=data_test['url'], key=data_test['key'], connent=data_test['coneent'], fangshi=data_test['fangshi'])
LOG.info('输入参数url:%s,key:%s,参数:%s,请求方式:%s'%(data_test['url'],data_test['key'],data_test['coneent'], LOG.info('输入参数url:%s,key:%s,参数:%s,请求方式:%s'%(data_test['url'],data_test['key'],data_test['coneent'],data_test['fangshi']))))
apijson = api.getJson()
LOG.info('返回结果:%s'%apijson)
qingwang=assertre(asserqingwang=data_test['qiwang'])
self.assertNotEqual(dict(qingwang),dict(apijson),msg='预期和返回不一致')

306
test_Report/2017-1101.html Normal file
View File

@@ -0,0 +1,306 @@
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>接口测试报告</title>
<meta name="generator" content="BSTestRunner 0.8.4"/>
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
<style type="text/css" media="screen">
/* -- css div popup ------------------------------------------------------------------------ */
.popup_window {
display: none;
position: relative;
left: 0px;
top: 0px;
/*border: solid #627173 1px; */
padding: 10px;
background-color: #99CCFF;
font-family: "Lucida Console", "Courier New", Courier, monospace;
text-align: left;
font-size: 10pt;
width: 1200px;
}
/* -- report ------------------------------------------------------------------------ */
#show_detail_line .label {
font-size: 85%;
cursor: pointer;
}
#show_detail_line {
margin: 2em auto 1em auto;
}
#total_row { font-weight: bold; }
.hiddenRow { display: none; }
.testcase { margin-left: 2em; }
</style>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="http://cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="http://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<script language="javascript" type="text/javascript"><!--
output_list = Array();
/* level - 0:Summary; 1:Failed; 2:All */
function showCase(level) {
trs = document.getElementsByTagName("tr");
for (var i = 0; i < trs.length; i++) {
tr = trs[i];
id = tr.id;
if (id.substr(0,2) == 'ft') {
if (level < 1) {
tr.className = 'hiddenRow';
}
else {
tr.className = '';
}
}
if (id.substr(0,2) == 'pt') {
if (level > 1) {
tr.className = '';
}
else {
tr.className = 'hiddenRow';
}
}
}
}
function showClassDetail(cid, count) {
var id_list = Array(count);
var toHide = 1;
for (var i = 0; i < count; i++) {
tid0 = 't' + cid.substr(1) + '.' + (i+1);
tid = 'f' + tid0;
tr = document.getElementById(tid);
if (!tr) {
tid = 'p' + tid0;
tr = document.getElementById(tid);
}
id_list[i] = tid;
if (tr.className) {
toHide = 0;
}
}
for (var i = 0; i < count; i++) {
tid = id_list[i];
if (toHide) {
document.getElementById('div_'+tid).style.display = 'none'
document.getElementById(tid).className = 'hiddenRow';
}
else {
document.getElementById(tid).className = '';
}
}
}
function showTestDetail(div_id){
var details_div = document.getElementById(div_id)
var displayState = details_div.style.display
// alert(displayState)
if (displayState != 'block' ) {
displayState = 'block'
details_div.style.display = 'block'
}
else {
details_div.style.display = 'none'
}
}
function html_escape(s) {
s = s.replace(/&/g,'&amp;');
s = s.replace(/</g,'&lt;');
s = s.replace(/>/g,'&gt;');
return s;
}
/* obsoleted by detail in <div>
function showOutput(id, name) {
var w = window.open("", //url
name,
"resizable,scrollbars,status,width=800,height=450");
d = w.document;
d.write("<pre>");
d.write(html_escape(output_list[id]));
d.write("\n");
d.write("<a href='javascript:window.close()'>close</a>\n");
d.write("</pre>\n");
d.close();
}
*/
--></script>
<div class="container">
<div class='heading'>
<h1>接口测试报告</h1>
<p><strong>Start Time:</strong> 2017-11-01 10:25:40</p>
<p><strong>Duration:</strong> 0:00:00.070004</p>
<p><strong>Status:</strong> <span class="text text-success">Pass <strong>2</strong></span> <span class="text text-warning">Error <strong>1</strong></span></p>
<p class='description'>测试结果</p>
</div>
<p id='show_detail_line'>
<span class="label label-primary" onclick="showCase(0)">Summary</span>
<span class="label label-danger" onclick="showCase(1)">Failed</span>
<span class="label label-default" onclick="showCase(2)">All</span>
</p>
<table id='result_table' class="table">
<thead>
<tr id='header_row'>
<th>Test Group/Test case</td>
<th>Count</td>
<th>Pass</td>
<th>Fail</td>
<th>Error</td>
<th>View</td>
</tr>
</thead>
<tbody>
<tr class='text text-warning'>
<td>testCase.ddt_case.MyTest</td>
<td>3</td>
<td>2</td>
<td>0</td>
<td>1</td>
<td><a class="btn btn-xs btn-primary"href="javascript:showClassDetail('c1',3)">Detail</a></td>
</tr>
<tr id='pt1.1' class='hiddenRow'>
<td class='text text-success'><div class='testcase'>test_api_1</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link btn btn-xs btn-default" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.1')" >
pass</a>
<div id='div_pt1.1' class="popup_window">
<div style='text-align: right;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.1').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.1: [2017-11-01 10:25:40.109053] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:25:40.109053] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式POST
[2017-11-01 10:25:40.109053] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api,key:aaaa,参数:sasa,请求方式None
[2017-11-01 10:25:40.143055] INFO: jiekou: 返回结果:{'code': 40001, 'text': '亲爱的key不对哦。'}
[2017-11-01 10:25:40.143055] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:25:40.144055] INFO: jiekou: 测试用例执行完毕
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='pt1.2' class='hiddenRow'>
<td class='text text-success'><div class='testcase'>test_api_2</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link btn btn-xs btn-default" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.2')" >
pass</a>
<div id='div_pt1.2' class="popup_window">
<div style='text-align: right;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_pt1.2').style.display = 'none' " >
[x]</a>
</div>
<pre>
pt1.2: [2017-11-01 10:25:40.144055] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:25:40.144055] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式POST
[2017-11-01 10:25:40.144055] INFO: jiekou: 输入参数url:http://www.tuling123.com/openapi/api
,key:dfeb1cc8125943d29764a2f2f5c33739,参数:,请求方式None
[2017-11-01 10:25:40.177057] INFO: jiekou: 返回结果:{'code': 40002, 'text': 'what?'}
[2017-11-01 10:25:40.177057] INFO: jiekou: 当前模块 断言测试结果
[2017-11-01 10:25:40.178057] INFO: jiekou: 测试用例执行完毕
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
<tr id='ft1.3' class='none'>
<td class='text text-warning'><div class='testcase'>test_api_3</div></td>
<td colspan='5' align='center'>
<!--css div popup start-->
<a class="popup_link btn btn-xs btn-default" onfocus='this.blur();' href="javascript:showTestDetail('div_ft1.3')" >
error</a>
<div id='div_ft1.3' class="popup_window">
<div style='text-align: right;cursor:pointer'>
<a onfocus='this.blur();' onclick="document.getElementById('div_ft1.3').style.display = 'none' " >
[x]</a>
</div>
<pre>
ft1.3: [2017-11-01 10:25:40.178057] INFO: jiekou: 测试用例开始执行
[2017-11-01 10:25:40.178057] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式GET
[2017-11-01 10:25:40.178057] INFO: jiekou: 输入参数url:https://api.douban.com/v2/photo/:id,key:,参数:,请求方式None
[2017-11-01 10:25:40.178057] INFO: jiekou: 测试用例执行完毕
Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Roaming\Python\Python36\site-packages\ddt.py", line 139, in wrapper
return func(self, *args, **kwargs)
File "C:\Users\Administrator\Desktop\jiekou-python3\testCase\ddt_case.py", line 17, in test_api
apijson = api.getJson()
File "C:\Users\Administrator\Desktop\jiekou-python3\Interface\testFengzhuang.py", line 27, in getJson
json_data = self.testapi()
File "C:\Users\Administrator\Desktop\jiekou-python3\Interface\testFengzhuang.py", line 21, in testapi
response = reques.get(self.url,self.parem)
TypeError: get() takes 2 positional arguments but 3 were given
</pre>
</div>
<!--css div popup end-->
</td>
</tr>
</tbody>
<tfoot>
<tr id='total_row'>
<td>Total</td>
<td>3</td>
<td class="text text-success">2</td>
<td class="text text-danger">0</td>
<td class="text text-warning">1</td>
<td>&nbsp;</td>
</tr>
</tfoot>
</table>
<div id='ending'>&nbsp;</div>
</div>
</body>
</html>

Binary file not shown.

View File

@@ -0,0 +1,86 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>接口测试报告</title>
<style type="text/css">
td{ width:40px; height:50px;}
</style>
</head>
<body>
<div style='width: 1170px;margin-left: 15%'>
<h1>接口测试的结果</h1>
<p><strong>开始时间:</strong> 2017-10-16 20:54:47.323436</p>
<p><strong>结束时间:</strong> 2017-10-16 20:54:48.234489</p>
<p><strong>耗时:</strong> 0:00:00.911053</p>
<p><strong>结果:</strong>
<span >Pass: <strong >3</strong>
Fail: <strong >0</strong>
</span></p>
<p ><strong>测试详情如下</strong></p> </div>
<p>&nbsp;</p>
<table border='2'cellspacing='1' cellpadding='1' width='1100'align="center" >
<tr >
<td ><strong>用例ID&nbsp;</strong></td>
<td><strong>用例名字</strong></td>
<td><strong>key</strong></td>
<td><strong>请求内容</strong></td>
<td><strong>url</strong></td>
<td><strong>请求方式</strong></td>
<td><strong>预期</strong></td>
<td><strong>实际返回</strong></td>
<td><strong>结果</strong></td>
</tr>
<tr>
<td>1.0</td>
<td>图灵api接口</td>
<td>aaaa</td>
<td>sasa
</td>
<td>http://www.tuling123.com/openapi/api</td>
<td>POST</td>
<td>code=40001</td>
<td>{'code': 40001, 'text': '亲爱的key不对哦。'}</td>
<td bgcolor="green">pass</td>
</tr>
<tr>
<td>2.0</td>
<td>图灵api接口</td>
<td>dfeb1cc8125943d29764a2f2f5c33739</td>
<td>
</td>
<td>http://www.tuling123.com/openapi/api
</td>
<td>POST</td>
<td>code=40002</td>
<td>{'code': 40002, 'text': '有啥事吗?'}</td>
<td bgcolor="green">pass</td>
</tr>
<tr>
<td>3.0</td>
<td>豆瓣api</td>
<td></td>
<td>
</td>
<td>https://api.douban.com/v2/photo/:id</td>
<td>GET</td>
<td>code=1001&msg=uri_not_found</td>
<td>{'msg': 'uri_not_found', 'code': 1001, 'request': 'POST /v2/photo/:id'}</td>
<td bgcolor="green">pass</td>
</tr>
</table>
</body>
</html>

BIN
test_case/case.xlsx Normal file

Binary file not shown.