Python接口自动化之断言封装!

该框架支持两种断言方式,相等和包含。

先看一下断言的yaml文件编写规范:

  validate:    - equals: {status_code: 200}    - contains: $ddt{assert_str}

其中assert_str和之前用例一样,作为变量,放在对应的data yaml文件中

# DDT数据驱动yaml文件,对应的yaml测试用例文件为:user.yaml- ['name', 'userName', 'password', 'assert_str']- ['正确用户名密码登录成功', '*****', '******', '查询成功']- ['用户名或密码错误', '******', '*******', '帐号或密码错误,请重新输入']

断言方法的封装,直接看代码

    def assert_result(self, yq_result, sj_result, return_code):        """        断言方法,支持相等断言和包含断言        :param yq_result:        :param sj_result:        :param return_code:        :return:        """        all_flag = 0        for yq in yq_result:            for key, value in yq.items():                # print(key,value)                if key == "equals":                    flag = self.equals_assert(value, return_code,sj_result)                    all_flag = all_flag + flag                elif key == 'contains':                    flag = self.contains_assert(value, sj_result)                    all_flag = all_flag + flag                else:                    # print("框架暂不支持此断言方法")                    self.log.warning("框架暂不支持此断言方法")        assert  all_flag == 0
    def equals_assert(self, value, return_code, sj_result):        """        相等断言        :param value:        :param return_code:        :param sj_result:        :return:        """        flag = 0        for assert_key, assert_value in value.items():            # print(assert_key, assert_value)            if assert_key == "status_code":                assert_value == return_code                if assert_value != return_code:                    flag = flag+1                    # print("断言失败,返回的状态码不等于%s" % assert_value)                    self.log.warning("断言失败,返回的状态码不等于%s" % assert_value)            else:                lists = jsonpath.jsonpath(sj_result, '$..%s' % assert_key)                if lists:                    if assert_value not in lists:                        flag = flag+1                        # print("断言失败:" +assert_key+"不等于"+str(assert_value))                        self.log.warning("断言失败:" +assert_key+"不等于"+str(assert_value))                else:                    flag = flag +1                    # print("断言失败:返回的结果不存在:" + assert_key)                    self.log.warning("断言失败:返回的结果不存在:" + assert_key)        return flag
    def contains_assert(self, value, sj_result):        """        包含断言        :param value:        :param sj_result:        :return:        """        flag = 0        if value not in str(sj_result):            flag = flag + 1            # print("断言失败:返回的结果中不包含:" + value)            self.log.warning("断言失败:返回的结果中不包含:" + value)        return flag

self.log日志相关的方法,不在本节展开,下次另外单独详细介绍。

然后在standard_yaml方法中调用断言方法:

    def standard_yaml(self, caseinfo):        """        规范yaml测试用例        :param caseinfo:        :return:        """        caseinfo_keys = caseinfo.keys()        # 判断一级关键字是否包含:name,request,validate        if "name" in caseinfo_keys and "request" in caseinfo_keys and "validate" in caseinfo_keys:            # 判断request下面是否包含:method、url            request_keys = caseinfo["request"].keys()            if "method" in request_keys and "url" in request_keys:                # print("yaml基本结构检查通过")                # pop函数用于移除列表中的一个元素,并且返回该元素的值                method = caseinfo['request'].pop("method")                # print("打印出method % s" % method)                url = caseinfo['request'].pop('url')                # print("打印出url % s" % url)                res = self.send_request(method, url, **caseinfo['request'])     # caseinfo需要解包加**                # print("打印出res % s" % res)                return_text = res.text                return_code = res.status_code                return_json = ""                try:                    return_json = res.json()                except Exception as e:                    print("extract返回的结果不是JSON格式")                # 提取值并写入extract.yaml文件                if "extract" in caseinfo.keys():                    for key, value in caseinfo["extract"].items():                        if "(.*?)" in value or "(.+?)" in value:        # 正则表达式                            zz_value = re.search(value, return_text)                            if zz_value:                                extract_value = {key: zz_value.group(1)}                                write_yaml(os.path.dirname(os.getcwd()) + '/run/extract.yaml', extract_value)                        else:   # jsonpath                            js_value = jsonpath.jsonpath(return_json, value)                            if js_value:                                extract_value = {key: js_value[0]}                                write_yaml(os.path.dirname(os.getcwd()) + '/run/extract.yaml', extract_value)                self.assert_result(caseinfo['validate'], return_json, return_code)                # 将yaml文件中的name作为测试报告中用例名称                allure_title(caseinfo['name'])            else:                self.log.error("在request下必须包含method,url")                # print("在request下必须包含method,url")
        else:            self.log.error("一级关键字必须包含name,request,validate")            # print("一级关键字必须包含name,request,validate")

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Rye的Django项目通过Pyinstaller用Github工作流简单打包

