整个项目分层如图

然后上代码

#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. 虚拟机中的linux系统文件突然全部变成只读的问题

    当宿主系统和虚拟机的IO都比较繁忙时,虚拟机的IO请求得不到及时的响应.虚拟机Linux不知道自己运行在虚拟机里面,会认为是磁盘IO错误,为了保护磁盘数据会remount分区为只读. 这时候如果只是对 ...

  2. listener.starting()源码探究

    容器启动时,监听器调用starting方法,本质是找到匹配的监听器,广播事件,开始监听 上节对寻找匹配监听器做了分析,其是这个过程比较重要的部分,本文开始监听,反而不是那么复杂,如下: 找匹配监听器就 ...

  3. 关于极限精简版系统(RAMOS专用)的说明(FAQ)

    关于极限精简版系统(RAMOS专用)的说明(FAQ) 对RAMOS-er来说,系统精简唯一的目的就是RAMOS,精简只为RAMOS而存在.我更喜欢听到大家把精简系统用于RAMOS,这里才应该是他的主战 ...

  4. note 12 集合Set

    集合Set +无序不重复元素(键)集 +和字典类似,但是无"值" 创建 x = set() x = {key1,key2,...} 添加和删除 x.add('body') x.re ...

  5. Python【每日一问】10

    问:请解释一下迭代器 答:可以被 __next__() 函数调用并不断返回下一个值的对象称为迭代器:Iterator

  6. laravel-admin安装时执行php arisan admin:install 命令时报SQLSTATE[42000]: Syntax error or acce ss violation: 1071 Specified key was too long; max key length is 1000 bytes

    问题根源 MySql支持的utf8编码最大字符长度为3字节,如果遇到4字节的宽字符就会出现插入异常.三个字节UTF-8最大能编码的Unicode字符是0xffff,即Unicode中的基本多文种平面( ...

  7. source insight 中文乱码解决方法

    options->preferences -> Files-> default encoding: 选择 GB2312 CP:936

  8. 64 位 Windows 平台开发注意要点之文件系统重定向

    Program Files 的重定向 很多开发人员都知道,在 64 位 Windows 系统上,32 位程序是无法获取得到 C:\Program Files 的完整路径的,只能获取到 C:\Progr ...

  9. 刘志梅2017710101152.《面向对象程序设计(java)》第十二周学习总结

    实验十二  图形程序设计 实验时间 2018-11-14 1.理论知识 (1) 基本AWT库采用将处理用户界面元素的任务委派给每个目标平台的本地GUI工具箱的方式,由本地GUI工具箱负责用户界面元素的 ...

  10. xshell完美开源替代方案(Kitty+MTPuTTY并设置全局字体)

    xshell是收费的,过了30天就不能用了.我们应该找一个开源的替代品.说实话windows平台没有什么可选的,就是putty.但是原生的putty不好用,记不住密码,又不支持多标签. Kitty是基 ...