我的账户
啄木鸟学院

专注软件测试菁英教育

亲爱的游客,欢迎!

已有账号,请

如尚未注册?

接口测试—武浩杰—2021/3/18

[复制链接]
海底月是天上月学员认证 发表于 2021-3-18 18:41:08 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
使用python-requests包进行接口测试
单接口的测试
1.构造参数
2.发送请求
3.校验结果
# 加载包
import requests
# 百度搜索的接口,搜索时内容为requests
url = "http://www.baidu.com/s?wd=requests"
# 发送请求,将服务器返回的响应放到变量r中
r= requests.get(url)
# 打印文本格式的响应体
print(r.text)
# 对结果进行断言,判断关键字在不在结果中
# assert "Requests: 让 HTTP 服务人类 — Requests 2.18.1 文档" in r.text
# 金融项目注册接口测试
# get请求的参数拼接到URL的后面?key =value&key =value&key =value的格式
url="http://192.168.2.36:8089/futureloan/mvc/api/member/register?mobilephone=12345&pwd=12345"
r = requests.get(url)
print(r.text)
print(r.json())  # 如果响应体是json格式的,使用r.json()
print(r.json()['code'])  # r.json()后可以当作字典使用
assert r.json()['code'] == "20108"
assert r.json()['msg'] == "密码长度必须为6~18"
# get请求的参数,使用Params传递
url = "http://192.168.2.36:8089/futureloan/mvc/api/member/register"
cs = {
    "mobilephone" :"18829512803",
    "pwd":"12345",
    "regname":"hello"
}
# params 不能写错,只能是request中定义好的参数名
r = requests.get(url,params=cs)
print(r.text)
assert r.json()['code'] == "20108"
assert r.json()['msg'] == "密码长度必须为6~18"
print("状态码", r.status_code)
print("状态原因", r.reason)
print("响应头", r.headers)
print("cookies", r.cookies)
print("文本格式的响应体", r.text)
print("请求头", r.request.headers)

# 新知天气的接口
url = "https://api.seniverse.com/v3/weather/now.json?key=Sh-LsrOsCyo4vp8Tp&location=xian"
r = requests.get(url)
print(r.json())
# 西安
print(r.json()['results'][0]['location']['name'], end='当前的温度:')
# 温度
print(r.json()['results'][0]['now']['temperature'])
# 分割线
print("*"* 50)
# 获取用户列表
url = "http://192.168.2.36:8089/futureloan/mvc/api/member/list"
r = requests.get(url)
print(r.json())
print(r.request.headers) # 'User-Agent':'python-requests/2.25.1'
# 分割线
print("*"* 50)
# 设置User-Agent ,伪装成是浏览器发的请求
hds = {
   "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
}
r = requests.get(url,headers=hds)
print(r.json())
print(r.request.headers)
'''
用requests发送post请求
1.data传参,传的是表单格式式的参数
2.json传参,传的是json格式的参数
具体用data还是json传参,要看接口是如何实现的
'''
import requests
# 金融登录接口
url = "http://192.168.2.36:8089/futureloan/mvc/api/member/login"
cs = {
"mobilephone" :"18829512803",
    "pwd":"123456789"
}
# 用data传参
r = requests.post(url,data=cs)
print(r.text)
# 请求头中,‘Content-Type’:‘application/x-www-form-urlencoded’
print(r.request.headers)

# 用json传参
r = requests.post(url,json= cs)
print(r.text) # 手机号不能为空,这个接口不支持用json的方式传参,参数未识别出来
# 请求头中,‘Content-Type’:‘application/json'
print(r.request.headers)
# 租车系统登录接口(没有接口文档,但是有界面时,可以通过操作界面抓取接口)
url="http://192.168.2.36:8089/carRental/login/login.action"
cs = {
    "loginname":"admin",
    "pwd": "123456"
}
r = requests.post(url,data=cs)
print(r.text)
assert "<title>首页-汽车出租系统</title>" in r.text
# print(r.request.headers)
'''
上传文件
files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload.
        ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')``
        or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)`
'''
import requests

# 接口测试的网站, 用户发送请求 ,该网站把收到的请求,
# 组成json格式的响应,返回给用户
# /post 是post方法
# /get 是get方法
# /delete 是delete方法
url = "http://www.httpbin.org/post"
cs= {
    "user" : "admin",
    "e-mail": "123213@qq.com"
}
path = "e:/test.txt"
with open(path, mode='r') as f:
    fs = {
        # "file1" 上传接口的参数名,是接口定义的
        "file1": (path, f),#二元组:(文件名字,文件对象)
        "file2": (path, f ,"text/plain") # 三元组(文件名字,文件对象,文件类型)
    }
    r = requests.post(url, data=cs, files=fs)
    print(r.text)
# 租车系统,添加车辆时,先上传车辆的图片
path = "e:/test.jpg"
url = "http://192.168.2.36:8089/carRental/file/uploadFile.action"
with open(path,mode='rb') as f:
    fs = {
        "mf" : (path,f ,"image/jpg")  # 三元组(文件名字,文件对象,文件类型)
    }
    r = requests.post(url,data=cs ,files=fs)
    print(r.text)
    assert "2021-03-18" in r.json()['data']['src']

