做接口测试,首先最重要的就是将有业务关联的接口先做出来,先确保正常的业务场景能够运行。所以需要做接口的串联。

使用变量

在做业务流程中,最基础的流程是注册,登录能够跑通。

  1. 使用随机的手机号码注册用户
  2. 使用同一个手机号登录用户

先生成一个手机号。

  1. import random
  2. # 随机生成手机号码
  3. phone = random.randint(13000000000,13999999999)

然后再在代码中使用 phone 变量来引用生成的数据。

  1. import requests
  2. import random
  3. # 随机生成手机号码
  4. phone = random.randint(13000000000,13999999999)
  5. def test_register():
  6. # 定义注册用户的地址
  7. url = "http://49.233.108.117:28019/api/v1/user/register"
  8. # 定义请求数据
  9. bodydata = {
  10. "loginName": str(phone),
  11. "password": "123456"
  12. }
  13. # 发送请求 url= 表示请求地址, json= 请求数据为json格式
  14. r = requests.post(url=url, json=bodydata)
  15. # r 是整个服务器返回的结果
  16. print("状态码:", r.status_code)
  17. # 服务器返回结果
  18. print("结果:", r.json())
  19. def test_login():
  20. url = "http://49.233.108.117:28019/api/v1/user/login"
  21. bodydata = {
  22. "loginName": str(phone),
  23. "passwordMd5": "E10ADC3949BA59ABBE56E057F20F883E"
  24. }
  25. r = requests.post(url, json=bodydata)
  26. print(r.status_code)
  27. print(r.json())

运行

需要两个测试用例一起运行,所以运行的时候,在文件上右键—执行
image.png
可以看到执行结果。
image.png

定制信息头

在搜索商品接口中,需要将token值放在header中。
image.png
请求中有信息头,信息头中包含token值,将信息头的数据放在字典中。执行的时候通过 headers 传入信息头

  1. import requests
  2. def test_search():
  3. url = "http://49.233.108.117:28019/api/v1/search"
  4. # 信息头数据
  5. headerdata = {
  6. "token": "1710369a7e2139c05a3e0aaa523b4836"
  7. }
  8. # 请求参数
  9. querydata = {
  10. "keyword": "iphone"
  11. }
  12. # 发送get 请求 params get请求的参数, headers 请求头数据
  13. r = requests.get(url=url,params=querydata,headers=headerdata)
  14. print(r.status_code)
  15. print(r.json())
  • requests.get 发送get请求
    • params= get的请求参数, 固定格式。
    • headers= 请求中的 信息头数据, 固定格式。

执行请求,可以看到执行结果。
image.png

参数串联

登录成功之后,会获取到服务器返回的结果,返回接口中有 token 值,需要将token 值提取出来。
搜索接口需要使用到登录接口的token值
接口串联-上下游传参 - 图5
函数内的数据 只在函数内部有效。
比如如下代码

  1. def f1():
  2. n = 10
  3. def f2():
  4. print(n)
  5. if __name__ == '__main__':
  6. f1()
  7. f2()

f1 函数中设置变量n 变量n 只在 f1 函数内有效。
f2函数 尝试取 n的值。 取不到。 上面代码执行会报错。
image.png
函数之间如果需要将值进行传递。 可以使用字典格式数据进行传递

字典格式数据传参

  1. import random
  2. jsondata = {
  3. "n": 0
  4. }
  5. def f1():
  6. # 设置jsondata字典中字段n的值
  7. jsondata["n"] = random.randint(0,100)
  8. print(f'f1 {jsondata["n"]}')
  9. def f2():
  10. # 通过字典方式来引用 jsondata["n"] 的值
  11. print(f'f2 {jsondata["n"]}')
  12. if __name__ == '__main__':
  13. f1()
  14. f2()

在函数外部 先定义一个字典,
f1 函数中更改 字典中jsondata[“n”] 的值
f2 函数中通过引用 jsondata[“n”] 来获取最新值。
执行,可以看到结果。
image.png

文本保存数据方式

可以在第一个函数中将数据保存到 一个文件中,
在第二个函数中通过去读取文件的内容进行上下游传参。

  1. import random
  2. def f1():
  3. n = random.randint(0,100)
  4. print(n, type(n))
  5. with open('data.txt',mode='w',encoding='utf8') as f:
  6. f.write(str(n))
  7. def f2():
  8. with open('data.txt',mode='r',encoding='utf8') as f:
  9. n = f.read()
  10. print(n,type(n))
  11. if __name__ == '__main__':
  12. f1()
  13. f2()

将数据保存到文件中
读取文件内容进行参数传递。
这种方式不推荐大家使用,存到文件的时候数据格式都是文本,再提取出来如果数据格式需要改变还要再次处理,比较麻烦。
image.png

总结

