Karate框架:是否可以对特定场景的控制台日志内容进行掩蔽处理?
特定测试场景控制台敏感信息掩蔽实现方案
完全可以实现,无需修改全局日志配置,仅需针对目标场景临时劫持打印输出方法,做敏感内容替换后再输出,场景执行结束后恢复原生方法即可,不会影响其他测试场景的日志输出。
通用实现逻辑
- 执行目标测试场景前,保存原生打印/标准输出方法
- 覆写打印方法,对输出内容做敏感规则匹配替换
- 目标场景执行结束后,恢复原生打印方法
Python + pytest 实现示例
首先定义作用域为单用例的fixture,仅在指定用例中生效:
import pytest import builtins import re # 自定义敏感匹配规则,可按需扩展 SENSITIVE_RULES = [ (r'1[3-9]\d{9}', '***手机号已掩蔽***'), (r'(api_key|secret)=[a-zA-Z0-9]+', r'\1=***密钥已掩蔽***') ] @pytest.fixture def enable_log_mask(): original_print = builtins.print def masked_print(*args, **kwargs): output = ' '.join(str(arg) for arg in args) for pattern, replace_val in SENSITIVE_RULES: output = re.sub(pattern, replace_val, output) original_print(output, **kwargs) builtins.print = masked_print yield builtins.print = original_print
仅需要给要做掩蔽的用例引入该fixture即可:
# 该用例输出会自动掩蔽敏感内容 def test_payment_interface(enable_log_mask): print("用户绑定手机号:13987654321") print("调用支付密钥:api_key=7e8d2c9f4a1b3") # 输出结果: # 用户绑定手机号:***手机号已掩蔽*** # 调用支付密钥:api_key=***密钥已掩蔽*** # 其余用例输出不受影响 def test_common_query(): print("用户绑定手机号:13987654321") # 输出结果不变:用户绑定手机号:13987654321
Node.js + Jest 实现示例
// 自定义敏感匹配规则 const SENSITIVE_RULES = [ [/1[3-9]\d{9}/g, '***手机号已掩蔽***'], [/(api_key|secret)=[a-zA-Z0-9]+/g, '$1=***密钥已掩蔽***'] ] describe('支付相关敏感测试集', () => { let originalLog; // 该测试集下所有用例执行前覆写console.log beforeEach(() => { originalLog = console.log; console.log = (...args) => { let output = args.join(' '); SENSITIVE_RULES.forEach(([pattern, replaceVal]) => { output = output.replace(pattern, replaceVal); }) originalLog(output); } }) // 用例执行结束恢复原生方法 afterEach(() => { console.log = originalLog; }) test('下单接口测试', () => { console.log("用户手机号:13987654321"); console.log("支付密钥:api_key=7e8d2c9f4a1b3"); // 输出已自动掩蔽敏感内容 }) }) // 其他测试集不受影响 describe('普通查询测试集', () => { test('商品列表查询', () => { console.log("用户手机号:13987654321"); // 输出无变化 }) })
如果测试框架直接输出到标准输出而非调用内置打印方法,可对应劫持
sys.stdout(Python)或process.stdout.write(Node.js),实现逻辑完全一致。
内容的提问来源于stack exchange,提问作者Prabhu
相关产品推荐
相关产品推荐

