整个项目分层如图

然后上代码

#data_test.py
from openpyxl import load_workbook
import json
import os class Date_test():
filepath = os.path.dirname(os.path.dirname(__file__))
def __init__(self):
self.case_id = None
self.url = None
self.data = None
self.Method = None
self.expected = None
self.sheet_name = None # 输出字典
def Date_test_list(self):
"""
配置文件读取模块
:return:
"""
wb = load_workbook(Date_test().filepath + "\project_data\cases.xlsx")
list = []
for j in wb.get_sheet_names():
ws = wb[j]
url = 'http://localhost/api'
for i in range(2,ws.max_row + 1):
result = {}
result["case_id"] = ws.cell(i, 1).value
result["url"] = url + ws.cell(i,3).value
result["data"] = ws.cell(i,4).value
result["Method"] = ws.cell(i,5).value
result["expected"] = ws.cell(i,6).value
result["sheet_name"] = j
list.append(result)
wb.close()
return list
#输出对象
def Date_test_xlsx(self):
wb = load_workbook(Date_test().filepath + "\project_data\cases.xlsx")
list = []
for j in wb.get_sheet_names():
ws = wb[j]
url = 'http://localhost/api'
for i in range(2,ws.max_row + 1):
case = Date_test()
case.case_id = ws.cell(i, 1).value
case.url = url + ws.cell(i,3).value
case.data = ws.cell(i,4).value
case.Method = ws.cell(i,5).value
case.expected = ws.cell(i,6).value
case.sheet_name = j
list.append(case)
wb.close()
return list def Date_test_write(self, test_function, x,sheet_name):
"""
运行结果写入模块
:param test_function:
:param test_text:
:param x:
:return:
"""
Dict = {}
wb = load_workbook(Date_test().filepath+"\project_data\cases.xlsx")
ws = wb[sheet_name]
test_function = json.loads(test_function)
Dict["status"] = test_function["status"]
Dict["code"] = test_function["code"]
Dict["msg"] = test_function["msg"]
ws.cell(x+1, 7).value = str(Dict)
if ws.cell(x+1,6).value == ws.cell(x+1, 7).value:
ws.cell(x+1, 8).value = "PASS"
else:
ws.cell(x+1, 8).value = "FAIL"
ws.cell(x+1, 9).value = str(test_function["data"])
wb.save(Date_test().filepath+"\project_data\cases.xlsx")
wb.close() @staticmethod
def Email_Date():
username = "username"
password = "password"
To_Email = "To_Email_1,To_Email_2"
return username, password, To_Email
#test_case.py
from project_data.data_test import *
from project_driver.http_pg import *
import unittest
import json
from ddt import data,unpack,ddt @ddt
class test_case(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.http_test = HTTP_CONSOLE() # 使用字典传参
@data(*Date_test().Date_test_list())
@unpack
def test_case_1(self,case_id,url,data,Method,expected,sheet_name):
result = self.http_test.http_console(Method=Method, url=url, parameter=eval(data))
Date_test().Date_test_write(test_function=result.text, x=case_id,sheet_name=sheet_name)
self.assertEqual(json.loads(result.text)["status"], eval(expected)["status"])
self.assertEqual(json.loads(result.text)["code"], eval(expected)["code"])
self.assertEqual(json.loads(result.text)["msg"], eval(expected)["msg"])
# 使用对象传参
@data(*Date_test().Date_test_xlsx())
def test_case_2(self,test_data):
result = self.http_test.http_console(Method=test_data.Method, url=test_data.url, parameter=eval(test_data.data))
Date_test().Date_test_write(test_function=result.text, x=test_data.case_id,sheet_name=test_data.sheet_name)
self.assertEqual(json.loads(result.text)["status"], eval(test_data.expected)["status"])
self.assertEqual(json.loads(result.text)["code"], eval(test_data.expected)["code"])
self.assertEqual(json.loads(result.text)["msg"], eval(test_data.expected)["msg"]) @classmethod
def tearDownClass(cls):
cls.http_test.close()
print("用例执行完毕") if __name__ == '__main__':
unittest.main()
#http_pg.py
import requests
class HTTP_CONSOLE():
def __init__(self):
self.session = requests.session()
def http_console(self, Method, url, parameter = None,json = None ,Cookies=None):
if parameter == None:
result = self.session.post(url=url, json=eval(json), cookies=Cookies)
else:
Method = Method.upper()
if Method == "GET":
result = self.session.get(url=url, params=parameter, cookies=Cookies)
elif Method == "POST":
result = self.session.post(url=url, data=parameter, cookies=Cookies)
else:
print("请求方式输入错误,目前仅支持POST/GET两种请求方式!") return result
#Email_console.py
import HTMLTestRunnerNew
from email.mime.text import MIMEText
from email.header import Header
import smtplib
import unittest
from project_data.data_test import *
from email.mime.multipart import MIMEMultipart class Email_Console():
def __init__(self):
self.username, self.password, self.To_Email = Date_test.Email_Date() def send_main(self, file_new):
"""
发送邮件方法
:param file_new:
:return:
"""
msg = MIMEMultipart("Emaik_TestText")
msg['Subject'] = Header('自动化测试报告', 'utf-8')
msg['From'] = self.username
msg['To'] = self.To_Email
with open(file_new, 'rb') as f:
mail_body = f.read()
msg.attach(MIMEText(mail_body, 'html', 'utf-8'))
# 添加附件result.html
with open("result.html", "rb") as f:
mail_attach = f.read()
att1 = MIMEText(mail_attach, 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="report_test.html"'
msg.attach(att1)
# 获取路径
filepath = Date_test().filepath + "\project_data\cases.xlsx"
# 添加附件cases.xlsx
with open(filepath, "rb") as f:
mail_attach = f.read()
att2 = MIMEText(mail_attach, 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename=filepath'
msg.attach(att2)
try:
smtp = smtplib.SMTP()
smtp.connect("smtp.163.com", 25)
smtp.login(self.username, self.password)
smtp.sendmail(self.username, self.To_Email.split(","), msg.as_string())
smtp.quit()
except Exception as e:
print("Send Email Failed!!!")
raise e def new_report(self, testreport):
"""
生成并查找查找最新测试报告方法
:param testreport:
:return:
"""
# 生成测试用例
fp = open("result.html", 'wb')
runner = HTMLTestRunnerNew.HTMLTestRunner(stream=fp, title='2019年4月11日前程贷接口测试报告', description='所有测试情况',
tester="桂马")
discove = unittest.defaultTestLoader.discover(".", pattern="test_*.py")
runner.run(discove)
fp.close()
# 查找测试用例
lists = os.listdir(testreport)
lists.sort(key=lambda fn: os.path.getmtime(testreport + "\\" + fn))
file_new = os.path.join(testreport, lists[-1])
print(file_new)
return file_new if __name__ == "__main__":
email_test = Email_Console()
file_path = email_test.new_report(os.getcwd()) # 查找新生的报告
email_test.send_main(file_new=file_path) # 调用发邮件模块(调用前需要修改data_test.py配置文件中email配置模块数据 )

然后配置文件的xlsx文件格式

注意点:

    1.用例的expected一栏,也就是预期结果一栏要注意参数是否有类似时间戳的不断变更的参数,然后根据这个参数的重要性来选择是添加还是删去

    2.返回值如果有json格式注意和预知结果格式的一致性,我这次就是在这里被绊了一下,单双引号要注意

    3.原本的用例格式没有最后一栏也就是result_data,但是这次用例涉及存取金额,所以我还是加了一行用来检查数据的正确性

    4.搬代码的朋友注意下我的配置文件中,邮件模块是没有写参数的,用的变量代替,所以要用的话要自己改一下

    5.setupclass和tearDownclass要配合@classmethod装饰器使用,是一次运行只执行一次的用法,要牢记,感觉以后会用不少次

    6.读取cases表也可以写成类属性,不写成字典形式,下一次更新我估计会把字典模式更换成类属性模式

后记: 

    1.可以添加表连接模块,添加sql语句栏,用作表查询结果断言

    2.result_data栏的写入可以优化一下,如果为None则不写入,否者写入产生变化的参数(最简单的方法是新增测试表栏,也可以新增一个数据库表单,建立关联关系,然后根据数据库表单查询并写入)

更新:

    1.更新用例从单表变更为多表,但是运行时的参数带入还待优化,现在的运行是一个表运行一次

    2.删除用例中的for循环,优化读取xlsx的模块方法Date_test_list

    3.更新对象传参

接口测试(二) 优化项目分层及cookies值带入的更多相关文章

  1. Tair LDB基于Prefixkey中期范围内查找性能优化项目总结

    "Tair LDB基于Prefixkey该范围内查找性能优化"该项目是仅一个月.这个月主要是熟悉项目..以下从几个方面总结下个人在该项目上所做的工作及自己的个人所得所感. 项目工作 ...

  2. 2018 Unite大会——《使用UPA工具优化项目》演讲实录

    2018年5月11日至13日,腾讯WeTest与Unity联合打造的移动游戏性能分析工具(Unity Performance Analysis,以下称为UPA)正式亮相2018 Unite大会,为Un ...

  3. 201871030139-于泽浩 实验二 个人项目D{0-1} KP

    201871030139-于泽浩 实验二 个人项目D{0-1} KP 项目 内容 课程班级博客连接 2018级卓越班 这个作业要求连接 软件工程个人项目 我的课程学习目标 (1)掌握软件项目个人开发流 ...

  4. 应用程序框架实战十六:DDD分层架构之值对象(介绍篇)

    前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持.本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分. 如果说你已经在使用DDD分层架构,但你却从来没有使 ...

  5. DDD分层架构之值对象(层超类型篇)

    DDD分层架构之值对象(层超类型篇) 上一篇介绍了值对象的基本概念,得到了一些朋友的支持,另外也有一些朋友提出了不同意见.这其实是很自然的事情,设计本来就充满了各种可能性,没有绝对正确的做法,只有更好 ...

  6. DDD分层架构之值对象(介绍篇)

    DDD分层架构之值对象(介绍篇) 前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持.本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分. 如果说你已经在使 ...

  7. 201871030125-王芬 实验二 个人项目-《D{0-1}问题》软件项目报告

    实验二 个人项目-<D{0-1}问题>软件项目报告 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 ...

  8. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  9. MVC5 网站开发之二 创建项目

    昨天对项目的思路大致理了一下,今天先把解决方案建立起来.整个解决包含Ninesky.Web.Ninesky.Core,Ninesky.DataLibrary等3个项目.Ninesky.Web是web应 ...

随机推荐

  1. 安装.net 服务时出现0x80131515错误的解决办法

    使用InstallUtil.exe安装一个用.NET写的Windows服务时,报错了,错误信息如下: Exception occurred while initializing the install ...

  2. python基础知识7---补充

    ''' 不可变:数字,字符串,元组 可变:列表,字典 原子:数字,字符串 容器:列表,元组,字典 直接访问:数字 顺序:字符串,列表,元组 映射访问:字典 ''' #一一对应 a,b,c,d,e='h ...

  3. 使用 JavaScript 拦截和跟踪浏览器中的 HTTP 请求

    HTTP 请求的拦截技术可以广泛地应用在反向代理.拦截 Ajax 通信.网页的在线翻译.网站改版重构等方面.而拦截根据位置可以分为服务器端和客户端两大类,客户端拦截借助 JavaScript 脚本技术 ...

  4. 转载:MySQL看这一篇就够了

    No.1 数据库概念 什么是数据库? 数据库就是一种特殊的文件,内部存储着需要的数据 RDBMS 所谓关系数据库,是建立在关系模型基础的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据 SQ ...

  5. ES timeout 的一些笔记

    首先解释下Timeout的作用: 比如,一个search,可能要10分钟才能搜完,那么,es就会等10分钟,直到结果出来.然而,在某些场景下,客户是等不了10分钟的.比如,淘宝搜东西的时候,客户宁可等 ...

  6. python-web自动化-Js-滚动条操作

    滚动条操作:当待操作的元素在页面可是区域外时,要将待操作的元素滚动到可视区域当中 步骤:1.先找要将要操作的元素element = driver.find_element_by_xxxx(" ...

  7. CUDA编程模型——组织并行线程3 (2D grid 1D block)

    当使用一个包含一维块的二维网格时,每个线程都只关注一个数据元素并且网格的第二个维数等于ny,如下图所示: 这可以看作是含有二维块的二维网格的特殊情况,其中块儿的第二个维数是1.因此,从块儿和线程索引到 ...

  8. The requested URL /xxxx.html was not found on this server

    The requested URL /xxxx.html was not found on this server 的原因是,Apache没有开启重写 apache 打开 httpd.conf 文件找 ...

  9. leetcode每日刷题计划-简单篇day10

    跳题,不熟悉的留到周末再做. 保持冷静,不信画饼. num 100 相同的树 Same Tree 做法可能不是特别简洁,注意一下.最后判断完子树以后,要确定根的数值是一样的 然后在isleaf的判定先 ...

  10. Tools:实现ping操作带时间戳【windows+linux】

    [windows下]: ping.vbs Dim args, flag, unsuccOut args="" otherout="" flag= If WScr ...