前言 Rye的介绍和安装 Ryehttps://rye.astral.sh/Rye 完整使用教程_安装rye-CSDN博客https://blog.csdn.net/zhenndbc/article/details/144544692 正文 项目建立 配置好环境后 新建文件夹 新建文件夹,进入项目 初始化 rye init下载依赖 rye syncpycharm 打…

Pycharm 取消拼写错误检查(Typo:in word xxx)

现象 Pycharm显示单词存在错误,下面看着有下划波浪线,看着很不舒服。 快捷键AltEnter,查看提示错误。 Typo是啥? "Typo" 这个词通常用于描述打字或排印过程中的小错误,尤其是拼写错误。它指的是在文本中由于打字或印刷…

K8S学习之基础十七:k8s的蓝绿部署

蓝绿部署概述 ​ 蓝绿部署中,一共有两套系统,一套是正在提供服务的系统,一套是准备发布的系统。两套系统都是功能完善、正在运行的系统,只是版本和对外服务情况不同。 ​ 开发新版本,要用新版本替换线上的旧版本&…

三、0-1搭建springboot+vue3前后端分离-idea新建springboot项目

一、ideal新建项目1 ideal新建项目2 至此父项目就创建好了,下面创建多模块: 填好之后点击create 不删了,直接改包名,看自己喜欢 修改包名和启动类名: 打开ServiceApplication启动类,修改如下: …

任天堂Switch拉美游戏价涨,传Switch 2全球或提价

易采游戏网3月9日独家消息:近日据相关资讯显示,在拉丁美洲地区,任天堂Switch的游戏价格出现了上扬态势。这一变化引发了玩家与市场的关注,不过就目前而言,其并未波及全球游戏市场的整体定价格局。但值得注意的是&#…

10.2 继承与多态

文章目录 继承多态 继承 继承的作用是代码复用。派生类自动获得基类的除私有成员外的一切。基类描述一般特性,派生类提供更丰富的属性和行为。在构造派生类时,其基类构造函数先被调用,然后是派生类构造函数。在析构时顺序刚好相反。 // 基类…

如何在需求分析阶段考虑未来扩展性

在需求分析阶段考虑未来扩展性的关键在于 前瞻规划、灵活架构、标准设计。其中,前瞻规划尤为重要,因为通过全面分析业务发展趋势与技术演进,能够在初期设计阶段预留足够扩展空间,降低后期改造成本,为企业长期发展奠定坚…

PawSQL for MSSQL:PawSQL 支持 SQL Server 的SQL优化、SQL审核、性能巡检

0. 概述 在PawSQL的最新版本中,PawSQL 为 SQL Server 数据库提供了全方位的SQL优化、SQL审核、性能巡检支持,覆盖SQL开发、测试、运维的整个生命周期,助力用户充分发挥 SQL Server 数据库的性能潜力。 1. 纳管SQL Server 实例 工作空间是SQ…

【Java代码审计 | 第六篇】XSS防范

