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
,然后安装项目和其他必要的依赖项并运行配置的命令集:
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 社区提供的插件,也可以自行创建。
使用示例:
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://twitter.com/likid_geimfari
- GitHub:https://github.com/lk-geimfari
- 电报:@the_art_of_development