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


    requests框架

    python做接口测试安装环境

    • pip install requests

    requests基本使用

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

    接口的关联

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

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

    ddt装饰器

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

    结合unittest做参数化

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

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

    单个参数的参数化
      1. # unittest + ddt 做接口参数化
      2. import unittest
      3. from ddt import data, ddt, unpack
      4. @ddt # 单个参数的参数化
      5. class TestInterface(unittest.TestCase):
      6. @data('assassin', '伍陆柒', '$$')
      7. def test_case1(self, value):
      8. print(value)
      9. @data('1', '2', '3')
      10. def test_case2(self, value):
      11. print(value)
    多个参数的参数化
      1. # unittest + ddt 做接口参数化
      2. import unittest
      3. from ddt import data, ddt, unpack
      4. @ddt # 多个参数的参数化
      5. class TestInterface(unittest.TestCase):
      6. @data(['1', 'assassin'], ['2', '五六七'], ['3', '$'])
      7. @unpack # 添加多个参数时,要用unpack装饰器
      8. def test_case1(self, news_id, comment):
      9. print(news_id, comment)

    apcase的使用

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

    安装apcase :pip install apcase

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

  • 相关阅读:
    gma 2 教程(二)数据操作:8.矢量数据功能逻辑架构和格式支持
    C++当中的IO流介绍 - operator 类型()的特殊用法
    Python简单数据清洗
    【嵌入式开源库】cJSON的使用,高效精简的json解析库
    Docker② —— Cgroups详解
    全链路压测(11):聊聊稳定性预案
    002数据安全传输-多端协议传输平台:配置Oracle数据库-19c及导入数据信息
    AJAX介绍
    HttpClient发送MultipartFile多文件及多参数请求
    【mongoDB】
  • 原文地址:https://blog.csdn.net/qq_64521509/article/details/132781394