做接口测试,首先最重要的就是将有业务关联的接口先做出来,先确保正常的业务场景能够运行。所以需要做接口的串联。
使用变量
在做业务流程中,最基础的流程是注册,登录能够跑通。
- 使用随机的手机号码注册用户
- 使用同一个手机号登录用户
先生成一个手机号。
import random
# 随机生成手机号码
phone = random.randint(13000000000,13999999999)
然后再在代码中使用 phone 变量来引用生成的数据。
import requests
import random
# 随机生成手机号码
phone = random.randint(13000000000,13999999999)
def test_register():
# 定义注册用户的地址
url = "http://49.233.108.117:28019/api/v1/user/register"
# 定义请求数据
bodydata = {
"loginName": str(phone),
"password": "123456"
}
# 发送请求 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"
}
r = requests.post(url, json=bodydata)
print(r.status_code)
print(r.json())
运行
需要两个测试用例一起运行,所以运行的时候,在文件上右键—执行
可以看到执行结果。
定制信息头
在搜索商品接口中,需要将token值放在header中。
请求中有信息头,信息头中包含token值,将信息头的数据放在字典中。执行的时候通过 headers 传入信息头
import requests
def test_search():
url = "http://49.233.108.117:28019/api/v1/search"
# 信息头数据
headerdata = {
"token": "1710369a7e2139c05a3e0aaa523b4836"
}
# 请求参数
querydata = {
"keyword": "iphone"
}
# 发送get 请求 params get请求的参数, headers 请求头数据
r = requests.get(url=url,params=querydata,headers=headerdata)
print(r.status_code)
print(r.json())
- requests.get 发送get请求
- params= get的请求参数, 固定格式。
- headers= 请求中的 信息头数据, 固定格式。
执行请求,可以看到执行结果。
参数串联
登录成功之后,会获取到服务器返回的结果,返回接口中有 token 值,需要将token 值提取出来。
搜索接口需要使用到登录接口的token值
函数内的数据 只在函数内部有效。
比如如下代码
def f1():
n = 10
def f2():
print(n)
if __name__ == '__main__':
f1()
f2()
f1 函数中设置变量n 变量n 只在 f1 函数内有效。
f2函数 尝试取 n的值。 取不到。 上面代码执行会报错。
函数之间如果需要将值进行传递。 可以使用字典格式数据进行传递
字典格式数据传参
import random
jsondata = {
"n": 0
}
def f1():
# 设置jsondata字典中字段n的值
jsondata["n"] = random.randint(0,100)
print(f'f1 {jsondata["n"]}')
def f2():
# 通过字典方式来引用 jsondata["n"] 的值
print(f'f2 {jsondata["n"]}')
if __name__ == '__main__':
f1()
f2()
在函数外部 先定义一个字典,
f1 函数中更改 字典中jsondata[“n”] 的值
f2 函数中通过引用 jsondata[“n”] 来获取最新值。
执行,可以看到结果。
文本保存数据方式
可以在第一个函数中将数据保存到 一个文件中,
在第二个函数中通过去读取文件的内容进行上下游传参。
import random
def f1():
n = random.randint(0,100)
print(n, type(n))
with open('data.txt',mode='w',encoding='utf8') as f:
f.write(str(n))
def f2():
with open('data.txt',mode='r',encoding='utf8') as f:
n = f.read()
print(n,type(n))
if __name__ == '__main__':
f1()
f2()
将数据保存到文件中
读取文件内容进行参数传递。
这种方式不推荐大家使用,存到文件的时候数据格式都是文本,再提取出来如果数据格式需要改变还要再次处理,比较麻烦。
总结
在进行参数传递的时候,我们使用 字典格式数据进行传参。
import requests
import random
# 随机生成手机号码
phone = random.randint(13000000000,13999999999)
jsondata = {
"token":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())
实战
上面接口完成了注册登录操作,以及搜索,现在已经将服务器返回的token值作为变量能够上下游传参。
在搜索接口中,服务器返回结果中 很多商品id。添加购物车,需要使用商品的id。还需要在搜索接口中随机选择一个商品id作为参数。
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提取出来,放在列表中,随机选择一个。