Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python接口测试:如何将A接口的返回值传递给B接口

python接口测试:如何将A接口的返回值传递给B接口

作者头像
冰霜
发布于 2022-03-15 11:19:42
发布于 2022-03-15 11:19:42
2.2K01
代码可运行
举报
运行总次数:1
代码可运行

在编写接口测试脚本时,要考虑一个问题:参数值从哪里获取

一种方式是可以通过数据库来获取,但是通过这次接口测试,我发现读取数据库有一个缺点:速度慢

可能和我的sql写法有关,有些sql加的约束条件比较少,有时甚至全量查询,把所有结果遍历一遍,这样一轮下来直接就炸了,那速度比蜗牛还慢

这种方式给我的体验不太好,一方面本身连数据库这个操作我就不太愿意用,生怕对数据库造成什么伤害......

另一种方式就是写死参数,不过除非是一些固定的参数,比如按照某个类型查询,类型是固定的,那么可以事先定义一个列表或字典存放类型值,然后依次遍历即可;

否则一般不推荐写死参数,写死的话拓展性不强,换个测试环境,脚本可能就运行不起来了

还有就是通过接口获取想要的数据了,也就是一个接口能返回某些参数想要的值,那么就把这个接口的返回值传递给下个接口的参数

这样一来,参数值是动态生成的,即使切换环境,也可以在新环境获取参数值,然后再去发送请求

本质上接口间传递参数,其实就是处理上一个接口的返回数据,抽取出自己想要的某个字段或某一批字段

举个栗子:

有2个接口,A接口用于查询所有的标签数据,B接口需要传入一个标签,然后生成一条草稿数据

这样的话,可以在A接口查询出的所有标签中选择一个传给B

A接口的返回数据如下:seq表示标签编码,B接口本质上就是需要一条标签编码来生成数据

labelStatus表示标签状态,0表示启用,1表示未启用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    'total': '5',
    'rows': [{
        'seq': '151ceb6c0e624537a2b067d511c4c966',
        'labelCode': '004',
        'labelName': '拼多多',
        'labelStatus': 0,
        'kseq': None,
        'lseq': None
    }, {
        'seq': '1aa2ddfe896848cf893eebe6c37a79e6',
        'labelCode': '002',
        'labelName': '京东',
        'labelStatus': 0,
        'kseq': None,
        'lseq': None
    }, {
        'seq': '25879c28e8b54bf0b75168fc60c31a91',
        'labelCode': '001',
        'labelName': '天猫',
        'labelStatus': 0,
        'kseq': None,
        'lseq': None
    }, {
        'seq': '7715e67a153d484996a07af19ef33c09',
        'labelCode': '003',
        'labelName': '苏宁',
        'labelStatus': 0,
        'kseq': None,
        'lseq': None
    }, {
        'seq': '647733588fa34f60858e42ccd7357975',
        'labelCode': '005',
        'labelName': '唯品会',
        'labelStatus': 1,
        'kseq': None,
        'lseq': None
    }]
}

先写一个方法,提取查询到的标签编码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_all_label(self):
        """获取菜单中所有标签数据"""
        url = "http://127.0.0.1:8080/XXX"
        payload = {
            "page": "1",
            "rows": "10",
            "sort": "labelStatus",
            "order": "asc"
        }

        response = self.s.test_login().post(url, data=payload, headers=self.header, verify=False)
        data = json.loads(response.content)
        # print(data)

        try:
            self.assertIn("rows", data)
            self.assertIn("total", data)

            if data["rows"]:
                labels = [] # 定义一个列表存查询到的所有标签数据
                for t in data["rows"]:
                    """以列表中嵌套字典的格式保存,易于调用"""

                    if t["labelStatus"] == 0:
                        """如果labelStatus为0则追加到列表中"""

                        labels.append(
                            {"seq": t["seq"],
                             "labelCode": t["labelCode"],
                             "labelName": t["labelName"],
                             "labelStatus": t["labelStatus"]}
                        )
                # print(labels)
                return labels
            else:
                labels = None
                return labels
        except Exception as e:
            print("请求url:", response.url)
            print("传入参数:", payload)
            raise e

B接口用于创建草稿数据,参数中用到A接口返回的标签编码seq;

创建一个生成草稿数据的方法,在这个方法中,定义一个变量seq,用于接收标签编码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def add_draft(self, seq=None):
        """新增草稿"""
        url = "http://127.0.0.1:8080/XXX"
        payload = {
            "title": "XX",
            "applyType": 0,
            "hotFlag": 1,
            "content": "XX",
            "replyContent": "XX",
            "labelList[0].lseq": seq,  # 接收传入的seq
            "faqList[0].content": "XX",
            "faqList[0].replyContent": "XX",
            "fnType": 0
        }

        response = self.s.test_login().post(url, data=payload, headers=self.header, verify=False)
        data = response.json()
        # print(data)


        try:
            self.assertEqual(data["success"], "true")
            self.assertEqual(data["successful"], True)return data

        except Exception as e:
            print("请求url:", response.url)
            print("传入参数:", payload)
            raise e

