Python 库可使您的代码可读、可靠且易于维护

2025-06-09

Python 库可使您的代码可读、可靠且易于维护

经验丰富的程序员深知,在开发过程中,他们大部分时间都在阅读代码,因此,他们对待编写代码的过程总是忐忑不安(有时甚至有些狂热)。为了编写高质量且可维护的代码,你需要花时间编写测试并集成 QA 工具。测试驱动开发 ( TDD ) 有一整套技术,我不会在这篇文章中专门讨论测试本身。测试是绝对必要的,没有什么可讨论的。在本文中,我们将讨论一些帮助你编写高质量 Python 代码的工具。

测试框架

pytest是一个框架,它可以轻松编写小型测试,但可以扩展以支持应用程序和库的复杂功能测试。

特征

  • 有关失败的断言语句的详细信息(无需记住 self.assert* 名称);
  • 自动发现测试模块和功能;
  • 用于管理小型或参数化的长寿命测试资源的模块化装置;
  • 可以unittest开箱即用地运行(包括试用)和鼻子测试套件;
  • Python 3.5+ 和 PyPy 3;
  • 丰富的插件架构,拥有超过 315 个外部插件和蓬勃发展的社区;

Hypothesis是一个测试库系列,允许您编写由示例源参数化的测试。Hypothesis 的实现会生成简单易懂的示例,让您的测试失败。这简化了测试的编写,同时增强了测试的功能,
因为软件可以自动化枯燥的部分,并以比人类更高的标准执行,让您能够专注于更高级别的测试逻辑。

Robot Framework是一个通用的开源自动化框架,用于验收测试、验收测试驱动开发 (ATDD) 和机器人流程自动化 (RPA)。它具有简单的纯文本语法,并且可以使用 Python 或 Java 实现的库轻松扩展。

测试运行器

tox是一个命令行驱动的 CI 前端和开发任务自动化工具。

tox 为所有配置的所谓创建虚拟环境testenvs,然后安装项目和其他必要的依赖项并运行配置的命令集:

图像.png

E2E 测试(GUI/前端)

Selenium是一个综合项目,它封装了各种支持 Web 浏览器自动化的工具和库。Selenium 专门为 W3C WebDriver 规范提供了基础架构——一个与平台和语言无关的编码接口,兼容所有主流 Web 浏览器。

Locust是一款易于使用、可编写脚本且可扩展的性能测试工具。您可以使用常规 Python 代码定义用户行为,而无需使用笨重的 UI 或特定领域语言。这使得 Locust 具有无限的可扩展性,并且对开发人员非常友好。

TestCafe是一款 Node.js 工具,用于自动化端到端 Web 测试。您可以
使用 JS 或 TypeScript 编写测试,运行并查看结果。

  • 适用于所有流行环境:TestCafe 可在 Windows、MacOS 和 Linux 上运行。它支持桌面、移动、远程和云浏览器(UI 或无头)。
  • 1分钟设置:您不需要WebDriver或任何其他测试软件。使用一个命令安装TestCafe,即可开始测试:npm install -g testcafe
  • 免费开源:TestCafe 在MIT 许可证下免费使用插件提供自定义报告、与其他工具集成、从 IDE 启动测试等功能。您可以使用 GitHub 社区提供的插件,也可以自行创建。

使用示例:

安装 TestCafe 并运行测试

PyAutoGUI是一个跨平台的 Python GUI 自动化模块,用于以编程方式控制鼠标和键盘。

虚假数据

Mimesis是一款高性能的 Python 虚假数据生成器,它
能够以多种语言提供各种用途的数据。这些虚假数据可用于填充测试数据库、创建虚假 API 端点、创建任​​意结构的 JSON 和 XML 文件,以及对从生产环境中获取的数据进行匿名化处理等。

图像

主要特点是:

  • 性能:适用于 Python 的最快的数据生成器。
  • 可扩展性:您可以创建自己的数据提供程序并将它们与 Mimesis 一起使用。
  • 通用数据提供者从单个对象简化对所有提供者的访问。
  • 多语言:支持多种语言的数据。
  • 数据多样性:支持多种数据提供商,满足多种用途。
  • 基于模式的生成器:提供一种简单的机制,通过任何复杂程度的模式生成数据。
  • 特定国家/地区数据提供商:仅提供某些国家/地区特定的数据。

用法:

>>> from mimesis import Person
>>> person = Person('en')

>>> person.full_name()
'Brande Sears'

>>> person.email(domains=['mimesis.name'])
'roccelline1878@mimesis.name'

>>> person.email(domains=['mimesis.name'], unique=True)
'f272a05d39ec46fdac5be4ac7be45f3f@mimesis.name'

>>> person.telephone(mask='1-4##-8##-5##3')
'1-436-896-5213'

使用模式生成数据:

from mimesis.schema import Field, Schema
from mimesis.enums import Gender

_ = Field('en')

schema = Schema(schema=lambda: {
    'id': _('uuid'),
    'name': _('text.word'),
    'version': _('version', pre_release=True),
    'timestamp': _('timestamp', posix=False),
    'owner': {
        'email': _('person.email', domains=['test.com'], key=str.lower),
        'token': _('token_hex'),
        'creator': _('full_name', gender=Gender.FEMALE)},
})
data = schema.create(iterations=1)

