做接口测试,首先最重要的就是将有业务关联的接口先做出来,先确保正常的业务场景能够运行。所以需要做接口的串联。
使用变量
在做业务流程中,最基础的流程是注册,登录能够跑通。
- 使用随机的手机号码注册用户
- 使用同一个手机号登录用户
先生成一个手机号。
import random# 随机生成手机号码phone = random.randint(13000000000,13999999999)
然后再在代码中使用 phone 变量来引用生成的数据。
import requestsimport 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 requestsdef 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 = 10def f2():print(n)if __name__ == '__main__':f1()f2()
f1 函数中设置变量n 变量n 只在 f1 函数内有效。
f2函数 尝试取 n的值。 取不到。 上面代码执行会报错。
函数之间如果需要将值进行传递。 可以使用字典格式数据进行传递
字典格式数据传参
import randomjsondata = {"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 randomdef 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 requestsimport 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提取出来,放在列表中,随机选择一个。