最后利用上面2个方法编写一条用例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def test01(self):
        try:
            labels = self.get_all_label() # 调用查询标签方法,获取所有可用标签
            # n = isinstance(labels, Iterable)
            # print(n)
            if labels:
                label = random.choice(labels)  # 从获取到的标签列表中随机取出一个
                seq = label["seq"]  # 从取出的一个标签中,获取其seq值
                data = self.add_draft(seq)  # 调用生成草稿数据方法,并将seq传入
                print("使用的标签名:{},对应的标签seq:{},返回的草稿编码:{}".format(label["labelName"], label["seq"], data["data"]))

            elif labels is None:
                print("标签菜单暂无可用数据,请先去添加标签")

        except Exception as e:
            print("错误详情:", e)
            raise e

在实际编写过程中,由于每个接口的实际情况不同,所以要做相应的处理,例如

1. 在获取标签过程中,只有启用状态的标签才能使用,所以需要判断下标签的状态;

2. 需要考虑下假如标签菜单为空怎么办?这个时候获取标签的方法就拿不到数据,所以也要加个判断,没有标签数据时,这个方法要返回什么内容,以及后续接口做相应处理,避免当接收不到seq时报异常;

3. 另外就是有些接口在开发时定义的不是很规范,虽然返回的一大批数据,但是有些数据可能少个字段,例如上述获取标签接口的某些返回内容中缺少seq,那在提取每一组的seq时,就要判断seq这个字段是不是存在,存在则提取,不存在则略过。

其实这些问题也是在实际运行过程中发现的缺陷,很多异常情况没有考虑到,脚本不是写完就完了的,还要放到环境中运行,只有这样才会发现脚本不完善的地方。

这只是一个简单例子,实际情况可能更复杂一些,例如需要返回多个参数的情况或者把多个接口的返回值传递给一个接口等等;

不过道理都是一样的,要学会分析接口返回内容的结构,提取自己想要的值。更多细节以及技巧等待大家在实际使用过程中发现

完整demo:

login.py,使用cookie跳过验证码登录,可以参考:https://www.cnblogs.com/hanmk/p/9101275.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding:utf-8
import requests
# from requests.cookies import RequestsCookieJar

class Login:
    @staticmethod
    def test_login():
        s = requests.session()
        jar = requests.cookies.RequestsCookieJar()  # 创建一个Cookie Jar对象
        jar.set('XXX', 'xxx')  # 向Cookie Jar对象中添加cookie值
        jar.set('XXX', 'xxx')
        jar.set('XXX', 'xxx')
        s.cookies.update(jar)  # 把cookies追加到Session中
        return s

test.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding:utf-8

import unittest
from hmk.login import Login
import warnings
import json
import random
from collections import Iterable


class ModuleList(unittest.TestCase):
    def setUp(self):
        warnings.simplefilter("ignore", ResourceWarning)
        self.s = Login()
        self.url = 'http://127.0.0.1:8080/XXX'
        self.header = {
            "Accept": "application/json, text/javascript, */*; q=0.01",
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            "Origin": "http://127.0.0.1:8080",
            "Referer": "http://127.0.0.1:8080XXX",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36",
            "X-Requested-With": "XMLHttpRequest"
        }


    def get_all_label(self):
        """获取菜单中所有标签数据"""
        url = "http://127.0.0.1:8080XXX"
        payload = {
            "page": "1",
            "rows": "10",
            "sort": "labelStatus",
            "order": "asc"
        }

        response = self.s.test_login().post(url, data=payload, headers=self.header, verify=False)
        data = json.loads(response.content)
        # print(data)

        try:
            self.assertIn("rows", data)
            self.assertIn("total", data)

            if data["rows"]:
                labels = [] # 定义一个列表存查询到的所有标签数据
                for t in data["rows"]:
                    """以列表中嵌套字典的格式保存,易于调用"""

                    if t["labelStatus"] == 0:
                        """如果labelStatus为0则追加到列表中"""

                        labels.append(
                            {"seq": t["seq"],
                             "labelCode": t["labelCode"],
                             "labelName": t["labelName"],
                             "labelStatus": t["labelStatus"]}
                        )
                # print(labels)
                return labels
            else:
                labels = None
                return labels
        except Exception as e:
            print("请求url:", response.url)
            print("传入参数:", payload)
            raise e

    def add_draft(self, seq=None):
        """新增草稿"""
        url = "http://127.0.0.1:8080/XXX"
        payload = {
            "title": "XXX",
            "applyType": 0,
            "hotFlag": 1,
            "content": "XXX",
            "replyContent": "XXX",
            "labelList[0].lseq": seq,  # 接收传入的seq
            "faqList[0].content": "XXX",
            "faqList[0].replyContent": "XXX",
            "fnType": 0
        }

        response = self.s.test_login().post(url, data=payload, headers=self.header, verify=False)
        data = response.json()
        # print(data)


        try:
            self.assertEqual(data["success"], "true")
            self.assertEqual(data["successful"], True)return data

        except Exception as e:
            print("请求url:", response.url)
            print("传入参数:", payload)
            raise e

    def test01(self):
        try:
            labels = self.get_all_label() # 调用查询标签方法,获取所有可用标签
            # n = isinstance(labels, Iterable)
            # print(n)
            if labels:
                label = random.choice(labels)  # 从获取到的标签列表中随机取出一个
                seq = label["seq"]  # 从取出的一个标签中,获取其seq值
                data = self.add_draft(seq)  # 调用生成草稿数据方法,并将seq传入
                print("使用的标签名:{},对应的标签seq:{},返回的草稿编码:{}".format(label["labelName"], label["seq"], data["data"]))

            elif labels is None:
                print("标签菜单暂无可用数据,请先去添加标签")

        except Exception as e:
            print("错误详情:", e)
            raise e


