httprunner2.x--HttpRunner的hook(钩子)机制:(setup/teardown)对请求和响应内容进行预处理

HttpRunner的hook(钩子)机制:(setup/teardown)对请求和响应内容进行预处理

 转载:https://blog.csdn.net/weixin_42007999/article/details/105788187

有些系统登录页面输入用户名和密码,出于安全考虑,提交前需要对密码进行额外处理,如图所示:

 

 

从源码来看,是在原始密码后添加了一个“Verydows”字符串,然后对这个新的字符串进行MD5哈希运算,得出的摘要字符串数据作为传输的密码内容使用。过程相当于:

 

原始密码 = 123456

字符串A = 原始密码 + “Verydows” = "123456Verydows"

新密码 = md5(字符串A) = md5("123456Verydows") =200c6d94e583e62c6964de3acdc723e5

  

在编写测试用例的时候,把登录表单数据通过请求发给服务器,肯定不能直接写成原始密码方式,但如果把处理后的密码作为测试数据,这显然又不友好。

 

不友好用例: 密码使用处理后内容,不易读,且构造测试数据存在困难。

request:
 
    url: http://.......
 
    method: POST
 
    data:
 
        username: admin
 
        password: 200c6d94e583e62c6964de3acdc723e5

友好的用例格式:密码使用原始密码

 

request:
 
    url: http://.......
 
    method: POST
 
    data:
 
        username: admin
 
        password: 123456
 

问题的解决,这里提供两种方式:

  • 方式一:单独定义一个密码处理函数,在密码赋值时直接调用;
  • 方式二:通过钩子函数,提交前对请求数据进行二次加工和处理。

 

方式一:单独定义一个密码处理函数

 

在 debugtalk.py 文件中定义函数 get_md5_str(),将传入的密码进行 MD5 处理,执行后输出结果和我们抓包看到的处理后密码完全相同。

import hashlib
 

def get_md5_str(pwd):
 
    str_pwd = "%sVerydows" % pwd
 
    str_pwd_to_b = bytes(str_pwd, encoding='utf-8')
 
    str_md5 = hashlib.md5(str_pwd_to_b).hexdigest()
 
    return str_md5
 
 
if __name__ == "__main__":
 
    print(get_md5_str("123456"))
 
 
执行输出:
 
200c6d94e583e62c6964de3acdc723e5

  

 

编写测试用例:

- config:
    name: 测试用例
 
- test:
    name: 测试步骤 - 打开登录页面
    variables:
        # 将原始密码提取为一个变量
        p_pwd: 123456
    request:
        url: http://192.168.1.102/verydows/index.phpm=backend&c=main&a=login
        method: POST
        data:
            username: admin
            # 调用密码处理函数,将原始密码进行加工
            password: ${get_md5_str($p_pwd)}
    validata:
        - eq: [status_code, 200]
        - eq: [<iframe name="(.*)" id="main", main]

方式二:通过钩子函数对请求进行预处理

 

在 debugtalk.py 文件中定义两个函数:

  • 函数1:get_md5_str():将原始密码进行摘要处理
  • 函数2:set_req():将请求中的密码数据替换为前面处理好的摘要数值
import requests
import hashlib
 
 
 
# 将原始密码进行摘要处理
def get_md5_str(pwd):
    str_pwd = "%sVerydows" % pwd
    str_pwd_to_b = bytes(str_pwd, encoding='utf-8')
    str_md5 = hashlib.md5(str_pwd_to_b).hexdigest()
    return str_md5
 
# 将请求内容进行预处理
def set_req(req, pwd):
    # 将原始密码进行摘要处理
    new_pwd = get_md5_str(pwd)
    # 将请求中的原始密码替换为摘要密码
    req[data][password] = new_pwd

编写测试用例:

注意:

  • 在调用自定义函数时,需要传入 $request 参数,这是对当前测试步骤请求的封装的引用。有了这个参数,函数内就可以实现对请求的加工和处理了,相当于在向服务器发送前,改变了原来请求的内容。
  • 同理,如果在 teardown_hooks 钩子中传入 $response 参数,则可以对服务器的响应内容预先进行处理和调整。
- config:
    name: 测试用例
 
- test:
    name: 测试步骤 - 打开登录页面
    variables:
        p_pwd: 123456
 
    request:
        url: http://192.168.1.102/verydows/index.php?m=backend&c=main&a=login
    method: POST
    data:
        username: admin
        password: $p_pwd
    validata:
        - eq: [status_code, 200]
        - eq: [<iframe name="(.*)" id="main", main]

    setup_hooks:
    # 对请求头中的密码数据进行预处理
        - ${set_req($request, $p_pwd)}

执行用例成功

posted @ 2021-06-04 11:24  莫使娇躯空对月  阅读(136)  评论(0编辑  收藏  举报