文章目录 XSS防范使用HTML转义使用Content Security Policy (CSP)输入验证使用安全的库和框架避免直接使用用户输入构建JavaScript代码 XSS防范 使用HTML转义 在输出用户输入时,对特殊字符进行转义,防止它们被解释为HTML或JavaScript代码。 例如&…

NO.26十六届蓝桥杯备战|字符数组七道练习|islower|isupper|tolower|toupper|strstr(C++)

P5733 【深基6.例1】自动修正 - 洛谷 小写字母 - 32 大写字母 大写字母 32 小写字母 #include <bits/stdc.h> using namespace std;const int N 110; char a[N] { 0 };int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cin >> a;int i 0;while (a…

langChainv0.3学习笔记(初级篇)

LangChain自0.1版本发布以来&#xff0c;已经历了显著的进化&#xff0c;特别是向AI时代的适应性提升。在0.1版本中&#xff0c;LangChain主要聚焦于提供基本的链式操作和工具集成&#xff0c;帮助开发者构建简单的语言模型应用。该版本适用于处理简单任务&#xff0c;但在应对…

qt 播放pcm音频

一、获取PCM音频 ffmpeg -i input.mp3 -acodec pcm_s16le -ar 44100 -ac 2 -f s16le output.pcm -acodec pcm_s16le&#xff1a;指定16位小端PCM编码格式&#xff08;兼容性最佳&#xff09;-ar 44100&#xff1a;设置采样率为CD标准44.1kHz&#xff08;可替换为16000/8000等&a…

Windsuf 连接失败问题:[unavailable] unavailable: dial tcp...

问题描述 3月6日&#xff0c;在使用Windsuf 时&#xff0c;遇到以下网络连接错误&#xff1a; [unavailable] unavailable: dial tcp 35.223.238.178:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of…

Leetcode 刷题记录 05 —— 普通数组

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答。 目录 01 最大子数组和 方法一&#xff1a;动态规划&#xff08;卡达尼算法&#xff09; 方法…

QTS单元测试框架

1.QTS单元测试框架介绍 目前QTS项目采用C/C语言,而CppUnit就是xUnit家族中的一员,它是一个专门面向C的单元测试框架。因此,QTS采用CppUnit测试框架是比较理想的选择。 CppUnit按照层次来管理测试,最底层的就是TestCase,当有了几个TestCase以后&#xff0c;可以将它们组织成Te…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之功能优化,添加列宽调整功能Table12

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之功能优化,添加列宽调整功能Table12📚页面效…

探索Java多线程的核心概念与实践技巧,带你从入门到精通!

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 今天我们来学习多线程编程-"掌握线程创建、管理与安全"&#xff1a; 上一节课程我们铺垫了一系列的东西&#xff0c;引出来了我们的多…

前端数据模拟 Mock.js 学习笔记(附带详细)

前端数据模拟 Mock.js 学习笔记 在前端开发过程中&#xff0c;数据模拟是一项至关重要的环节。当后端接口尚未完成或者需要独立进行前端开发与测试时&#xff0c;Mock.js 能发挥巨大作用&#xff0c;它可以模拟各种数据场景&#xff0c;助力前端开发高效进行。 一、Mock.js 的…

NoteGen是一款开源跨平台的 AI 笔记应用,专注于 recording 和 writing ,基于 Tauri 开发

一、软件介绍 文末提供程序和源码下载 NoteGen 是一款专注于记录和写作的跨平台 AI 笔记应用&#xff0c;基于 Tauri 开发。NoteGen 的核心理念是将记录、写作和 AI 结合使用&#xff0c;三者相辅相成。记录功能可以帮助用户快速捕捉和整理碎片化知识。整理功能是连接记录和写…

学习网络安全需要哪些基础?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 学习网络安全&#xff0c;对于想要进入IT行业的朋友们来说是一件非常重要的事情。尤其是在当今社会&#xff0c;互联网已经渗透到工作和生活的方方面面&#xff0…