zoukankan      html  css  js  c++  java
  • 让http服务人类(python之requests做接口测试)

    让http服务人类

    最优雅的http请求库(python的http请求库有很多,比如urllib2,urllib3,httplib)。

    requests库简介

    requests库是基于urllib3库封装的第三方http请求库,在python中requests应用最广泛的应该属网络爬虫方面,对于测试来说,我们对于requests的应用主要是接口测试方面。

     

    实例(1)创建一个请求:

    httpbin:这个网站专门是为了给http做测试用的.

    import requests         #导入requests模块
    '''
    号称最优雅的http请求库
    '''
    #创建一个http请求:
    res_get = requests.get('http://httpbin.org/get‘)     #get请求
    res_post = requests.post('http://httpbin.org/post', data={'key': 'value'})  #post请求 
    res_put = requests.put('http://httpbin.org/put', data={'key': 'value'})    #put请求
    res_delete = requests.delete('http://httpbin.org/delete')              #delete请求
    res_head = requests.head('http://httpbin.org/head')                    #head请求
    res_options = requests.options('http://httpbin.org/options')               #options请求
    #将所有响应结果放入列表中                       
    res_list = [res_get, res_post, res_put, res_delete, res_head, res_options]
    ​#打印出所有的响应结果
    for i in range(len(res_list)):
       print(f'
    第{i + 1}个http请求的响应结果:', res_list[i].text)
     

    实例(2)传递url参数:

    import requests

    '''
    1、带参数的get请求
    get请求使用字典的形式传参
    '''
    parm = {'key1': 'value1', 'key2': 'value2'}
    res_get = requests.get('http://172.25.8.167:1080/get', params=parm)
    print(res_get.text, '
    请求url为:', res_get.url)
    ​
    '''
    2、当传入字典的值为null时,也会将字典的键传入url中
    '''
    parm = {'key1': 'value1', 'key2': ''}
    res_get = requests.get('http://172.25.8.167:1080/get', params=parm)
    print(res_get.text, '
    请求url为:', res_get.url)
    ​
    '''
    3、传入字典的值可以是一个列表
    '''
    parm = {'key1': 'value1', 'key2': ['value2', 'value3']}
    res_get = requests.get('http://172.25.8.167:1080/get', params=parm)
    print(res_get.text, '
    请求url为:', res_get.url)

    实例(3)post请求传递参数:

    import requests
    import json
    ​
    '''
    1、post请求
    以字典的方式传入参数
    '''
    parm = {'key': 'value'}
    res_post = requests.post('http://172.25.8.167:1080/post', data=parm)
    print(res_post.text)
    ​
    '''
    2、post请求
    以元祖列表的方式传入参数,也可以直接以元祖方式传入
    '''
    parm = [('key1', 'value1'), ('key2', 'value3')]
    res_post = requests.post('http://172.25.8.167:1080/post', data=parm)
    print(res_post.text)
    ​
    '''
    3、post请求
    以json方式传入参数
    '''
    url = 'http://172.25.8.167:1080/post'
    payload = {'some': 'data'}
    res_post = requests.post(url, data=json.dumps(payload))
    print(res_post.text)
    ​
    '''
    4、post请求
    将文件以参数的方式传入
    '''
    url = 'http://172.25.8.167:1080/post'
    payload = {'file': open('report.xls', 'rb')}
    res_post = requests.post(url, data=json.dumps(payload))
    print(res_post.text)

    实例4:了解requests响应处理机制:

    import requests
    ​
    parm = [('key1', 'value1'), ('key2', 'value3')]
    res_post = requests.post('http://172.25.8.167:1080/post', data=parm)
    print("
    以text格式处理返回响应结果", res_post.text)
    print("
    以json格式处理返回响应结果", res_post.json(), "
    ")
    print("
    以二进制流格式处理返回响应结果", res_post.content, "
    ")
    print("
    响应的URL:", res_post.url, "
    ")
    print("
    响应的cookies:", res_post.cookies, "
    ")
    print("
    响应的编码:", res_post.encoding, "
    ")
    print("
    响应的http状态响应码:", res_post.status_code, "
    ")
    print("
    响应的header:", res_post.headers, "
    ")
     

    实例5:封装(用于接口测试):

    import requests
    ​
    class requests_run:
        '''
        封装requests,用于接口测试
        '''
        def requests_post(self, url, data, header):
            if header != None:
                res = requests.post(url=url, headers=header, data=data)
            else:
                res = requests.post(url=url, data=data)
            return res
    ​
        def requests_get(self, url, data, header=None):
            if header != None:
                res = requests.get(url=url, headers=header, params=data)
            else:
                res = requests.get(url=url, params=data)
            return res
    ​
        def requests_main(self, url, method, data=None, header=None):
            if method == 'post':
                res = self.requests_post(url, data, header)
            else:
                res = self.requests_get(url, data, header)
             return res
        
        class Http_Request:
            '''
            更简洁的封装
            '''
            @staicmethod
            def http_request(self,url, data, method, header=None):
                if method = 'post':
                    res = requests.post(url, data, header)
                else:
                    res = requests.get(url, data, header)
                return res

    实例5:结合Excel实现简单的接口自动化

    from requests_demon4 import RequestsRun
    from with_excel import with_excel  #之前写的一个python读取excel的类
    import json
    ​
    csyl = with_excel('requests_test.xlsx','Sheet1')
    csyl_new = csyl.setnull_todict()
    ​
    for i in csyl_new:
        print(f'第{i["id"]}测试用例开始执行')
        # print(i["url"], i["method"], i["data"])
        url = i["url"]
        method = i["method"]
        if i["data"] == '':
            data = None
            res = RequestsRun().requests_main(url, method)
        else:
            data = eval(i["data"])
            res = RequestsRun().requests_main(url, method, data)
        print(f'第{i["id"]}测试用例结果为:
    ', json.dumps(res.json(), ensure_ascii=False, sort_keys=True, indent=2))

    附:python读取Excel的操作

     1 import pandas as pd
     2 
     3 path = 'test.xlsx'
     4 sheet_name = 'test_data'
     5 '''
     6 pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, usecols=None)
     7 io:很明显, 是excel文件的路径+名字字符串
     8 sheet_name:返回指定的sheet
     9 如果将sheet_name指定为None,则返回全表
    10 如果需要返回多个表, 可以将sheet_name指定为一个列表, 例如['sheet1', 'sheet2']
    11 name:如果没有表头, 可用此参数传入列表做表头
    12 header:指定数据表的表头,默认值为0, 即将第一行作为表头
    13 index_col:用作行索引的列编号或者列名,如果给定一个序列则有多个行索引。一般可以设定index_col=False指的是pandas不适用第一列作为行索引。
    14 usecols:读取指定的列, 也可以通过名字或索引值
    15 '''
    16 
    17 
    18 
    19 class with_excel:
    20 
    21     #构造函数,调用类时就运行
    22     def __init__(self, path=None, sheet_name=None):
    23         if path and sheet_name:
    24             self.path = path
    25             self.sheet_name = sheet_name
    26         else:
    27             self.path = 'test.xlsx'
    28             self.sheet_name = 'test_data'
    29         self.data = self.open_excel()
    30 
    31     #获取表格数据
    32     def open_excel(self):
    33         df = pd.read_excel(self.path, self.sheet_name)
    34         return df
    35 
    36     #获取表中单元格行数
    37     def get_lines(self):
    38         lines = self.data.shape[0]#获取了最后一行的行数
    39         return lines
    40 
    41     #获取一个单元格的内容(获取多行的内容)
    42     def get_cell_data(self, row, col):
    43         return self.data.iloc[row, col]
    44 
    45     #将表格数据转字典
    46     def to_dict(self):
    47         test_data = []
    48         for i in self.data.index.values:  # 获取与表头对应的字典数据
    49             row_data = self.data.loc[i].to_dict()
    50             test_data.append(row_data)
    51         return test_data

    总结:

    利用python来做接口自动化,这里的过程只是练手代码而已,如果将这些代码都熟练的掌握了,那咱们就有做python接口自动化的基础了。

     

     

     

  • 相关阅读:
    Java 排序(快排,归并)
    Java 编译???
    装箱 拆箱
    Integer-->String String-->Integer
    java 内部类
    Java 反射机制
    Java 多态的实现机制
    一个句子,找出最字符最少的关键词
    重载、重写
    数组有没有length()这个方法? String有没有length()这个方法?
  • 原文地址:https://www.cnblogs.com/fccyccf/p/11645081.html
Copyright © 2011-2022 走看看