接口串联

在做一些有业务关联的接口时 需要接口之间进行数据传递。
上下游传参 - 图1
这两个接口在做测试的时候,需要接口串联, 每次生成的topic_id值都不一样,需要动态从上游接口中提取出来传递给下游接口。


在接口串联之间,先说明一下 函数中参数的作用域。

函数内部定义的变量

  1. # 定义变量a
  2. a = 10
  3. def f1():
  4. a = 20 # 函数内部定义变量 a
  5. print(f"f1-a {a}")
  6. if __name__ == '__main__':
  7. f1()

代码执行结果为20
image.png
因为f1 函数内部 a=20 执行函数的时候,如果函数内部定义的有变量,函数在运行的过程中,会优先使用函数内部定义的变量。 所以执行结果为20。

# 定义变量a
a = 10
def f1():
    a = 20  # 函数内部定义变量 a  这个 a的值 只在 函数内有效。
    print(f"f1-a {a}")

print(f"文件中的a的值 {a}")  # 10

if __name__ == '__main__':
    f1()

# 定义变量a
a = 10
def f1():
    a = 20  # 函数内部定义变量 a  这个 a的值 只在 函数内有效。
    print(f"f1-a {a}")

def f2():
    print(f"a的值为 {a}")

# print(f"文件中的a的值 {a}")  # 10

if __name__ == '__main__':
    f1()
    f2()  # 10  取文件中定义的a的值

字典值跨函数使用

# 随机函数
import random
# 定义字典  可以通过修改 key 对应的value
data = {
    "rn": None
}

def f1():
    # 随机生成一个数字
    num = random.randint(1,100000)
    # 修改字典中 rn字段的值
    data["rn"] = num
    print(f'f1 生成随机数字 {num}')

def f2():
    """
    需要将 f1函数中生成 随机数字 传递过来,进行使用。
    :return:
    """
    print(f'f2 使用f1生成的随机数字:{data["rn"]}')

if __name__ == '__main__':
    f1()
    f2()

image.png


字典类型中数据 是可变类型。主要就是通过使用这种可变方式的特性,在上游接口中更改字典中对应字段的值,在下游接口中引用字典字段的值。 通过字典数据的方式来进行参数串联。


接口中的参数串联

利用字典的特性,实现CNnode 主要接口的参数串联。

"""
cnode 社区接口作业
"""
import requests

# 定义请求地址前缀
baseurl = "http://47.100.175.62:3000/api/v1"
token = "e80fce05-b85c-445e-a26e-66172deffb24"
# 预先定义字典格式的数据
test_data={
    "topic_id":"",   # 需要进行上下游传参的字段  初始值为 空字符串
    "reply_id":""   # 评论id 需要进行上下游传参,  初始值设置为 空字符
}

def test_add_topic():
    """
    创建话题
    :return:
    """
    url = baseurl+"/topics"
    body_data = {
        "accesstoken": token,
        "title":"hehehehehehe",
        "tab":"ask",
        "content":"xxxxxxxxxxxx"
    }
    r = requests.post(url,json=body_data)
    print("新建主题:",r.status_code,r.json())
    # 从返回结果中提起 话题的id
    tid = r.json()["topic_id"]
    # 将提取出来的值tid 更新到 外边定义的字典中 test_data[”topic_id”]
    test_data["topic_id"] = tid  # 上游更新值


def test_edit_topic():
    """
    编辑话题
    :return:
    """
    url = baseurl + "/topics/update"
    body_data = {
        "accesstoken": token,
        # "topic_id":"625cc91ceb0fc111c4a0d584",
        "topic_id": test_data["topic_id"] ,   # 通过字典 topic_id 字段引用最新的值。
        "title": "hehehehehehe",
        "tab": "ask",
        "content": "xxxxxxxxxxxx"
    }
    r = requests.post(url, json=body_data)
    print("编辑主题:", r.status_code, r.json())


def test_collect_topic():
    """
    收藏话题
    :return:
    """
    url = baseurl + "/topic_collect/collect"
    body_data = {
        "accesstoken": token,
        # "topic_id":"625cc91ceb0fc111c4a0d584"
        "topic_id": test_data["topic_id"]
    }
    r = requests.post(url, json=body_data)
    print("收藏主题:", r.status_code, r.json())

def test_uncollect_topic():
    """
    取消收藏
    :return:
    """
    url = baseurl + "/topic_collect/de_collect"
    body_data = {
        "accesstoken": token,
        # "topic_id": "625cc91ceb0fc111c4a0d584"
        "topic_id": test_data["topic_id"]
    }
    r = requests.post(url, json=body_data)
    print("取消主题:", r.status_code, r.json())

def test_reply_topic():
    """
    评论话题
    :return:
    """
    url = baseurl + "/topic/625cc91ceb0fc111c4a0d584/replies"
    body_data = {
        "accesstoken": token,
        "content": "helloworld"
    }
    r = requests.post(url, json=body_data)
    print("新建评论:", r.status_code, r.json())
    # 从结果中提取 评论id
    rid = r.json()["reply_id"]
    # 将提取到的值更新到字典中
    test_data["reply_id"] = rid