# 分割线
print("*"* 50)
# 一次上传多个文件
url="http://www.httpbin.org/post"
path1 = "e:/test.txt"
path2 = "e:/test.jpg"
with open (path1,mode='r') as f1:
    with open(path2,mode='rb') as f2:
        fs={
            "f1":"(path1,f1)",
            "f2": (path2,f2,"image/jpg")
        }
        r = requests.post(url, files=fs)
        print(r.text)
        '''
设置cookie
'''
import  requests
# 没有登录的情况下,访问该接口,会跳转到登录页面
url = "https://www.bagevent.com/account/dashboard"
r = requests.get(url)
print(r.text)

# 使用界面登录后,服务器返回的cookie信息,访问该接口,返回登录后的统计页面
hds = {
    "Cookie": '_ga=GA1.2.898728043.1615965992; _gid=GA1.2.872824269.1615965992; Hm_lvt_1fc37bec18db735c69ebe77d923b3ab9=1615965992; __auc=13ad1c891783f1445b1a072ed33; sdktoken=68edd18e335220d175f0bf64b259c6f5; uid=ef965a462d80fd4d62c3d118fe742e20; nickName=undefined; avatar=undefined; MEIQIA_TRACK_ID=1psK7g7yqqODa45WOXfKCti4C9P; BAGSESSIONID=02afdf9b-261c-4436-b259-4ddd02e0ca52; JSESSIONID=79B179498FBB86DE1EDDBB623F22A614; __asc=c76a6638178441def3c8c64462f; MEIQIA_VISIT_ID=1pv512xOjWnzNuo9ihmWU9LF9Pa; Hm_lpvt_1fc37bec18db735c69ebe77d923b3ab9=1616050526; _gat=1; BAG_EVENT_TOKEN_=02de735f68204d51009e7edda78e58c13a3fcdd1; BAG_EVENT_CK_KEY_="2780487875@qq.com"; BAG_EVENT_CK_TOKEN_=2440f5d17af838308ba4b390db81af38'
    }
r = requests.get(url,headers=hds)
print(r.text)
        '''
自动管理cookie的机制,创建一个session = requests.session(), 自动维护cookie信息
'''
import requests
s = requests.session()  # 创建session
print("登录之前的cookie信息:",s.cookies)

#百格登录的接口
url = "https://www.bagevent.com/user/login"
cs = {
    "access_type": 1,
    "loginType":   1,
    "emailLoginWay": 0,
    "account": "2780487875@qq.com ",
    "password": "qq2780487875",
    "remindmeBox": "on",
    "remindme":    1}
r = s.post(url, data=cs)  #用session 发送请求
assert "<title>百格活动 - 账户总览</title>" in r.text
# 分割线
print("*"* 50)
print("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=")

print("登录之后的cookie信息:",s.cookies)
# 百格查询的接口
url = "https://www.bagevent.com/account/dashboard"
r = s.get(url)
# print(r.text)
assert "<title>百格活动 - 账户总览</title>" in r.text

# 退出登录
url = "https://www.bagevent.com/user/login_out "
r = s.get(url)
print("退出登录之后的cookie的信息:", s.cookies)
# RequestsCookieJar  转成字典
ts = requests.utils.dict_from_cookiejar(s.cookies)
print(ts)
for k, v in ts.items():# 遍历字典
    print(k, ":", v)
tianGan = ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
diZhi = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]

for i in range(10):
    print(tianGan [i%10] +diZhi[i%12],end=" ")
    if i !=0 and i%10 ==9:
        print()
    # for j in range(12):
    #     print(tianGan+diZhi[j])
        '''
timeout参数,设置请求的超时时间
1.接口执行耗时比较久,默认的超时时间内执行不完。比如上传一个2G的大文件
2.接口的性能要求,接口在xxms内返回结果。如果xx ms,认为性能不符合要求
'''
import requests

#淘宝查询手机号码归属地的接口
# tcc.taobao.com/cc/json/mobile_tel_segment.htm
url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=18012345678"
# 该接口是否能在200 ms返回结果
for i in range(10):
    try:
        r = requests.get(url, timeout=0.2) #Connection to tcc.taobao.com timed out
        #print(r.text)
        print(r.status_code)
    except Exception as e:
        print(e)
'''
设置代理抓包
1.界面执行是正确的
2.接口执行时有问题
分别抓取界面执行过程的包,以及脚本执行过程的包,对比差异来定位问题
'''
print("*"*50)
proxy = {
    "http":"http://127.0.0.1:8888", # 协议:代理地址
    "https":"http://127.0.0.1:8888"
}
requests.get("http://www.baidu.com",proxies = proxy)
print(r.status_code)

# 证书校验失败:certificate verify failed ,设置verify= False 不去校验证书
# 执行时会出现警告,InsecureRequestWarning,不影响执行
r= requests.get("https://www.bagevent.com",proxies=proxy,verify= False)
print(r.status_code)


回复

使用道具 举报

关注0

粉丝0

帖子30

发布主题
大家都在学
课堂讨论
一周热帖排行最近7x24小时热帖
关注我们
专注软件测试菁英教育

客服电话:17792550360

客服时间:9:00-21:00

卓目鸟学苑 - 专注软件测试菁英教育!( 陕ICP备2025058934号-2 )

版权所有 © 西安菁英教育科技有限公司 2023-2026