在进行参数传递的时候,我们使用 字典格式数据进行传参。

  1. import requests
  2. import random
  3. # 随机生成手机号码
  4. phone = random.randint(13000000000,13999999999)
  5. jsondata = {
  6. "token":None
  7. }
  8. def test_register():
  9. # 定义注册用户的地址
  10. url = "http://49.233.108.117:28019/api/v1/user/register"
  11. # 定义请求数据
  12. bodydata = {
  13. "loginName": str(phone),
  14. "password": "123456"
  15. }
  16. print(bodydata)
  17. # 发送请求 url= 表示请求地址, json= 请求数据为json格式
  18. r = requests.post(url=url, json=bodydata)
  19. # r 是整个服务器返回的结果
  20. print("状态码:", r.status_code)
  21. # 服务器返回结果
  22. print("结果:", r.json())
  23. def test_login():
  24. url = "http://49.233.108.117:28019/api/v1/user/login"
  25. bodydata = {
  26. "loginName": str(phone),
  27. "passwordMd5": "E10ADC3949BA59ABBE56E057F20F883E"
  28. }
  29. print(bodydata)
  30. r = requests.post(url, json=bodydata)
  31. print(r.status_code)
  32. print(r.json())
  33. # 将token提取出来 放在 字典格式数据中 - 上游传参
  34. jsondata["token"] = r.json()["data"]
  35. def test_search():
  36. url = "http://49.233.108.117:28019/api/v1/search"
  37. # 信息头数据 下游接口中使用到这个值
  38. headerdata = {
  39. "token": jsondata["token"]
  40. }
  41. # 请求参数
  42. querydata = {
  43. "keyword": "iphone"
  44. }
  45. # 发送get 请求 params get请求的参数, headers 请求头数据
  46. r = requests.get(url=url,params=querydata,headers=headerdata)
  47. print(r.status_code)
  48. print(r.json())

实战

上面接口完成了注册登录操作,以及搜索,现在已经将服务器返回的token值作为变量能够上下游传参。
在搜索接口中,服务器返回结果中 很多商品id。添加购物车,需要使用商品的id。还需要在搜索接口中随机选择一个商品id作为参数。
接口串联-上下游传参 - 图9


import requests
import random
# 随机生成手机号码
phone = random.randint(13000000000,13999999999)
jsondata = {
    "token":None,
    "goodsid":None,
}

def test_register():
    # 定义注册用户的地址
    url = "http://49.233.108.117:28019/api/v1/user/register"
    # 定义请求数据
    bodydata = {
        "loginName": str(phone),
        "password": "123456"
    }
    print(bodydata)
    # 发送请求  url= 表示请求地址, json= 请求数据为json格式
    r = requests.post(url=url, json=bodydata)
    # r 是整个服务器返回的结果
    print("状态码:", r.status_code)
    # 服务器返回结果
    print("结果:", r.json())

def test_login():
    url = "http://49.233.108.117:28019/api/v1/user/login"
    bodydata = {
        "loginName": str(phone),
        "passwordMd5": "E10ADC3949BA59ABBE56E057F20F883E"
    }
    print(bodydata)
    r = requests.post(url, json=bodydata)
    print(r.status_code)
    print(r.json())
    # 将token提取出来 放在 字典格式数据中  - 上游传参
    jsondata["token"] = r.json()["data"]

def test_search():
    url = "http://49.233.108.117:28019/api/v1/search"
    # 信息头数据  下游接口中使用到这个值
    headerdata = {
        "token": jsondata["token"]
    }

    # 请求参数
    querydata = {
        "keyword": "iphone"
    }
    # 发送get 请求 params get请求的参数, headers 请求头数据
    r = requests.get(url=url,params=querydata,headers=headerdata)
    print(r.status_code)
    print(r.json())
    # 所有的商品 存放在一个列表中
    all_goods = r.json()['data']['list']
    # 创建空的列表
    gids = []
    # 循环列表 拿到每一个商品
    for goods in all_goods:
        # 从商品中访问 goodsId
        gid = goods["goodsId"]
        print(gid)
        # 将商品id 放在列表中
        gids.append(gid)
    # 循环结束 可以看到所有的商品id
    print(gids)
    # 随机选择一个 作为参数
    jsondata["goodsid"] = random.choice(gids)

def test_add_cart():
    url = "http://49.233.108.117:28019/api/v1/shop-cart"
    # 信息头数据  下游接口中使用到这个值
    headerdata = {
        "token": jsondata["token"]
    }
    bodydata = {
        "goodsCount": random.randint(1,5),
        "goodsId": jsondata["goodsid"]
    }
    r = requests.post(url,json=bodydata,headers=headerdata)
    print(r.status_code)
    print(r.json())

通过循环列表的方式,从结果中将商品id提取出来,放在列表中,随机选择一个。