def test_up():
    """
    点赞
    :return:
    """
    # url = baseurl + "/reply/625cca2ceb0fc111c4a0d5e4/ups"
    # 引用变量
    url = baseurl + f'/reply/{test_data["reply_id"]}/ups'
    body_data = {
        "accesstoken": token
    }
    r = requests.post(url, json=body_data)
    print("为评论点赞:", r.status_code, r.json())


if __name__ == '__main__':
    print("现在开始进行cnode社区主要接口流程测试:")
    test_add_topic()
    test_edit_topic()
    test_collect_topic()
    test_uncollect_topic()
    test_reply_topic()
    test_up()

新丰商城中接口串联

# 导入生成的手机号
from common.utils import generate_phone
import requests
# 1. 设置手机号 后面函数中使用手机号 都从这里获取
phone = generate_phone()
# 定义字典
test_data = {
    "token":None,  # 存放token
    "goodsid":None
}

# 用户注册
def test_register():
    url = "http://49.233.108.117:28019/api/v1/user/register"
    body_data = {
        "loginName": phone,
        "password": "123456"
    }
    print(f"使用数据进行注册:{body_data}")
    r = requests.post(url,json=body_data)
    # 打印请求的信息头
    print("注册的请求头", r.request.headers)
    # 打印返回结果
    print("注册结果", r.json())

# 用户登录
def test_login():
    url = "http://49.233.108.117:28019/api/v1/user/login"
    body_data = {
      "loginName": phone,
      "passwordMd5": "E10ADC3949BA59ABBE56E057F20F883E"
    }
    print(f'使用数据进行登录 {body_data}')
    r = requests.post(url,json=body_data)
    # 打印出响应状态码 服务器返回结果
    print("登录结果返回结果",r.status_code,r.json())
    # 登陆成功 之后将token 设置变量 r.json()["data"] 返回结果中的token值
    test_data["token"] = r.json()["data"]  # 更改testdata["token"] 的值

def test_search():
    url = "http://49.233.108.117:28019/api/v1/search"
    query_data={
        "keyword":"iphone"
    }
    token_header={
        "token": test_data["token"] # 引用testdata["token"] 值
    }
    print('查询结果中的请求头',token_header)
    r = requests.get(url,params=query_data,headers=token_header)
    print('查询结果: ',r.json())

if __name__ == '__main__':
    # 注册和登录的时候需要使用到同一个手机号码
    test_register()
    test_login()
    test_search()

其他上下游传参方式

使用return返回值

# 随机函数
import random
# # 定义字典  可以通过修改 key 对应的value
# data = {
#     "rn": 0
# }


def f1():
    # 随机生成一个数字
    num = random.randint(1,100000)
    # 修改字典中 rn字段的值
    # data.append(num)
    print(f'f1 生成随机数字 {num}')
    return num

def f2():
    """
    需要将 f1函数中生成 随机数字 传递过来,进行使用。
    :return:
    """
    num = f1()
    print(f'f2 使用f1生成的随机数字:{num}')

def f3():
    """
    需要将 f1函数中生成 随机数字 传递过来,进行使用。
    :return:
    """
    num = f1()
    print(f'f3 使用f1生成的随机数字:{num}')

if __name__ == '__main__':
    f1()
    f2()
    f3()

通过return 返回值 也可以传参 但是f1会执行多次
image.png

使用global 关键字

global 可以将局部变量设置为全局变量

# 随机函数
import random

def f1():
    global num # 将局部变量设置全局变量
    # 随机生成一个数字
    num = random.randint(1,100000)

    print(f'f1 生成随机数字 {num}')


def f2():
    """
    需要将 f1函数中生成 随机数字 传递过来,进行使用。
    :return:
    """
    print(f'f2 使用f1生成的随机数字:{num}')


if __name__ == '__main__':
    f1()
    f2()

image.png
global 可以将局部变量设置为全局变量。
缺点就是 你在写代码引用变量的时候,不会有代码提示, 容易写错。

通过文件存储

将参数写入文件中。

# 随机函数
import random

def f1():
    # 随机生成一个数字
    num = random.randint(1,100000)
    # 将数据写入到 文件中
    with open('./data.txt',mode='w') as file:
        file.write(str(num))
    print(f'f1 生成随机数字 {num}')


def f2():
    """
    需要将 f1函数中生成 随机数字 传递过来,进行使用。
    :return:
    """
    with open('./data.txt',mode='r') as file:
        num = file.read()
    print(f'f2 使用f1生成的随机数字:{num}')


if __name__ == '__main__':
    f1()
    f2()

这样做 每次都要读写文件 比较麻烦。

最后

建议大家使用字典的方式。

python pytest框架.mp4 (928.52MB)Python pytest .mp4 (2.16GB)