51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

测试开发精英班,通向高级软件测试工程师【好消息】企业内训服务上线啦!项目为王,自动化测试提升加速器 !横扫BAT,Python全栈测试开发技能大全
【第122期】:如何入门接口自动化测试!参与调查问卷 缔造行业趋势 月薪15K+的测试开发必备技能? 【活动】为视频UP主打CALL,互动领福利!
查看: 765|回复: 0

[原创] 使用requests通过代码实现接口测试自动化

[复制链接]
  • TA的每日心情

    2021-9-6 09:30
  • 签到天数: 537 天

    连续签到: 1 天

    [LV.9]测试副司令

    发表于 2021-4-29 17:47:57 | 显示全部楼层 |阅读模式
    前言
      接口测试是我们在测试工作中经常见到的,我们工作中常用到的接口工具有jmeter,postman,soupUI等工具,那么在通过代码做接口测试呢?或者通过代码的方式做接口自动化呢?

      requests
      requests属于python的第三方库,通常用来发送http和https的请求,既然能向http和https发送请求,那么就能来做接口测试。

      安装
    pip install requests


      官方文档
      https://requests.readthedocs.io/en/master/

      requests使用方法
      了解requests是如何安装的了,也知道了requests的安装方法了,那么接下来就开始进行实际操作了。

      get请求
      都知道https请求方式有很多种,如何通过requests来发送get请求呢?这里安静通过模仿[url=]百度[/url]搜索内容进行发送请求。
      其中get方法中存在3个参数:url和params,其中url表示我们请求的地址,params表示请求参数(get方式的请求存在url地址中),headers表示请求头信息内容。
    import requests
    url = 'http://www.baidu.com/s'
    headers = {
        "User-Agent": "Mozilla/5.0 (WindowsNT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
    }
    params = {
        "wd": "测试-安静"
    }
    r = requests.get(url=url, params=params,headers=headers)
    print(r)
    print(r.url)
    if '测试-安静' in r.content.decode('utf-8'):
        print('请求成功!')




      通过执行结果是成功的。


      其中requests的返回内容还有很多种,上面介绍的url,和content只是其中两种。
    r.status_code     #响应状态码
    r.content           #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
    r.headers          # 请求头信息
    r.json()             # Requests中SON
    r.url                  # 获取url
    r.encoding         # 编码格式
    r.cookies           # 获取cookie
    r.text               #字符串方式的响应体




      post请求
      post请求和get请求类似。post的参数主要有url、data(json)、headers。
      · url:请求接口地址
      · data:post请求参数类型
      · json:post请求参数类型
      · headers:请求头信息
      这里安静通过请求查询天气的接口来模拟post请求。

      data请求
    import requests
    # 登录请求地址
    url = 'http://apis.juhe.cn/simpleWeather/query'
    # 请求头
    headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
    }
    # body数据
    data = {
            'city': "上海",   # 账号
            "key": "331eab8f3481f37868378fcdc76cb7cd",  # 密码
    }
    # 发送请求
    r = requests.post(url, headers=headers, data=data)
    print(r.text)







      通过执行发现,已经请求成功,并返回了响应结果。


      json请求
    import requests
    url ="http://httpbin.org/post"
    # 添加json数据
    json = {
        "username":"AnJing",
        "password":"123456"
    }
    # 通过json方式添加数据
    r =requests.post(url,json=json)
    print(r.text)





      通过执行结果可以看出我们请求的接口类型。


      请求HTTPS
      现在的网站都是HTTPS的了,所谓的HTTPS就是加密过的网站,在原有的HTTP的基础上加上了SSL。HTTPS的请求基本上都是属于SSL加密的,那么对于这种HTTPS的请求,如果我们通过requests的请求进行访问,会报一个requests.exceptions.SSLError的错误。


      对于这种问题,我们可以通过加入参数“verify=False”,requests请求时,verify默认为True,当设置False时,requests请求会进行忽略SSL,从而进行访问HTTPS请求。
    import requests
    url ="https://www.51testing.org/htm/brandpc/PZ.html"
    r = requests.get(url, verify=False)
    print(r.text)



      通过加入参数后,在去执行的时候就不会报SSLerror的错误了。

      session
      关于session相信大家都不陌生,他和cookies一样使用来表示用户的登录的一种信息,cookies通常保存在客户端的,session保存在服务端上。其中session可以相当于一个虚拟的[url=]浏览器[/url],用来保持登录的状态。requests中有单独方法  requests.session()  的方法用来保存登录状态。当然requests中有关于对cookies的登录,我们可以通过cookies加入到请求中,然后用来模拟登录场景。然后在去请求其他页面,可以看看到底我们的会话有没有保存成功。这里通过模拟博客园的场景进行来操作cookies登录。
      首先通过Fiddler进行抓取登录前和登录后的cookies值来判断博客园的登录到底是通过什么进行来登录的。

      登录前的cookies


      登录后的cookies


      通过使用fiddler抓取,我们已经招到了登录的cookies内容,然后通过requests中的cookies进行来添加。具体代码:
    # coding:utf-8
    import requests
    import urllib3
    urllib3.disable_warnings()
    s = requests.session()
    s.verify = False  
    url = 'https://passport.cnblogs.com/user/signin'

    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"
    }
    r = s.get(url,headers=headers)
    cooks = {
        ".Cnblogs.AspNetCore.Cookies":"这里写入抓取到的cookies值",
        ".CNBlogsCookie":"抓取到的cookies值"
    }
    c = requests.cookies.RequestsCookieJar()
    # 登陆有效的cookies
    c.set(".CNBlogsCookie", cooks[".CNBlogsCookie"])
    c.set(".Cnblogs.AspNetCore.Cookies", cooks[".Cnblogs.AspNetCore.Cookies"])
    # 将cookies值全部添加到session中
    s.cookies.update(c)
    # 访问后台地址,确定是否登录成功
    url1 = "https://i.cnblogs.com/posts/edit"
    r1 = s.get(url1)
    result = r1.content.decode('utf-8')
    if "博客后台 - 博客园" in result:
        print("登录成功!")



      通过执行发现,我们已经完成了登录后,并通过session的形式进行访问本网站的其他地址一样是保持着登录的状态。



      重定向
      接口测试中也经常遇到重定向的问题,什么是重定向?就是通过各种方法将各种网络请求重新定个方向转到其它位置。在requests中也有这对重定向的操作allow_redirects其中参数默认是True就是允许重定向,当我们请求的时候,将这个参数设置成False,就能不让其进行重定向。
    # coding:utf-8
    import requests
    url = 'http://github.com'
    # 重定向为False
    r = requests.get(url, allow_redirects=False)
    print('拒绝重定向请求的状态码:%s'%(r.status_code))
    print('拒绝重定向请求地址:%s'%(r.url))
    # 重定向为True(默认为True)
    r2 = requests.get(url)
    print('允许重定向请求的状态码:%s'%(r2.status_code))
    print('允许重定向请求地址:%s'%(r2.url))



      通过执行发现,我们的参数已经设置成功了。在拒绝重定向的时候请求的状态为301,允许重定向的时候为200。



      总结
      安静简单的介绍了requests中的一些常用方法,这些方法可以帮助我们通过python+requests进行编写关于接口测试的方便的代码。等熟练使用requests后可以进行尝试编写[url=]自动化测试[/url]代码进行辅助日常测试工作。

    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2021-10-26 07:07 , Processed in 0.058199 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2021 Comsenz Inc.

    快速回复 返回顶部 返回列表