【pytest】开始-接口自动化:Requests库的基础操作

 接口测试框架

  • 基于:python+requests+pytest+allure+yaml+logging+Jenkins框架

1、认识Requests以及常用的方法和底层调用逻辑

        1.1:导入requests第三方库

  • requests是第三方库,用于发送Http请求以及接收http响应
  • 使用前需先安装,命令为pip install requests
# 导包-自动导包:Alt+Enter
import requests

         1.2:最常用的6个方法

# requests.get()   # **kwargs:可变长度的字典
def get(url, params=None, **kwargs):
    
# requests.post()
def post(url, data=None, json=None, **kwargs):
    
# requests.put()
def put(url, data=None, **kwargs):
    
# requests.delete()
def delete(url, **kwargs):

# requests.request()
def request(method, url, **kwargs):   这是前面4个方法统一调用的方法
    
# requests.session()  # session:会话,web项目中从登录到退出是一个会话
def session():
session对象里的request方法
        def request(self, method, url,
            params=None, data=None, headers=None, cookies=None, files=None,
            auth=None, timeout=None, allow_redirects=True, proxies=None,
            hooks=None, stream=None, verify=None, cert=None, json=None):

         1.3:底层逻辑

总共有四层调用,get/post/put/delete会调用requests.request()的方法,再进一步调用session.request()方法,最终调用的是request() 方法

  • 第一层调用:
def get(url, params=None, **kwargs)
    url:接口地址
    params:参数,在get请求的url后面传的参数
    **kwargs:可变长度的字典

def post(url, data=None, json=None, **kwargs)
    url:接口地址
    data:参数(表单/表格参数,对应postman的 x-www-form-urlencode)
              简单的键值对dict类型的参数,默认情况下用form表单方式传参
              str类型的参数,默认情况下用text/plain方式传参(如果是嵌套dict字典格式的参数,
                            需要先转换成str格式,见文末的扩展)

    json:参数(raw,application/json),支持dict和str类型
    **kwargs:可变长度的字典

(扩展)postman的四种传参方式:
  1.纯表单:Content-Type:application/x-www-form-urlencode          (data)
  2.文件上传:Content-Type:multipart/form-data(既有表单也有文件上传) (files)
  3.文本:
             Content-Type:application/json(传json格式的参数)        (json)
             Content-Type:text/plain                               (data)
             Content-Type:application/javascript                   (data)
             Content-Type:text/html                                (data)
             Content-Type:application/xml                          (data)
  4.二进制binary:Content-Type:application/octrent-stream           (files)

def put(url, data=None, **kwargs):
    url:接口地址
    data:参数
    **kwargs:可变长度的字典
def delete(url, **kwargs):
    url:接口地址
    **kwargs:可变长度的字典
  • 第二层调用:
  • 上面的4个方法其实都是调用的request方法,requests.request()
        def request(method, url, **kwargs):
  • 第三层调用:
  • requests.request()调用的是session.request方法
        session.request(method=method, url=url, **kwargs)
  • 第四层调用:
  • session.request方法最终调用的是request() 
