Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >pytest+requests+allure实现接口自动化测试系列(9)-封装自己的断言

pytest+requests+allure实现接口自动化测试系列(9)-封装自己的断言

作者头像
搁浅同学
发布于 2022-07-21 07:02:25
发布于 2022-07-21 07:02:25
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

接着上一篇分享

上一篇分享了接口之间的数据依赖,我们的测试结构数据,还有一部分没有说明,就是断言这一部分,下面的数据结构,我设计的需要断言的放在

validate这个地方,每一项是一个字典,键是响应的jsonpath,值是预期结果,同时声明了断言的类型,整体是一个列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  - testCase:
      description: login success
      name: login
      method: post
      uri: "https://api2.mubu.com/v3/api/user/phone_login"
      headers:
        Content-Type: application/json
      payload:
        phone: "135288728ddd"
        password: "Aa12345678"
        callbackType: 0
      extract:
        token: $.data.token
      validate:
         - equal_to:
            $.code: 0
         - equal_to:
            $.code: 0
  - testCase:
      description: profile
      name: profile
      method: post
      uri: "https://api2.mubu.com/v3/api/user/profile"
      headers:
        Content-Type: application/json
        jwt-token: ${token}
      payload: {}
      validate:
        - equal_to:
            $.code: 0
        - equal_to:
            $.code: 0

如果用pytest自带的断言进行封装,可能会比较麻烦点,所以我用了一个第三方的断言库hamcrest,通过pip install PyHamcrest进行安装,我们在utils.py,新增函数validate,代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 from hamcrest import *
    @staticmethod
    def validate(validate_list: list, response):
        for validate in validate_list:
            for key, item in validate.items():
                for key_json_path, item_expect in item.items():
                    logger.info(f"预期结果的值是{item_expect}")
                    actual_val = jsonpath.jsonpath(response, key_json_path)[0]
                    logger.info(f"获取真实值是{actual_val}")
                    if key == "equal_to": # 断言相等
                        assert_that(actual_val, equal_to(item_expect))
                    elif key == "less_than":
                        assert_that(actual_val, less_than(item_expect))
                    elif key == "greater_than":
                        assert_that(actual_val, greater_than(item_expect))
                    elif key == "has_length":
                        assert_that(actual_val, has_length(item_expect))
                    elif key == "has_string":
                        assert_that(actual_val, has_string(item_expect))
                    elif key == "greater_than_or_equal_to":
                        assert_that(actual_val, greater_than_or_equal_to(item_expect))
                    elif key == "less_than_or_equal_to":
                        assert_that(actual_val, less_than_or_equal_to(item_expect))
                    else:
                        logger.info("-------暂时不支持该断言方法---------")

重新修改下断言的字段,第一个接口增加了手机号这个字段的验证,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  - testCase:
      description: login success
      name: login
      method: post
      uri: "https://api2.mubu.com/v3/api/user/phone_login"
      headers:
        Content-Type: application/json
      payload:
        phone: "13528872ssss2"
        password: "Aa12345678"
        callbackType: 0
      extract:
        token: $.data.token
      validate:
         - equal_to:
            $.code: 0
         - equal_to:
            $.data.phone: "135288ssss802"
  - testCase:
      description: profile
      name: profile
      method: post
      uri: "https://api2.mubu.com/v3/api/user/profile"
      headers:
        Content-Type: application/json
        jwt-token: ${token}
      payload: {}
      validate:
        - equal_to:
            $.code: 0

重新修改下之前的测试用例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pytest
from common.request_handler import request_handler
from common.yamlRead import read_yaml
from common.utils import Utils
from common.logger import logger


class Testrequests:
    @pytest.mark.parametrize('test_data', read_yaml('../testData/login.yml'))
    def test_requests(self, test_data):
        request_data = test_data['testCase']
        request_data = Utils.handle_request_data(request_data)
        method = request_data['method']
        headers = request_data['headers']
        url = request_data['uri']
        data = request_data['payload']
        logger.debug(request_data)
        response = request_handler(method, url, headers, data)
        logger.debug(response)
        if 'extract' in request_data:
            Utils.extract(request_data['extract'], response)
        if 'validate' in request_data:
            validate_list = request_data['validate']
            Utils.validate(validate_list, response)

运行测试用例,结果如下:

我们看到已经对所有的字段进行断言了,但是我们测试用例有的地方可以进行优化,可已经提取和发送请求放在一个函数里面,在request_handler这个文件里面增加函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def request_from_request_data(request_data: dict):
    """

    :param base_url: 请求域名
    :param request_data: 请求数据
    :return: 返回响应
    """
    request_data = Utils.handle_request_data(request_data)
    method = request_data['method']
    headers = request_data['headers']
    url = request_data['uri']
    data = request_data['payload']
    response = request_handler(method, url, headers, data)
    if 'extract' in request_data:
        Utils.extract(request_data['extract'], response)
    return response

