美文网首页python学习接口测试
[python接口测试]生成验签

[python接口测试]生成验签

作者: freedom_smile | 来源:发表于2019-10-10 17:03 被阅读0次

    背景:

    测试接口的时候,一般会有一个参数(如:sign)是对请求参数名及值按一定规则生成的加密串,后台会对接口请求的加密串做校验,如果对可以正常请求接口,如果不对就给与提示验签错误之类。(类似于登录的密码)

    解决方案:

    1. 给研发要生成规则的包,导入到你的项目,你的参数也按包里的方法生成加密串
    2. 让研发对几个固定的数据不验证加密串,你用固定的参数进行测试
    3. 自己写一套和研发规则一样的代码,接口请求的时候调用自己写好的方法

    研发使用的java语言,我使用的python语言,使用上面第三种方法比较适合,步骤如下:

    1.写一套和后台规则一样的加密串方法

    import hashlib
    
    class md5Python(object):
        """MD5签名和验签"""
    
        @classmethod
        def data_processing(cls, data):
            """
            :param data: 需要签名的数据,字典类型
            :return: 处理后的字符串,格式为:参数名称=参数值,并用&连接
            """
            if "sign" in data:
                del data["sign"]
            dataList = []
            for key in sorted(data):
                if data[key] and key!= "imgData":
                    dataList.append("%s=%s" % (key, data[key]))
            return "&".join(dataList).strip()
    
        @classmethod
        def md5_sign_str(cls, data, api_key):
            """
            MD5签名的完整字符串
            :param data: 需要签名的数据,字典类型
            :param api_key: MD5签名需要的字符串
            :return: 处理后的字符串,格式为:参数名称=参数值,并用&连接,最后用&连接'key=api_key'
            """
            data = cls.data_processing(data) + '&key=' + api_key.strip()
            return data
    
        @classmethod
        def md5_sign(cls, data, api_key):
            """
            MD5签名
            :param api_key: MD5签名需要的字符串
            :return: 签名后的字符串sign
            """
            data = cls.data_processing(data) + '&key=' + api_key.strip()
            md5 = hashlib.md5()
            md5.update(data.encode(encoding='UTF-8'))
            return md5.hexdigest()
    
        @classmethod
        def md5_verify(cls, data, signature):
            """
            md5验签
            :param data: 接收到的数据
            :param signature: 接收到的sign
            :return: 验签结果,布尔值
            """
            if cls.md5_sign(data) == signature:
                return True
            else:
                return False
    

    2.测试同样信息自己代码生成加密串是否和后台的一致

    # -*- coding:utf-8 -*-
    
    from md5_python import md5Python
    
    param = {
        'c':'ccccccccc',
        'd':'ddddddddd',
        'e':'eeeeeeeee'
    }
    
    key = 'kkkkkkkkkk'
    
    print('加密参数:' + md5Python.data_processing(param))
    print('加密的完整请求串:' + md5Python.md5_sign_str(param,key))
    print('加密生成的sign:' + md5Python.md5_sign(param,key))
    print('请求信息:' + md5Python.md5_sign_str(param,key)+'&sign='+md5Python.md5_sign(param,key))
    

    3.进行接口测试,sign值调用上面方法生成进行请求

    # -*- coding:utf-8 -*-
    
    import requests
    from md5_python import md5Python
    
    # 基本地址
    base_url = 'http://*******'
    
    # 接口请求参数
    param = {
        'c':'ccccccccc',
        'd':'ddddddddd',
        'e':'eeeeeeeee'
    }
    
    # 用于生成验签的唯一值
    key="kkkkkkkkkk"
    
    if __name__ == '__main__':
        print('加密的完整请求串:' + md5Python.md5_sign_str(param, key))
        print('加密生成的sign:' + md5Python.md5_sign(param, key))
    
        param["sign"] = md5Python.md5_sign(param, key)
        # 打印请求参数
        print('请求参数为:' + str(param))
        # 调用接口
        r = requests.post(base_url + '/***', data=param)
        # 打印返回参数
        print('返回参数为: ' + r.text)
    

    相关文章

      网友评论

        本文标题:[python接口测试]生成验签

        本文链接:https://www.haomeiwen.com/subject/lvfkyctx.html