讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

剧云
剧云

中文短剧剧本制作平台

使用 pytest-mask-secrets 保护测试机密

夏婷同学_5214

夏婷同学_5214

发布时间:2024-08-12 11:00:29

|

1052人浏览过

|

来源于dev.to

转载

使用 pytest-mask-secrets 保护测试机密

保持敏感数据的安全和私密是软件开发的首要任务。应用程序日志是常见的泄漏媒介之一,受到仔细保护,以防止出现秘密。同样的担忧和风险也适用于测试日志,它可能会泄露密码或访问令牌。运行 ci 工作流程的工具通常提供一种机制,可以轻松屏蔽日志中的敏感数据。虽然这非常方便、高效且易于使用,但在某些情况下,这可能还不够。

为什么仅 ci 工作流屏蔽可能还不够

例如,github actions 在处理机密方面做得很好。工作流程中定义的任何秘密都会自动从捕获的输出中屏蔽掉,这就像一个魅力。然而,与任何 ci 系统一样,它也有其局限性。如果输出报告采用不同的路径(例如保存到文件、生成 junit 或发送到远程日志存储),github actions 无法检查内容并掩盖机密。

此外,测试并不总是在 ci 工作流程中运行,即使如此,秘密可能仍然需要隐藏。想象一下您正在本地运行测试并共享日志来讨论问题。在没有意识到的情况下,您在访问令牌中包含了一个 url。

因此,拥有一种处理测试日志中敏感数据的机制在各个层面都是至关重要的。最好的方法是直接在测试级别或测试框架本身内实现这一点。这可以确保秘密不会从主要来源泄漏,从而防止它们通过系统向上传递。

在适当的级别增加保护

直接在测试中维护秘密屏蔽可能成本相对较高且容易出错,而且常常感觉像是一场失败的战斗。例如,假设您需要设计一个以令牌作为参数的 url。与日志中的存在相比,此 url 必须以不同的方式呈现才能在请求中使用。

相比之下,在测试框架内拦截报告生成提供了一个理想的机会来挂钩流程并修改记录以消除敏感数据。这种方法对测试是透明的,不需要修改测试代码,并且其功能就像 ci 工作流程中的秘密屏蔽功能一样 — 只需运行它,而无需管理秘密。它使该过程自动化,确保敏感数据受到保护,而不会给测试设置增加额外的复杂性。

这正是 pytest-mask-secrets 所做的,显然当 pytest 用于测试执行时。在其众多功能中,pytest 提供了丰富且灵活的插件系统。为此,它允许您在生成任何日志之前、在所有数据都已收集完毕时挂接到该进程。这使得在输出记录之前可以轻松搜索并删除记录中的敏感值。

进行测试:实用演示

为了说明这是如何工作的,一个简单的例子将是最有效的。下面是一个简单的测试,可能不代表真实世界的测试场景,但可以很好地演示 pytest-mask-secrets。

import logging
import os


def test_password_length():
    password = os.environ["password"]
    logging.info("tested password: %s", password)
    assert len(password) > 18

在此示例中,有一个断言可能会失败(而且确实会失败),以及一条包含秘密的日志消息。是的,在日志中包含秘密可能看起来很愚蠢,但请考虑这样一个场景:您有一个带有令牌作为参数的 url,并且启用了详细的调试日志记录。在这种情况下,像 requests 这样的库可能会无意中以这种方式记录秘密。

现在进行测试。首先,设置测试所需的秘密:

Github Codebase Inspection
Github Codebase Inspection

使用 pygount 检查代码库:统计代码行数(LOC)、编程语言及占比。

下载
(venv) $ export password="top-secret"

接下来,运行测试:

(venv) $ pytest --log-level=info test.py 
============================= test session starts ==============================
platform linux -- python 3.12.4, pytest-8.3.2, pluggy-1.5.0
rootdir: /tmp/tmp.avztz7nhzs
collected 1 item                                                               

test.py f                                                                [100%]

=================================== failures ===================================
_____________________________ test_password_length _____________________________

    def test_password_length():
        password = os.environ["password"]
        logging.info("tested password: %s", password)
>       assert len(password) > 18
e       assertionerror: assert 10 > 18
e        +  where 10 = len('top-secret')

test.py:8: assertionerror
------------------------------ captured log call -------------------------------
info     root:test.py:7 tested password: top-secret
=========================== short test summary info ============================
failed test.py::test_password_length - assertionerror: assert 10 > 18
============================== 1 failed in 0.03s ===============================

默认情况下,秘密值在输出中出现两次:一次在捕获的日志消息中,另一次在失败的断言中。

但是如果安装了 pytest-mask-secrets 会怎么样?

(venv) $ pip install pytest-mask-secrets

并进行相应配置。它需要知道保存秘密的环境变量列表。这是通过设置 mask_secrets 变量来完成的:

(venv) $ export mask_secrets=password

现在,重新运行测试:

(venv) $ pytest --log-level=info test.py 
============================= test session starts ==============================
platform linux -- Python 3.12.4, pytest-8.3.2, pluggy-1.5.0
rootdir: /tmp/tmp.AvZtz7nHZS
plugins: mask-secrets-1.2.0
collected 1 item                                                               

test.py F                                                                [100%]

=================================== FAILURES ===================================
_____________________________ test_password_length _____________________________

    def test_password_length():
        password = os.environ["PASSWORD"]
        logging.info("Tested password: %s", password)
>       assert len(password) > 18
E       AssertionError: assert 10 > 18
E        +  where 10 = len('*****')

test.py:8: AssertionError
------------------------------ Captured log call -------------------------------
INFO     root:test.py:7 Tested password: *****
=========================== short test summary info ============================
FAILED test.py::test_password_length - AssertionError: assert 10 > 18
============================== 1 failed in 0.02s ===============================

现在,在打印秘密的地方会出现星号,而不是秘密值。工作已完成,测试报告现已不含敏感数据。

结束语

从这个例子来看,pytest-mask-secrets 似乎并没有比 github actions 默认情况下所做的更多,这使得这项工作显得多余。然而,如前所述,ci 工作流执行工具仅掩盖捕获的输出中的秘密,而使 junit 文件和其他报告保持不变。如果没有 pytest-mask-secrets,敏感数据仍然可能会在这些文件中暴露——这适用于 pytest 生成的任何报告。另一方面,当使用 log_cli 选项时,pytest-mask-secrets 不会屏蔽直接输出,因此 ci 工作流程的屏蔽功能仍然有用。通常最好结合使用这两种工具来确保敏感数据的保护。

就是这样。感谢您花时间阅读这篇文章。我希望它为使用 pytest-mask-secrets 来增强测试过程的安全性提供了宝贵的见解。

测试快乐!

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

5250

2023.10.13

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

3661

2023.10.23

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

1246

2025.10.24

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

8905

2026.01.21

GitHub官网入口版本汇总
GitHub官网入口版本汇总

本专题整合了GitHub入口版本地址汇总,阅读专题下面的文章了解更多详细内容。

1018

2026.04.02

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

526

2025.12.13

Figma AI自动化智能数据填充与交互生成实战
Figma AI自动化智能数据填充与交互生成实战

告别机械重复,详细演示如何用 AI 填充业务真实数据,并自动为页面添加交互连线,将静态设计稿快速转变为动态原型。

345

2026.05.13

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

40

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn