前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >python接口测试:如何将A接口的返回值传递给B接口

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

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

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

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

可能和我的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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ChatGPT与接口测试
参数:csrfmiddlewaretoken:fxljYKsDtuE7FlONP8Pe6xwkcEZxKqVc2eDOuVc94DWhmRpuQTqRqqqOCX5ITNOT,username:cindy,password:123456进行SHA256散列
顾翔
2024/09/10
930
ChatGPT与接口测试
chatGPT辅助测试登录接口
需求:帮我写一个测试百度登录接口的脚本python import unittest import requests class TestBaiduLogin(unittest.TestCase):
用户10443079
2023/04/23
4580
chatGPT辅助测试登录接口
使用ChatGPT生成登录产品代码的测试用例和测试脚本
l密码:密码框,必须包括大小写英文字符、数字和特殊字符,5-30位,SHA256散列传输。
顾翔
2024/12/19
1110
使用ChatGPT生成登录产品代码的测试用例和测试脚本
python--从入门到实践--chapter 11 代码测试unittest
编写的代码需要测试是否有Bug 1.函数测试 city_functions.py def city_country(city, country): return str(city) + ',' + str(country) city_country_unittest.py import unittest #导入测试模块 from city_functions import city_country as cc class citytest(unittest.TestCase): def te
Michael阿明
2021/02/20
2060
python--从入门到实践--chapter 11 代码测试unittest
FastAPI(八十四)实战开发《在线课程学习系统》--个人信息接口测试
我们上一次分享了FastAPI(八十三)实战开发《在线课程学习系统》--登陆接口测试,这次我们看下登陆用户信息
雷子
2021/11/23
3820
新手必须掌握的Python Requests库接口测试(有实例代码)
在进行接口测试时,Python requests库是一个非常方便的工具。下面,我会详细描述使用Python requests库进行接口测试的全过程,并提供相应的代码实例。
苦叶子
2023/08/08
7830
新手必须掌握的Python Requests库接口测试(有实例代码)
基于Django的电子商务网站开发(连载16)
(1)通过循环语句formylist in self.mylists:遍历所有测试用例。
顾翔
2019/12/11
3820
基于Django的电子商务网站开发(连载13)
1. 接口测试 重新构造初始化数据。 loginConfig.xml <node> <case> <id>0</id> <username>Johnson</username> <password>000000</password> <email>Johnson@126.com</email> </case> <ca
顾翔
2019/12/11
3080
Python+request+unittest实现接口测试框架集成实例
大家知道很多接口测试工具可以实现对接口的测试,如postman、jmeter、fiddler等等,而且使用方便,那么为什么还要写代码实现接口自动化呢?工具虽然方便,但也不足之处:
测试小兵
2019/11/20
1.2K0
通过ChatGPT生成测试用例和测试脚本(2)
原因是,这些信息是通过javascript函数showerror(info)实现的,另外也发现在index.js中类似
顾翔
2024/11/28
1370
通过ChatGPT生成测试用例和测试脚本(2)
python接口测试之mock(九)
在http://www.cnblogs.com/weke/articles/6859021.html中对mock-server已经做了初步的介绍,今天这里继续接着之前的介绍进行,我们先看之前的mock-server部分,之前编写了一个登录的mock,具体json文件见如下的内容:
无涯WuYa
2018/10/25
1K0
python接口测试之mock(九)
接口测试2
可以看出通过unittest框架整理后的代码看起来很清晰,同时也支持多种不同的读取测试用例集以及运行测试用例的方法。
用户6367961
2019/09/29
5500
接口测试2
编写 Django 应用单元测试
我们博客功能越来越来完善了,但这也带来了一个问题,我们不敢轻易地修改已有功能的代码了!
HelloGitHub
2021/05/14
7800
python接口自动化(二十四)--unittest断言——中(详解)
  上一篇通过简单的案例给小伙伴们介绍了一下unittest断言,这篇我们将通过结合和围绕实际的工作来进行unittest的断言。这里以获取城市天气预报的接口为例,设计了 2 个用例,一个是查询北京的天气,一个是查询
北京-宏哥
2019/09/11
1.4K0
python接口自动化(二十四)--unittest断言——中(详解)
Python接口测试之数据驱动(二十)
在接口的自动化测试中,客户端发送请求给服务端,在客户端发送请求的时候,包含了请求地址,请求方法,以及请求参数等数据,那么在接口的自动化测试中如何来分离这些请求地址和请求参数了,最好的方式是以数据驱动的方式分离到excel中,这样在excel中直接维护,即使后期由于某些原因修改了请求参数,在excel中修改也是很快的。在下来的案例中,一个系统,请求登录成功后,服务端返回token给客户端,客户端再次请求的时候需要带着这个token。关于HTTP的请求流程,token,session这些的处理,在前面的文章中有很详细的介绍,这里就不再介绍,下面会直接引入代码实战这部分。
无涯WuYa
2018/10/25
8990
Python接口测试之数据驱动(二十)
在实际工作中使用requests+unittest进行接口测试
即使是接口测试,也是在研发人员完成项目开发后再进行的接口校验,其实更接近于验证一下接口功能是否正常实现了
冰霜
2022/03/15
4960
在实际工作中使用requests+unittest进行接口测试
软件安全性测试(连载22)
分布式拒绝服务攻击(Distributed denial of service attack:DDOS)可以使很多的计算机在同一时间遭受到攻击,使攻击的目标无法正常使用,分布式拒绝服务攻击已经出现了很多次,导致很多的大型网站都出现了无法进行操作的情况,这样不仅仅会影响用户的正常使用,同时造成的经济损失也是非常巨大的。
顾翔
2020/02/19
7230
软件安全性测试(连载22)
基于Django的电子商务网站开发(连载11)
在这里就测试方法上对本书第2.10节的基础上进行了一些优化,优化的方法主要是通过利用Python对数据库的访问以及接口测试相结合的方法来进行相应的测试。
顾翔
2019/12/11
8190
FastAPI(八十八)实战开发《在线课程学习系统》-- 查看留言列表接口测试和回复留言接口测试
我们上一次分享了FastAPI(八十七)实战开发《在线课程学习系统》-- 查看留言接口测试,这次我们看下查看留言列表接口测试和回复留言接口测试
雷子
2021/12/01
5130
GET/POST 请求区别详解(接口测试实战)
答:超文本传输协议。HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。
大龄老码农-昊然
2021/04/24
3.9K0
推荐阅读
相关推荐
ChatGPT与接口测试
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验