接口测试(二) 优化项目分层及cookies值带入

news2024/11/27 20:22:21

整个项目分层如图

然后上代码

#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.更新对象传参


🎁更多干货


完整版文档下载方式:

这些资料,对于从事【软件测试】等相关工作的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享。

在评论区和我互动交流或者私❤我【软件测试学习】领取即可,拿走不谢。


如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “👍点赞” “✍️评论” “💙收藏” 一键三连哦!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/742177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模拟实现C++的string库的改进

之前写过,(8条消息) 模拟实现C的string库_Qianxueban的博客-CSDN博客 比较简单,我就直接截图的。我要改进一下。 1.改进string类中可以在字符串中存储\0 但我写的没有这项功能,究其根本就是代码我用的都是strcpy等等函数,应该用…

5G理论概述

文章目录 SA组网架构及协议栈4-5G核心网侧融合交互5G与4G用户标识5G网络网元和设备类型,接口1、AMF(Access and Mobility Management Function),接入和移动管理功能2、SMF(Session Management function),会话管理功能3…

MQTT快速入门

官网文档 前言: MQTT 是用于物联网连接的 OASIS 标准,它是一种基于发布订阅模式的、轻量级的消息传输协议,专为受限设备和低带宽、高延迟和不可靠的网络设计,并且能够提供一定的消息可靠性保证。得益于这些特性,MQTT…

在vite创建的vue3项目中使用Cesium标记地点(基于加载建筑样式,划分区域)

在vite创建的vue3项目中使用Cesium标记地点(基于加载建筑样式,划分区域) 使用vite创建vue3项目 npm create vitelatestcd到创建的项目文件夹中 npm install安装Cesium npm i cesium vite-plugin-cesium vite -D配置 vite.config.js文件&#…

通过平均列比较两组迭代次数

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由6张二值化的图片组成,让差值结构中有6个1, 行分布是0,1,1,1,1,2列分布是2,2,2.统计迭代次…

Java-多线程编程——基础篇及相关面试题

这里写目录标题 一、前言二、进程与线程的基本概念三、为什么Java中引入多线程?3.1 并行处理3.2 提高性能3.3 提高响应能力3.4 资源共享3.5 异步编程 四、Java多线程-创建多线程的类和接口4.1 Thread类4.2 Runnable接口 五、示例代码5.1 使用Thread类创建多线程六、…

【Django学习】(十二)GenericAPIView_过滤_排序_分页

上篇文章初步接触了GenericAPIView,这次来更加深入的学习它,了解里面的一些使用和方法 get_object:源码中:处理查询集,并含有所需要得pk值,lookup_fieldget_queryset:源码中:先判断queryset是否…

全志F1C200S嵌入式驱动开发(linux移植)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面完成了uboot移植,下面就要进行linux移植。当然,理论上uboot只是为后续的os准备好了一个基础运行环境,实际运行的操作系统是不是选择linux,也不一定。如果为了实际生产的需要…

Golang环境搭建指南(Windows和linux)

前言: go语言和Java,Python,C语言等等基本一样,也是需要在系统内集成语言环境的。语言基本都一样,支持各种系统架构,比如,mac,Windows,linux系统支持。本文仅以最为常用…

Django_Paginator分页器

目录 分页器代码说明 简单demo 源码等资料获取方法 分页器代码说明 import os import random # 需要导入分页器类from django.core.paginator import Paginator, EmptyPage# 导入配置django配置文件 os.environ.setdefault(DJANGO_SETTINGS_MODULE, dailyfresh.settings)it…

Java的Hibernate框架中集合类数据结构的映射编写教程

Java的Hibernate框架中集合类数据结构的映射编写教程 一、集合映射 1.集合小介 集合映射也是基本的映射,但在开发过程中不会经常用到,所以不需要深刻了解,只需要理解基本的使用方法即可,等在开发过程中遇到了这种问题时能够查询…

《机器学习公式推导与代码实现》chapter5-线性判别分析LDA

《机器学习公式推导与代码实现》学习笔记,记录一下自己的学习过程,详细的内容请大家购买作者的书籍查阅。 线性判别分析 线性判别分析(linear discriminant analysis, LDA)是一种经典的线性分类方法,其基本思想是将数据投影到低维空间&…

openGauss学习笔记-06 openGauss 基本概念

文章目录 openGauss学习笔记-06 openGauss 基本概念6.1 数据库(Database)6.2 数据块(Block)6.3 行(Row)6.4 列(Cloumn)6.5 表(Table)6.6 数据文件&#xff08…

Opencv之角点 Harris、Shi-Tomasi 检测详解

角点,即图像中某些属性较为突出的像素点 常用的角点有以下几种: 梯度最大值对应的像素点两条直线或者曲线的交点一阶梯度的导数最大值和梯度方向变化率最大的像素点一阶导数值最大,但是二阶导数值为0的像素点 API简介: void c…

Go语言网络编程:HTTP服务端之底层原理与源码分析——http.HandleFunc()、http.ListenAndServe()

一、启动 http 服务 import ("net/http" ) func main() {http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {w.Write([]byte("ping...ping..."))})http.ListenAndServe(":8999", nil) }在 Golang只需要几行代…

MySQL存储过程和存储函数练习

创建表并插入数据 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 name VARCHAR(50) 否 否 是 否 否 glass VARCHAR(50) 否 否 是 否 否 sch 表内容 id name glass 1 xiaommg glass 1 2 xiaojun glass 2 1、创建一个可以统计表格内记录条数的存储函数 &#…

耳夹式骨传导耳机哪个牌子好?耳夹骨传导耳机推荐

骨传导耳机品牌越来越多,选择骨传导耳机时可不是一件简单的事,在挑选的时候首先需要考虑到耳机自身的综合性能,以及耳机的配置如何都会影响到我们使用耳机的幸福感,接下来我来给大家挑选几款目前口碑不错的耳夹式骨传导耳机&#…

windows下使用cd命令切换到D盘的方法

windows下使用cd命令切换到D盘的方法 winr输入cmd进入终端

【CANFD详细介绍与CAN区别】

在汽车领域,随着人们对数据传输带宽要求的增加,传统的CAN总线由于带宽的限制难以满足这 种增加的需求。此外为了缩小CAN网络(max. 1MBit/s)与FlexRay(max.10MBit/s)网络的带宽差距,BOSCH公司推出了CAN FD。 CAN FD&…

基于控制屏障函数的安全关键系统二次规划(适用于ACC)(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 基于控制屏障函数的安全关键系统二次规划(适用于ACC)是一种用于自适应巡航控制(ACC&#x…