结果:

[   {   'id': 'bd69b0b1-ac7f-42a7-a6b7-0fe04e8847d3',
        'name': 'certified',
        'owner': {   'creator': 'Dorthey Ramsey',
                     'email': 'birretta1894@test.com',
                     'token': '9cddc4363819109adf4a3cc0065bfdb8c38c5ce8244af4da68e75a45cf5bdc12'},
        'timestamp': '2005-04-18T13:09:37Z',
        'version': '9.9.0-rc.7'}]

嘲讽

FreezeGun是一个库,它允许你的 Python 测试通过模拟模块来穿越时间datetime

一旦装饰器或上下文管理器被调用,所有对datetime.datetime.now()datetime.datetime.utcnow()datetime.date.today()time.time()time.localtime()time.gmtime()和 的调用time.strftime()都将返回已冻结的时间。

HTTPretty是一个用于 Python 的 HTTP 客户端模拟工具 - 受到 Ruby 的 Fakeweb 启发。

常见用例:

  • API 集成的测试驱动开发
  • 外部 API 的虚假响应
  • 记录和回放 HTTP 请求

响应是一个用于模拟请求 Python 库的实用程序库。

使用示例:

import responses
import requests

@responses.activate
def test_simple():
    responses.add(responses.GET, 'http://twitter.com/api/1/foobar',
                  json={'error': 'not found'}, status=404)

    resp = requests.get('http://twitter.com/api/1/foobar')

    assert resp.json() == {"error": "not found"}

    assert len(responses.calls) == 1
    assert responses.calls[0].request.url == 'http://twitter.com/api/1/foobar'
    assert responses.calls[0].response.text == '{"error": "not found"}'

代码覆盖率

Coverage.py通常在测试执行期间测量代码覆盖率。它使用 Python 标准库中提供的代码分析工具和跟踪钩子来确定哪些行是可执行的,哪些行已被执行。

对象工厂

factory_boy是基于 thoughtbot 的 factory_bot 的固定装置替代品。

作为一种固定装置替换工具,它旨在用易于使用的复杂对象工厂替换静态的、难以维护的固定装置。

代码风格

wemake-python-styleguide实际上是一个 flake8 插件,依赖一些其他插件。

pycodestyle是一个用来检查你的 Python 代码是否符合 PEP8 中的一些样式约定的工具。

特征:

  • 插件架构:添加新检查很容易。
  • 可解析的输出:跳转到编辑器中的错误位置。
  • 小巧:仅需一个 Python 文件,即可实现此目的stdlib。您只需使用 即可pycodestyle.py实现此目的。
  • 附带全面的测试套件。

Black是一款毫不妥协的 Python 代码格式化工具。使用它,您就意味着您同意放弃手动格式化的繁琐细节。作为回报, Black为您提供速度、确定性,让您免于pycodestyle为格式化而烦恼。这样,您就可以节省时间和精力,专注于更重要的事情。

打字

mypy是 Python 的可选静态类型检查器。您可以为 Python 程序添加类型提示 (PEP 484),并使用mypy它进行静态类型检查。无需运行程序即可发现其中的错误!

下面是一个小例子来激发你的食欲(Python 3):

from typing import Iterator

def fib(n: int) -> Iterator[int]:
    a, b = 0, 1
    while a < n:
        yield a
        a, b = b, a + b

Pyre是符合 PEP 484 的高性能 Python 类型检查器。Pyre
可以逐步分析包含数百万行代码的代码库,并在开发人员编写代码时为他们提供即时反馈。

Pyre 附带 Pysa,这是我们在 Pyre 之上构建的一款专注于安全的静态分析工具,用于推理 Python 应用程序中的数据流。请参阅我们的文档,开始使用我们的安全分析。

存储库:https://github.com/facebook/pyre-check

Typeshed包含 Python 标准库
和 Python 内置函数的外部类型注释,以及由这些项目外部的人员贡献的第三方包。

django-stubs包含类型存根和一个自定义mypy插件,用于为Django框架提供更精确的静态类型和类型推断。Django 使用了一些 Python“魔法”
,这使得某些代码模式的精确类型变得难以实现。这就是我们需要这个项目的原因。最终目标是能够为大多数常见模式获取精确的类型。

返回将使您的函数返回一些有意义的、类型的、安全的东西!

特征:

  • 将函数式编程引入 Python
  • 提供一系列原语来编写声明式业务逻辑
  • 实施更好的架构
  • 完全类型化并带有注释mypy,兼容 PEP561
  • 添加模拟高级类型的支持
  • 有一堆助手可以更好地进行构图
  • 写起来和读起来都充满 Python 风格,令人愉悦🐍
  • 支持函数和协程,与框架无关
  • 易于上手:有大量文档、测试和教程

现在就这样了!

您可以在我的个人博客上阅读更多内容:https://isaak.dev

鏂囩珷鏉ユ簮锛�https://dev.to/likid_geimfari/python-libraries-to-make-your-code-read-reliable-and-maintainable-3p9l
PREV
从无家可归到收入六位数:学习如何编码。
NEXT
加入 DEV 团队✅ GenAI LIVE!| 2025 年 6 月 4 日