使用 tox 自动化你的 Python 代码测试

了解更多关于在我们涵盖七个 PyPI 库的系列中解决常见 Python 问题的信息。
181 位读者喜欢这篇文章。
CICD with gears

opensource.com

Python 是当今使用最流行的编程语言之一,原因有很多:它是开源的,用途广泛(例如 Web 编程、商业应用程序、游戏、科学编程等等),并且拥有充满活力和专注的社区为其提供支持。正是这个社区使我们在 Python 包索引 (PyPI) 中拥有如此庞大、多样化的软件包,以扩展和改进 Python 并解决不可避免出现的小故障。

在本系列中,我们将研究七个 PyPI 库,它们可以帮助你解决常见的 Python 问题。今天,我们将研究 tox,这是一种用于自动化 Python 代码测试的工具。

tox

在编写 Python 代码时,最好进行自动化检查。虽然你可以将运行检查的规则直接转储到持续集成 (CI) 环境中,但这通常不是最佳选择。 除此之外,在本地运行测试(使用与 CI 运行相同的参数)以节省 CI 时间非常有用。

tox 项目旨在针对不同版本的 Python 和不同版本的依赖项运行不同的检查。 很快,我们发现限制因素不是 tox 的灵活性,而是选项组合爆炸的严酷现实!

例如,一个简单的 tox 配置可以针对多个版本的 Python 运行相同的测试。

[tox]
envlist = py36,py37
[testenv]
deps =
    pytest
commands =
    pytest mylibrary

Tox 将根据环境版本自动使用正确版本的解释器来创建虚拟环境。 如果虚拟环境丢失或依赖项发生更改,Tox 将自动重建虚拟环境。

可以在环境中显式指示 Python 版本。

[tox]
envlist = py36,py37,docs
[testenv]
deps =
    pytest
commands =
    pytest mylibrary
[testenv:docs]
changedir = docs
deps =
    sphinx
commands =
    sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html
basepython = python3.7

此示例使用 Sphinx 为库构建文档。 一个好处是 Sphinx 库将仅安装在 docs 虚拟环境中。 如果 mylibrary 导入了 Sphinx,但忘记指示显式依赖项,则测试将正确失败。

我们还可以使用 tox 运行具有不同依赖项版本的测试。

[tox]
envlist = {py36,py37}-{minimum,current}
[testenv]
deps =
  minimum: thirdparty==1.0
  current: thirdparty
  pytest
commands =
    pytest mylibrary

这将运行四个不同的测试运行:py36-minimumpy36-currentpy37-minimumpy37-current。 这在我们的库依赖于 thirdparty>=1.0 的情况下很有用:每个测试运行都确保我们仍然与 1.0 版本兼容,同时还确保最新版本不会破坏我们。

在 tox 中运行 linter 也是一个好主意。 例如,运行 Black 将会做正确的事情。

[tox]
envlist = py36,py37,py36-black
[testenv]
deps =
    pytest
commands =
    pytest mylibrary
[testenv:py36-black]
deps =
    black
commands =
    black --check --diff mylibrary

默认情况下,tox 将运行所有测试环境。 但是你可以只运行一个环境; 例如,如果你只想运行 Black,请运行 tox -e py36-black

如果你有一个你关心的 Python 库,请将 tox.ini 添加到你的工作流程中,以保持其高质量。

在本系列的下一篇文章中,我们将研究 flake8,这是一个 linter 和 linting 平台,可确保 Python 代码的一致性。

回顾本系列之前的文章

接下来阅读什么
标签
Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
Moshe 自 1998 年以来一直参与 Linux 社区,帮助举办 Linux “安装聚会”。 他自 1999 年以来一直在编写 Python 程序,并为核心 Python 解释器做出了贡献。 Moshe 在这些术语存在之前就一直是 DevOps/SRE,他非常关心软件可靠性、构建可重现性以及其他此类事情。

评论已关闭。

© 2025 open-source.net.cn. All rights reserved.