整个项目分层如图

然后上代码

#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. 窗口关闭时弹出内存不能为read

    出现这个错误的原因是:某个指针类型的变量或对象,其记录的内容不可用,但进程对其进行了访问.可能由于:指针类型的变量或对象未被赋值就被使用:或者已经被正常释放后,又被访问所致.由于是在结束进程时报这样的 ...

  2. 「Mobile Testing Summit China 2017」第三届中国移动互联网测试开发大会-讲师征集

    时至北京盛夏,一场由 TesterHome 主办的关于移动互联网测试技术的盛会正在紧锣密鼓的筹备中.只要你关注软件质量,热爱测试,期待学习,都欢迎你加入这次移动测试技术大会中和我们一起分享经验.探讨话 ...

  3. 微信小程序中的组件使用2

    需求    上面两个页面是同一个小程序的不同页面,两个页面中都是用到了label,有相似的地方,但是也有不同之处,这个时候,如果我们想要将这些label做出组件,然后复用,有该怎么做呢? 基础组件 首 ...

  4. Kong(v1.0.2)代理参考

    介绍 在本文中,我们将通过详细解释Kong的路由功能和内部工作原理来介绍它的代理功能. Kong公开了几个接口,可以通过两个配置属性进行调整: proxy_listen,它定义了一个地址/端口列表,K ...

  5. SfMLearner 记录

    2019年3月2日09:29:54 正在看SfMLearner的pytorch源码,意识到无监督的深度估计最重要的是利用实体的一致性 来建立loss. 对于一个不移动的物体,相机从一个pose到另一个 ...

  6. LeetCode【112. 路径总和】

    思路就是从根节点开始向下选节点,依次与sum比较大小,若小,则向下选左右节点其中一个,若大,则接下来判断是否是叶子节点,若是,则返回false 若不是,则上一步选另一节点,再将上述重新执行. 对于叶子 ...

  7. 微软 workflow 工作流总结2

    1.公共的状态机工作流 书签的设置 可以在判断模块中的action中赋值,因为在action中肯定要进入到下一个书签,所以可以在此给书签name赋值

  8. 学习笔记——Ubuntu下使用Docker包部署禅道任务管理系统

    写此文目的:利用搭建禅道环境联系Docker基本使用方法,加深对Docker容器的理解,Ubuntu下面才能原生运行Docker,因此选择了Ubuntu 1.下载禅道开源版 wget http://d ...

  9. sc.exe用法详解

    sc.exe是帮助开发 WindowsNT 服务的工具,这里我来说说如何使用好sc.exe. 我们打开命令提示符(以管理员身份运行): 输入sc delete ServiceName(服务名)  即可 ...

  10. java——collection总结

    Collection 来源于Java.util包,是非常实用常用的数据结构!!!!!字面意思就是容器.具体的继承实现关系如下图,先整体有个印象,再依次介绍各个部分的方法,注意事项,以及应用场景.   ...