再次修改用例如下,代码比上面更加简洁一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pytest
from common.request_handler import request_from_request_data
from common.yamlRead import read_yaml
from common.utils import Utils
from common.logger import logger


class Testrequests:
    @pytest.mark.parametrize('test_data', read_yaml('../testData/login.yml'))
    def test_requests(self, test_data):
        request_data = test_data['testCase']
        request_data = Utils.handle_request_data(request_data)
        response = request_from_request_data(request_data)
        if 'validate' in request_data:
            validate_list = request_data['validate']
            Utils.validate(validate_list, response)

今天分享到这里!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 暴走的软件测试Tester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
pytest+requests+allure实现接口自动化测试系列(8)-接口之间的数据依赖
我们做接口测试的时候,肯定会遇到接口间数据依赖的问题,就是上一次接口的数据,是下一个接口的请求参数,最常见的是登录时,token是每个接口都需要传递的参数
搁浅同学
2022/07/21
1.1K0
pytest+requests+allure实现接口自动化测试系列(8)-接口之间的数据依赖
pytest+requests+allure实现接口自动化测试系列(10)-多环境切换和集成美观的allure报告
分享好几篇,今天来分享如何集成allure测试报告和多环境切换,分享完这篇后,这个接口自动化测试也差不多完成一些基本的功能,但是还有很多功能可以扩展,比如Email发送测试结果、根据yaml生成测试脚本、编写相关装饰器记录日志等
搁浅同学
2022/07/21
1K0
pytest+requests+allure实现接口自动化测试系列(10)-多环境切换和集成美观的allure报告
pytest+requests+allure实现接口自动化测试系列(7)-数据提取并保存
这次主要分享的是响应数据的提取和保存,在做接口测试的时候,我们肯定会遇到需要接口直接数据调用,比如A接口需要用到B接口响应的数据,但是我们需要做的是设计提取值的规则和保存下来。
搁浅同学
2022/07/21
9850
pytest+requests+allure实现接口自动化测试系列(7)-数据提取并保存
pytest+requests+allure实现接口自动化测试系列(5)-测试脚本数据设计
因此我们需要改进下我们的测试数据的格式,我的想法是一个接口拥有自己的yaml文件数据,改进后的yaml文件格式如下:
搁浅同学
2022/07/21
6080
pytest+requests+allure实现接口自动化测试系列(5)-测试脚本数据设计
pytest+requests+allure实现接口自动化测试系列(3)-yaml实现数据驱动
@pytest.mark.paramtise来实现参数化,但是数据还是主要写在代码里面,这次分享的是通过读取yaml文件,来实现参数
搁浅同学
2022/07/21
1.2K1
pytest+requests+allure实现接口自动化测试系列(3)-yaml实现数据驱动
Pytest+Allure+Jenkins接口自动化项目实战(一)
经过一周多时间,基于python+pytest+excel+allure框架的接口自动化测试初版已基本实现,包括基本配置读取、用例读取、用例执行、sql读取执行、前置数据准备、后置数据清理以及测试报告生成等,环境独立运行、项目独立运行、用例独立运行、jenkins集成、邮件发送暂未实现,再后期版本会再次推出,现在把整个框架设计思路和想法分享给大家来参考和借鉴。希望大家也能提供更好的思路和方法帮助我进行优化改进。整个过程中遇到的问题清参考Python自动化测试疑问及解决方案(一)Python自动化测试|如何解决前置模块及数据依赖(二)
王大力测试进阶之路
2020/02/19
3.4K0
Pytest+Allure+Jenkins接口自动化项目实战(一)
pytest+requests+allure实现接口自动化测试系列(6)-重新封装requests
上一篇测试数据的结构增加了headers,对于headers处理,主要区别Content-Type的处理。比较常见的是Content-Type:application/json和Content-Type:multipart/form-data这两种。这次封装的改动主要是针对后者。
搁浅同学
2022/07/21
5640
pytest+requests+allure实现接口自动化测试系列(6)-重新封装requests
pytest文档71-pytest+yaml实现接口自动化框架
httprunner 用 yaml 文件实现接口自动化框架很好用,最近在看 pytest 框架,于是参考 httprunner的用例格式,写了一个差不多的 pytest 版的简易框架
上海-悠悠
2020/12/17
1.7K0
pytest文档71-pytest+yaml实现接口自动化框架
pytest+requests+allure实现接口自动化测试系列(4)-logging模块
一个自动化测试框架一般配备日志管理模块,配备该模块主要是为了记录我们运行过程中的日志,在测试用例执行失败时,可以通过日志查找到失败的原因。python内置了一个库logging,今天主要分享logging模块的基本使用。
搁浅同学
2022/07/21
1.1K0
pytest+requests+allure实现接口自动化测试系列(4)-logging模块
pytest+requests+allure实现接口自动化测试系列(2)-requests封装
接着分享如何封装requests的,让它更符合我们的业务。因为如果不封装的话,每次都单独调用调用requests的方法,肯定会造成很多代码冗余。
搁浅同学
2022/07/21
7740
pytest+requests+allure实现接口自动化测试系列(2)-requests封装
Python搭建接口测试自动化框架(二)
很早之前,我就准备做一个基于 Python 的自动化测试框架,当时仅仅写了第一篇,后面因为种种原因,就没有再写了,从今天开始,继续这个系列,一步一步的,搭建一个自己理想的自动化测试框架。 关于第一部分,可以戳这里(链接)
周萝卜
2019/07/17
1.9K3
Python搭建接口测试自动化框架(二)
怎么基于Pytest+Requests+Allure实现接口自动化测试?
1、工具层 将get、post等常用行为进行二次封装。 代码(api_key.py)如下:
科技新语
2024/06/12
1920
怎么基于Pytest+Requests+Allure实现接口自动化测试?
Python+Pytest+Allure+Json 最全Api自动化框架之邮件发送功能
Python+Pytest+Allure+Json 最全Api自动化框架 分享后,受到许多小伙伴的关注,最近一直在完善这个 API 自动化框架的功能,准备在框架成熟后分享给更多需要的小伙伴们。
Wu_Candy
2022/07/04
1K0
Python+Pytest+Allure+Json 最全Api自动化框架之邮件发送功能
httprunner 3.x学习2 - 测试用例结构(testcase)
httprunner 3.x 支持3种格式的用例:YAML/JSON/pytest 代码,3.x版本主推的是pytest测试用例。
上海-悠悠
2021/06/24
1.3K0
httprunner 3.x学习2 - 测试用例结构(testcase)
Python+Requests+Pytest+YAML+Allure实现接口自动化
本项目实现接口自动化的技术选型:Python+Requests+Pytest+YAML+Allure ,主要是针对之前开发的一个接口项目来进行学习,通过 Python+Requests 来发送和处理HTTP协议的请求接口,使用 Pytest 作为测试执行器,使用 YAML 来管理测试数据,使用 Allure 来生成测试报告。
Python编程与实战
2021/07/06
3.3K0
pytest+requests+allure实现接口自动化测试系列(5)-jsonpath使用
目前很多项目接口返回都是json格式的数据,今天主要分享下对json格式的响应数据的操作。我比较常用的一个库就是jsonpath,这个库是专门对json格式的数据进行取值。
搁浅同学
2022/07/21
9000
pytest+requests+allure实现接口自动化测试系列(5)-jsonpath使用
当Pytest遇上MVC分层设计自动化用例就该这么写
数据写在代码里,追求快速编写用例,是我设计tep的一个特点,这在个人编写时是一种非常良好的体验。但相比于HttpRunner、JMeter等来说,总觉得还差点意思。思考良久,总结为三个字:工程化。工程化是我近一年在学习Java并参与了2个测试平台模块开发,和写了几个小工具后,感受到的一种编程思想。而其中最明显的就是Spring的MVC分层设计。为了让tep更工程化,后续版本将以MVC模块编写用例为准,同时会兼容之前的脚本式快速编写。
dongfanger
2022/12/28
3880
当Pytest遇上MVC分层设计自动化用例就该这么写
Python + Pytest 自动化框架的用例依赖实操
今日分享主题:Python + Pytest 自动化框架中测试用例依赖的探索与实践,今天分享的内容以“依赖别名+scope=’package’”进行演示。
Wu_Candy
2022/07/04
1.3K0
Python + Pytest 自动化框架的用例依赖实操
基于Pytest+Requests+Allure实现接口自动化测试
1、工具层 将get、post等常用行为进行二次封装。 代码(api_key.py)如下:
测试开发技术
2023/08/21
6150
基于Pytest+Requests+Allure实现接口自动化测试
聊一聊接口自动化测试断言处理策略
在进行接口自动化测试中,要验证接口执行后是否符合预期结果,其中的断言处理是比较关键步骤。在进行断言处理的时候,可以分为以下几种断言形式比如状态码、响应体结构、字段值、响应时间,还有数据库的数据是否正确。
漫谈测试
2025/04/28
1821
聊一聊接口自动化测试断言处理策略
推荐阅读
相关推荐
pytest+requests+allure实现接口自动化测试系列(8)-接口之间的数据依赖
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验