def request(self, 
        method,                 请求方式
        url,                    请求路径
        params=None,            params参数
        data=None,              data参数
        json=None,             json参数
        headers=None,           请求头
        cookies=None,           cookies信息
        files=None,             文件上传

        auth=None,              鉴权
        timeout=None,           超时
        allow_redirects=True,   是否允许重定向
        proxies=None,           设置代理
        hooks=None,             钩子
        stream=None,            文件下载
        verify=None,            证书验证
        cert=None,              CA证书
        

         1.4:Requests响应部分response对象介绍:  

        res.text:返回字符串形式的结果
        res.json():返回字典形式的结果
        res.content:返回字节类型的结果
        res.status_code:返回状态码
        res.reason:返回状态信息
        res.cookies:返回cookie信息
        res.encoding:返回编码格式
        res.headers:返回响应头
        res.request.xxx:得到请求数据

2、requests.request() 和 session.request() 的区别:

我们实际工作中,一般都是用 session.request() 去进行接口测试。这2者的区别:

  • 前者requests.request()的每个请求都是独立的,每调用一次requests.request(),会初始化新生成一个会话,导致跟其它接口请求没有cookie的关联,会话是不连续的。
  • 后者会自动去关联所有请求的cookie信息,通过sess = requests.session()封装,则能让所有的请求都在同一个session会话里。

        

  1. 第2个区别,通过封装之后,可以进行统一处理---
class TestRequestApi():
    Authorization=""
    sess = requests.session()

    def test_login(self):

        url= "https://xxxx/wzlApp/usersLogin/login"
        headers ={"App-Version":"3.6.9"}
        data = {
            "phone":"RwP%2BH9D9DTgD1Qf0j7J%2B3A==",
            "password":"kKe2zs5e7SF%2BuzDkBeFLLQ=="
        }
        # 通过session的方法调用
        res = TestRequestApi.sess.request("post",url=url,data=data,headers=headers)
        print(res.json())
        TestRequestApi.Authorization = res.json()['data']['token']
       

3、requests接口自动化测试实战

        2.1:接口关联的三个层次:

  1. 通过类变量保存中间变量实现接口关联 ----不建议用这个方式
  2. 通过单独的文件保存中间变量实现接口关联
  3. 极限封装成零代码的方式实现接口关联 

        2.2:接口关联的两种方式:

  • 1)正则提取

# ---- re 需要先导包,再引入

re.search() 通过正则匹配一个值,用下标[1]取值,如没有匹配到则返回None

re.findall() 通过正则匹配多个值,返回的是list,用下标取值,如没有匹配到则返回None

一般在text文本中,用正则提取:

第一个是正则:'token': '(.*?)'

第二个是字符串对象:res.json()

通过下标[1]提取对应的值

import re
token = re.search("'token': '(.+?)'",res.text).group(1)
print("这是正则提取出来的:"+token)
  • 2)JsonPath提取 

# --- jsonpath需要先导包,再引入

jsonpath.jsonpath()  返回的是list,用下标取值,如没有匹配到则返回None

        $ 表示根目录
        如:就在根目录下,则直接用.名称提取:res.json(),"$.data"
               到前面的res.json()对象中,通过表达式:"$.data"取值
        如:有嵌套的话:res.json(),"$.[data][token]"

               通过下标提取对应的值

  import jsonpath
  data = jsonpath.jsonpath(res.json(),"$.data[token]")
  print(data[0])
        data = jsonpath.jsonpath(res.json(),"$.data[token]") 
       # $ 表示根目录
        # 就在根目录下,则直接用.名称提取:res.json(),"$.data"
        # 到前面的res.json()对象中,通过表达式:"$.data"取值
        # 有嵌套的话:res.json(),"$.[data][token]"

        # 通过下标提取对应的值
         print(data[0])

import requests
import jsonpath

class TestRequestApi():
    # 类变量
    Authorization=""

    def test_login(self):
        # self,代表当前类的对象
        # 方法通过对象调用     TestRequestApi().test_login()
        # method: post
        url= "https://xxxx/wzlApp/usersLogin/login"
        headers ={"App-Version":"3.6.9"}
        data = {
            "phone":"RwP%2BH9D9DTgD1Qf0j7J%2B3A==",
            "password":"kKe2zs5e7SF%2BuzDkBeFLLQ=="
        }
        res = requests.post(url=url,data=data,headers=headers)
        print(res.json())
        TestRequestApi.Authorization = res.json()['data']['token']
        # $ 表示根目录;到前面的res.json()对象中,通过表达式:"$.data"取值
        # 如果要提取的参数就在根目录下,则直接用.名称提取:res.json(),"$.data"
        # 有嵌套的话,提取表达式:res.json(),"$.[data][token]"
        data = jsonpath.jsonpath(res.json(),"$.data[token]")
        print("-----登录-----")
        print("这是直接获取的token:" + TestRequestApi.Authorization)
        print(data[0])


    def test_notice(self):
        url= "https://xxxx/wzlApp/users/insertUserFeedback"
        headers ={
            "App-Version":"3.6.9",
            "Authorization": TestRequestApi.Authorization
        }
        data = {
            "feedback":"通过接口自动化脚本提交的意见反馈,数字符--xxxx---测试。。通过接口自动化脚本提交的意见反馈,数字字符--xxxxx---测试。。"

        }
        res = requests.post(url=url,data=data,headers=headers)
        print("-----意见反馈-----")
        print(res.json())



    def test_upload(self):
        url = "https://xxxx/commonApi/upload/uploadPrivate"
        headers = {
            "App-Version": "3.6.9",
            "Authorization": TestRequestApi.Authorization
        }
        data = {
            "file":open("D:/Scripts/workspace/demo/results/image/logo.png","rb")

        }
        res = requests.post(url=url, files=data, headers=headers)
        print("-----上传文件接口-----")
        print(res.json())

