从零开始学习软件测试-第42天笔记

requests框架

python做接口测试安装环境

  • pip install requests

requests基本使用

  • 发送请求
    • # 导入requests模块
      import requests
      
      # 发送post请求
      requests.post('URL')
      
      # 发送get请求
      requests.get('URL')
      
      # 发送delete请求
      requests.delete('URL')
      
      # 发送put请求
      requests.put('URL')
  • 查看响应
    • import requests
      
      r = requests.get('URL')
      
      # 获取所有文本内容
      print(r.text)
  • 查看编码格式
    • import requests
      
      r = requests.get('URL')
      
      # 查看编码方式
      print(r.encoding)
      
      print(r.text)
  • 改变编码格式
    • import requests
      
      r = requests.get('URL')
      
      # 更改编码方式
      r.encoding = 'utf-8'
      
      print(r.encoding)
      
      print(r.text)
  • 查看响应头
    • import requests
      
      r = requests.get('URL')
      
      # 查看响应头
      print(r.headers) # 返回的是字典的格式
      
      # 可以用中括号或get取出响应头字段
      print(r.headers['Content-Type'])
      print(r.headers.get('content-type'))
      
  • 查看状态码
    • import requests
      
      r = requests.get('URL')
      
      # 查看状态码
      print(r.status_code)
      
      
  • 获取json数据
    • import requests
      
      r = requests.get('URL')
      
      # 查看json格式的数据
      print(r.json())
      
      
  • 获取文件的二进制内容
    • import requests
      
      r = requests.get('URL')
      
      # 获取二进制内容
      print(r.content)
      
      # 将二进制内容写入到文件中
      with open('文件要保存的路径', 'wb') as f
          f.write(r.content)
  • 超时
    • import requests
      
      # 超时timeout,设置建立连接的有效时长
      r = requests.get('URL', timeout=20) # 设置一个时间为20秒,如果服务器在20秒内没有应答,将会返回一个异常
      
      print(r.text)
  • 添加path参数
    • import requests
      
      # 添加path参数
      r = requests.get('http://www.baidu.com/xxx/参数')
      
      print(r.json())
  • 添加query参数
    • import requests
      
      # 添加query参数
      # 方式一
      r = requests.get('http://www.baidu.com/xxx?键值对&键值对')
      print(r.json())
      
      # 方式二
      data = {'键名':'键值', '键名':'键值'}
      r = requests.get('http://www.baidu.com/xxx', params=data)
      print(r.json())
  • 添加form文本
    • import requests
      
      # 添加form文本
      data = {'键名':'键值', '键名':'键值'}
      r = requests.post('http://www.baidu.com/xxx', data=data)
      
      print(r.json())
  • 添加cookie
    • import requests
      
      # 添加cookie
      cookie = {'cookie名':'cookie值'}
      r = requests.post('http://www.baidu.com/xxx', cookies=cookie)
      
      print(r.json())
  • 添加请求头
    • import requests
      
      # 添加请求头
      header = {'Content-Type':'application/json'}
      r = requests.post('http://www.baidu.com/xxx', headers=header)
      
      print(r.json())
  • 添加纯文本请求体
    • import requests
      
      # 添加纯文本请求头,以字符串套字典的形式传给data参数,注意字符串中有中文的话需要加上编码格式
      data = '{'键名':'键值', '键名':'键值'}'.encode('utf-8')
      r = requests.post('http://www.baidu.com/xxx', data=data)
      
      print(r.json())
  • 添加form文件
    • import requests
      
      cookie = {'cookie名':'cookie值'}
      
      # 添加form文件
      with open('要上传文件的路径', 'rb') as f:
          data = {'参数名': f}
          r = requests.post('http://www.baidu.com/xxx', files=data, cookies=cookie)
      
      print(r.text)

接口的关联

在python中通过r.json()获取第一个接口的返回值,再通过这个json去取其中的数据,保存成变量直接使用即可。

  • # 接口的关联
    # 公共参数
    cookie = {'cookie名': 'cookie值'}
    header = {'Content-Type': 'application/json'}
    
    # 第一个接口
    # 纯文本请求体
    data = '{"键名":"键值","键名":"键值"}'.encode('utf-8')
    r = requests.post('http://www.xxx.com/xx/xxx', cookies=cookie, headers=header, data=data)
    
    # 获取第一个接口的返回值,用变量存储
    comment_id = r.json()['xxx']['xx']
    print(r.json())
    print('' * 100)
    
    # 第二个接口
    # 引用该变量
    data = '{"comment_id":"%s", "键名": "键值"}' % comment_id
    r = requests.post('http://www.xxx.com/xx/xxx', cookies=cookie, headers=header, data=data)
    print(r.json())

ddt装饰器

  • 安装ddt:pip install ddt
  • ddt里的装饰器
    • 类装饰器@ddt
    • 方法装饰器@data,@unpack

结合unittest做参数化

request仅仅是一个负责发送各种请求的框架,没有参数化的功能。

因此,需要使用ddt第三方模块来进行参数化。

单个参数的参数化

  • 
    # unittest + ddt 做接口参数化
    import unittest
    from ddt import data, ddt, unpack
    
    
    @ddt  # 单个参数的参数化
    class TestInterface(unittest.TestCase):
        @data('assassin', '伍陆柒', '$$')
        def test_case1(self, value):
            print(value)
    
        @data('1', '2', '3')
        def test_case2(self, value):
            print(value)

多个参数的参数化

  • # unittest + ddt 做接口参数化
    import unittest
    from ddt import data, ddt, unpack
    
    @ddt  # 多个参数的参数化
    class TestInterface(unittest.TestCase):
        @data(['1', 'assassin'], ['2', '五六七'], ['3', '$'])
        @unpack # 添加多个参数时,要用unpack装饰器
        def test_case1(self, news_id, comment):
            print(news_id, comment)
    

apcase的使用

apcase是一个可以根据多维列表生成正交的小工具。

安装apcase :pip install apcase

  • import unittest
    import requests
    from ddt import data, ddt, unpack
    import ap
    
    
    @ddt  # 多个参数的参数化
    class TestComment(unittest.TestCase):
        # 导入正交工具
        @data(*ap.allpairs([['90', '91'], ['assassin', '伍陆柒', '$$$']]))
        # 评论接口
        @unpack
        def test_case1(self, news_id, comment):
            # cookie
            cookie = {'cookie名': 'cookie值'}
            # 请求头
            header = {'Content-Type': 'application/json'}
            # 纯文本请求体
            data1 = ('{"news_id":"%s","comment":"%s"}' % (news_id, comment)).encode('utf-8')
            r = requests.post('http://www.xxx.com/xxx/news_comment', cookies=cookie, headers=header, data=data1)
            # 添加断言
            assert r.json()['errno'] == '0'
            print(r.json())
            print('-' * 99)
    

你可能感兴趣的:(软件测试,Python,接口测试,学习,笔记,python)