嘿那里!
有一个 Python 项目并需要确保它适用于 Python 的每个版本?相信我,这可能会让人非常头疼。但别担心,我会支持你的。在本指南中,我将向您展示如何使用 Tox、Nox 和 CI/CD 这些很棒的工具来跨多个 Python 版本测试您的代码。
你猜怎么着?这比你想象的要容易。
当您读完本文时,您将像专业人士一样在 Python 3.8 到 3.13 上运行测试。我们会让事情变得简单、有趣并且完全可行。听起来不错吗?让我们深入了解一下。
想象一下:您编写了一些很酷的 Python 代码,并且它可以在您的计算机上运行。但随后,嘭!一位用户给您发电子邮件,说它在 Python 3.9 上崩溃了。你尝试了一下,果然出了问题。
为什么?
因为Python有所有这些版本,并且每个版本都有其怪癖。如果你不在多个版本上测试你的代码,那么你就是盲目的。
但好消息是,您不必手动安装一堆 Python 版本并对每个版本运行测试。这就是 Tox 和 Nox 像超级英雄一样突然出现的地方。
让我们来分解一下:
Tox:将其视为在不同 Python 环境中测试代码的机器人。它组织得非常好,并遵循简单的 tox.ini 文件中的指令。你告诉 Tox 做什么,它就会这么做。
Nox:它就像 Tox,但在某些方面更酷。为什么?因为您不需要编写配置文件,而是编写 Python 脚本 (noxfile.py)。想要添加自定义逻辑或条件? Nox 为您提供支持。
那么哪个更好呢?老实说,这取决于。如果您喜欢简洁明了的事物,请选择 Tox。如果您是创意型人士并且喜欢灵活性,Nox 就是您的选择。
这是交易:
我们将创建一个具有两个简单功能的迷你项目:
我们将编写一些测试来确保它们工作,然后我们将使用 Tox 和 Nox 在 Python 版本 3.8 到 3.13 上测试它们。
听起来很有趣,对吧?
这是我们正在使用的文件结构:
tox-nox-python-test-automation/ ├── tox_nox_python_test_automation/ │ ├── __init__.py │ ├── main.py │ └── calculator.py ├── tests/ │ ├── __init__.py │ └── test_calculator.py ├── pyproject.toml ├── tox.ini ├── noxfile.py ├── README.md
这是我们的calculator.py:
def add(a, b): """Returns the sum of two numbers.""" return a + b def subtract(a, b): """Returns the difference of two numbers.""" return a - b
简单吧?让我们保持这样吧。
是时候确保我们的代码有效了。这是我们的test_calculator.py:
tox-nox-python-test-automation/ ├── tox_nox_python_test_automation/ │ ├── __init__.py │ ├── main.py │ └── calculator.py ├── tests/ │ ├── __init__.py │ └── test_calculator.py ├── pyproject.toml ├── tox.ini ├── noxfile.py ├── README.md
我们正在使用pytest,这是一个测试工具,基本上是 Python 测试的 MVP。如果您从未使用过它,请不要担心,它非常容易上手。
好的,那么我们如何确保参与该项目的每个人都使用相同的依赖项?我们使用 Poetry,它就像一个增压的 requests.txt 文件。
这是我们的 pyproject.toml 的样子:
def add(a, b): """Returns the sum of two numbers.""" return a + b def subtract(a, b): """Returns the difference of two numbers.""" return a - b
要安装所有内容,只需运行:
import pytest from tox_nox_python_test_automation.calculator import add, subtract @pytest.mark.parametrize("a, b, expected", [ (1, 2, 3), (-1, 1, 0), (0, 0, 0), ]) def test_add(a, b, expected): assert add(a, b) == expected @pytest.mark.parametrize("a, b, expected", [ (5, 3, 2), (10, 5, 5), (-1, -1, 0), ]) def test_subtract(a, b, expected): assert subtract(a, b) == expected
您可以这样运行基本单元测试:
[tool.poetry] name = "tox_nox_python_tests" version = "0.1.0" description = "Testing with multiple Python versions using Tox and Nox." authors = ["Wallace Espindola <wallace.espindola@gmail.com>"] license = "MIT" [tool.poetry.dependencies] python = "^3.8" pytest = "^8.3" nox = "^2024.10.9" tox = "^4.23.2"
并且将看到标准单元测试运行输出。
Tox 就是自动化。这是我们的tox.ini:
poetry install
使用一个命令运行 Tox:
poetry run pytest --verbose
繁荣! Tox 将在列出的每个 Python 版本上测试您的代码。请参阅此处的示例输出:
想要更多控制权? Nox 让您发挥创意。这是我们的noxfile.py:
[tox] envlist = py38, py39, py310, py311, py312, py313 [testenv] allowlist_externals = poetry commands_pre = poetry install --no-interaction --no-root commands = poetry run pytest
运行 Nox:
poetry run tox
现在您可以完全灵活地添加逻辑、跳过环境或执行您需要的任何其他操作。请参阅此处的示例输出:
为什么要停止本地测试?让我们将其设置为在 GitHub Actions 和 GitLab CI/CD 上自动运行。
GitHub 操作
这是一个工作流程文件.github/workflows/python-tests.yml:
import nox @nox.session(python=["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]) def tests(session): session.install("poetry") session.run("poetry", "install", "--no-interaction", "--no-root") session.run("pytest")
GitLab CI/CD
这是一个 .gitlab-ci.yml:
poetry run nox
你做到了!您现在知道如何使用 Tox、Nox 和 Poetry 跨多个版本测试 Python 代码。
以下是要记住的内容:
此项目使用 Tox、Nox、Poetry 和 Pytest 进行测试自动化。详细文档请查看:
毒性文档
Nox 文档
诗歌文献
Pytest 文档
需要完整的代码和示例吗?查看 GitHub 上的存储库:tox-nox-python-tests。
有关其他有趣的主题和技术讨论,请查看我的 LinkedIn 页面。
现在就出去让你的 Python 项目防弹吧! ?
以上是像专业人士一样使用 Poetry、Tox、Nox 和 CI/CD 测试 Python 代码的详细内容。更多信息请关注PHP中文网其他相关文章!