扩展:

底层逻辑1.2中,data和json格式的进一步说明

1)json.dumps(data):序列化, 把字典格式的数据转换成str格式;

2)json.loads(data):反序列化,把str格式转换成字典格式。

    def test_login(self):
        url = "https://xxxx/wzlApp/users/insertUserFeedback"
        headers = {
            "App-Version": "3.6.9",
            "Authorization": TestRequestApi.Authorization
        }
        data = {
            "feedback": {"content":"通过接口自动化脚本提交的意见反馈,
            数字符--xxxx---测试。。
            通过接口自动化脚本提交的意见反馈,数字字符--xxxxx---测试。。"}

        }
        res = requests.post(url=url, data=json.dumps(data), headers=headers)

PS:

目前软件测试对测试人员的能力要求

  1. 业务测试能力:占比5-6成
  2. 接口、自动化、性能测试能力:占比4-5成
  3. 流程规范:1成

需要综合型的测试人才):业务能力、代码能力、开发思维(封装)

 实现接口自动化测试工具:

  • 主流接口测试工具实现接口自动化(适用于中小型的公司或项目)50%  10-15

           Postman+Newman+git/SVN+Jenkins(基于JavaScript语言)

           Jmeter+Ant+git/SVN+Jenkins(基于Java和BeanShell语言)

  • 基于代码的接口自动化(适用于大中型公司或一线互联网公司)40%  15-30

           Python+Requests+Yaml+Pytest+Allure+Logging+热加载+Jenkins

  • 基于平台的接口自动化(适用于特大型或外包型公司)10%  30以上

           测试开发

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pytestrequests是两个常用的Python,可以用于接口自动化测试。 在使用pytest进行接口自动化测试时,可以在Python脚本中调用pytest来运行测试用例。通常会使用if __name__ == "__main__":来判断是否直接运行脚本,然后使用pytest.main()方法来执行测试用例。可以通过传递参数来指定运行的测试文件和测试标记,比如使用'-m=test'来运行标记为test的测试用例。\[1\] 在使用requests发送接口请求时,可以使用requests.get()方法发送GET请求,其中可以传递url和params参数来指定请求路径和请求参数。也可以使用requests.post()方法发送POST请求,其中可以传递url和data或json参数来指定请求路径和请求参数。还可以使用requests.put()方法发送PUT请求,其中可以传递url和data参数来指定请求路径和请求参数。\[2\]\[3\] 在接口自动化测试中,可以使用pytestrequests结合起来,编写测试用例来测试接口的功能和性能。可以使用pytest的fixture来准备测试环境和清理测试数据,使用requests发送请求并获取响应结果,然后进行断言来验证接口的返回值是否符合预期。可以使用pytest的assert语句来进行断言,比如assert res.status_code == 200来验证接口的返回状态码是否为200。可以使用print语句来输出测试结果,方便查看和调试。\[2\]\[3\] 总结起来,使用pytestrequests进行接口自动化测试的步骤包括: 1. 编写测试用例,使用pytest的fixture准备测试环境和清理测试数据。 2. 使用requests发送接口请求,获取响应结果。 3. 使用pytest的assert语句进行断言,验证接口的返回值是否符合预期。 4. 使用print语句输出测试结果,方便查看和调试。 希望以上信息对你有帮助,如果还有其他问题,请随时提问。 #### 引用[.reference_title] - *1* [Python+Requests+Pytest 接口自动化测试脚本总结](https://blog.csdn.net/changyixue/article/details/105362848)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v12^insert_chatgpt"}} ] [.reference_item] - *2* *3* [5.pytest之结合requests实现接口自动化](https://blog.csdn.net/weixin_42616506/article/details/125666980)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v12^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值