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-minimum、py36-current、py37-minimum 和 py37-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 代码的一致性。
评论已关闭。