if __name__ == '__main__':
    # unittest.main()
    suite = unittest.TestSuite()
    suite.addTest(ModuleList('test01'))  
    runner = unittest.TextTestRunner()
    runner.run(suite)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冰霜blog 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS 音视频采集要点梳理(1)
从 AVCaptureDevcie 捕获的数据,是个抽象类,需要继承后使用,例如**:**AVCaptureDeviceInput,还有其他input 源,可参考Apple 官网文档根据场景选用。
magianter
2021/12/06
7760
iOS 音视频采集
iOS的音视频采集用到了AVCaptureSession。关于AVCaptureSession,苹果的官方文档里的描述如下:
GF
2020/11/27
1.2K0
音视频基础能力之 iOS 视频篇(一):视频采集
涉及硬件的音视频能力,比如采集、渲染、硬件编码、硬件解码,通常是与客户端操作系统强相关的,就算是跨平台的多媒体框架也必须使用平台原生语言的模块来支持这些功能
声知视界
2024/11/15
2010
音视频基础能力之 iOS 视频篇(一):视频采集
iOS AVDemo(7):视频采集,视频系列来了丨音视频工程示例
iOS/Android 客户端开发同学如果想要开始学习音视频开发,最丝滑的方式是对音视频基础概念知识有一定了解后,再借助 iOS/Android 平台的音视频能力上手去实践音视频的采集 → 编码 → 封装 → 解封装 → 解码 → 渲染过程,并借助音视频工具来分析和理解对应的音视频数据。
关键帧
2022/06/13
8950
iOS AVDemo(7):视频采集,视频系列来了丨音视频工程示例
AVFoundation 框架初探究(二)
接着第一篇总结 ----       系列第一篇地址:AVFoundation 框架初探究(一)       在第一篇的文章中,我们总结了主要有下面几个点的知识:       1、对AVFoundation框架整体的一个认识       2、AVSpeechSynthesizer这个文字转音频类       3、AVAudioPlayer音频播放类       4、AVAudioRecorder音频录制类       5、AVAudioSession音频会话处理类        上面第一篇说的内容,大致
Mr.RisingSun
2018/03/19
1.8K0
AVFoundation 框架初探究(二)
AVFoundation框架解析看这里(2)- 媒体捕捉与视频拍摄
上一章节主要从整体上全览AVFoundation框架,本章主要以一个小的需求(以媒体捕捉以起点,拍摄、保存视频),打开AVFoundation的大门,带领我们欣赏这个框架带来的强大功能。
sweet说好的幸福
2020/12/23
1.2K0
AVFoundation框架解析看这里(2)- 媒体捕捉与视频拍摄
iOS-AVFoundation自定义相机详解
AVFoundation 中关于视频主要的类 目录 相机基本实现步骤 捕捉会话——AVCaptureSession 捕捉输入——AVCaptureDeviceInput 捕捉预览——AVCaptureVideoPreviewLayer/OpenGL ES 捕捉连接——AVCaptureConnection 拍照——AVCaptureStillImageOutput 音频——AVCaptureAudioDataOutput 视频——AVCaptureVideoDataOutput 生成视频文件——AVA
用户2215591
2018/06/29
2.7K0
iOS - 视频采集详解
苹果官方文档-AVFoundation 为了管理从相机或者麦克风等这样的设备捕获到的信息,我们需要输入对象(input)和输出对象(output),并且使用一个会话(AVCaptureSession)来管理 input 和 output 之前的数据流: 类名 简介 AVCaptureDevice 输入设备,例如 摄像头 麦克风 AVCaptureInput 输入端口 [使用其子类] AVCaptureOutput 设备输出 [使用其子类],输出视频文件或者静态图像 AVCaptureSession 管理输入
LinXunFeng
2018/06/29
1.3K0
iOS摄像头采集和编码
使用AVCaptureSession创建采集会话,获取图像数据后通过VideoToolBox进行编码。
gongluck
2022/05/09
1K0
AVFoundation 框架介绍
本文是 iOS/Android 音视频开发专题 第九篇,该专题中项目代码将在 Github 进行托管,你可在微信公众号(GeekDev)后台回复 资料 获取项目地址。
100001509164
2019/11/05
3.6K0
AVFoundation 框架介绍
AVFoundation 视频拍摄基础篇
停止录制之后 可以在AVCaptureFileOutputRecordingDelegate回调方法中做对应的处理,比如视频转码,存入相册 等等。
陈雨尘
2021/02/05
1K0
AVFoundation 视频拍摄基础篇
GPUImage详细解析(五)滤镜视频录制
回顾 GPUImage的基础在详细解析1~4。 这次的介绍是录制视频,添加滤镜,保存到手机。 核心思路 通过GPUImageVideoCamera采集视频和音频的信息,音频信息直接发送给GPUIma
落影
2018/04/27
1.9K0
GPUImage详细解析(五)滤镜视频录制
「音视频直播技术」iOS视频采集
前两天给大家介绍了如何在iOS下进行音频采集,今天介绍一下在iOS下进行视频采集。要了解iOS是怎样进行视频采集的,首先我们要了解 AVCaptureSession, AVCaptureDevice等几个基本概念及iOS上视频采集的工作原理。
音视频_李超
2020/04/02
1.9K0
「音视频直播技术」iOS视频采集
RenderDemo(2):用 OpenGL 渲染视频丨音视频工程示例
渲染是音视频技术栈相关的一个非常重要的方向,视频图像在设备上的展示、各种流行的视频特效都离不开渲染技术的支持。
关键帧
2023/02/14
1.4K0
RenderDemo(2):用 OpenGL 渲染视频丨音视频工程示例
Metal入门教程(三)摄像头采集渲染
前面的教程介绍了如何绘制一张图片和如何把图片显示到3D物体上并进行三维变换,这次介绍如何用Metal渲染摄像头采集到的图像。
落影
2020/10/26
1.5K0
iOS二维码扫描
AVCaptureDevice提供了一个类方法,指定一种媒体类型(AVMediaTypeVideo or AVMediaTypeAudio)它便能返回对应的录制设备。其他媒体类型可以在AVMediaFormat.h中找到,不过它们不需要录制设备(如文本、字幕等)。
全栈程序员站长
2022/09/12
8750
iOS 端实现1对1音视频实时通话
之前,我已经写过 Android 端实现1对1音视频实时通话 的文章。在那篇文章中,我向大家介绍了在 Android 端是如何使用 WebRTC 进行音视频通话的。今天,我们再来看看 iOS 端1对1音视频实时通话的具体实现。
音视频_李超
2020/04/01
4.4K0
iOS 端实现1对1音视频实时通话
iOS开发——系统原生的二维码扫描
对于现在的App应用来说,扫描二维码这个功能是再正常不过的一个功能了,在早期开发这些功能的时候,大家或多或少的都接触过ZXing和ZBar这类的第三方库,但从iOS7以后,苹果就给我们提供了系统原生的API来支持我们扫描获取二维码,ZXing和ZBar在使用中或多或少有不尽如人意的地方,再之停止更新很久了,所以今天我们就来聊聊如何用系统原生的方法扫描获取二维码。
Originalee
2018/08/30
8540
音视频面试题集锦第 16 期
通常我们通过 AVCaptureSession 相关的 API 来进行音视频的采集,其中主要组件分为 Input、Output、Session 几个部分:
关键帧
2024/02/26
4550
音视频面试题集锦第 16 期
iOS AVDemo(9):视频封装,采集编码 H.264/H.265 并封装 MP4丨音视频工程示例
iOS/Android 客户端开发同学如果想要开始学习音视频开发,最丝滑的方式是对音视频基础概念知识有一定了解后,再借助 iOS/Android 平台的音视频能力上手去实践音视频的采集 → 编码 → 封装 → 解封装 → 解码 → 渲染过程,并借助音视频工具来分析和理解对应的音视频数据。
关键帧
2022/06/13
5040
iOS AVDemo(9):视频封装,采集编码 H.264/H.265 并封装 MP4丨音视频工程示例
推荐阅读
相关推荐
iOS 音视频采集要点梳理(1)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验