Hei!
Mendapat projek Python dan perlu memastikan ia berfungsi pada setiap versi Python di luar sana? Percayalah, itu boleh menjadi sakit kepala yang BESAR. Tetapi jangan risau, saya ada di belakang anda. Dalam panduan ini, saya akan menunjukkan kepada anda cara menggunakan Tox, Nox dan CI/CD, alatan yang hebat, untuk menguji kod anda merentas berbilang versi Python.
Dan teka apa? Ia lebih mudah daripada yang anda fikirkan.
Apabila anda selesai membaca ini, anda akan menjalankan ujian seperti pakar merentasi Python 3.8 hingga 3.13. Kami akan memastikan perkara mudah, menyeronokkan dan boleh diambil tindakan sepenuhnya. Bunyi bagus? Mari selami.
Gambar ini: Anda menulis beberapa kod Python yang hebat, dan ia berfungsi pada komputer anda. Tetapi kemudian, BAM! Seorang pengguna menghantar e-mel kepada anda, mengatakan ia rosak pada Python 3.9. Anda mencubanya, dan sudah pasti, ada sesuatu yang tidak kena.
Kenapa?
Kerana Python mempunyai semua versi ini, dan setiap versi mempunyai ciri tersendiri. Jika anda tidak menguji kod anda pada berbilang versi, anda benar-benar buta.
Tetapi BERITA BAIKnya ialah, anda tidak perlu memasang sekumpulan versi Python secara manual dan menjalankan ujian pada setiap satu. Di situlah Tox dan Nox masuk seperti wira-wira.
Mari kita pecahkan:
Tox: Anggap ia sebagai robot yang menguji kod anda dalam persekitaran Python yang berbeza. Ia sangat teratur dan mengikut arahan anda daripada fail tox.ini yang mudah. Anda memberitahu Tox apa yang perlu dilakukan, dan ia melakukannya.
Nox: Ia seperti Tox, tetapi lebih sejuk dalam beberapa cara. kenapa? Kerana bukannya fail konfigurasi, anda boleh menulis skrip Python (noxfile.py). Ingin menambah logik atau syarat tersuai? Nox membelakangi anda.
Jadi yang mana lebih baik? Secara jujur, ia bergantung. Jika anda suka perkara yang kemas dan mudah, gunakan Tox. Jika anda jenis kreatif dan sukakan fleksibiliti, Nox ialah kesesakan anda.
Ini tawarannya:
Kami akan mencipta projek mini dengan dua fungsi mudah:
Kami akan menulis beberapa ujian untuk memastikan ia berfungsi, dan kemudian kami akan menggunakan Tox dan Nox untuk mengujinya pada versi Python dari 3.8 hingga 3.13.
Seronok bunyinya, kan?
Berikut ialah struktur fail yang sedang kami usahakan:
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
Inilah kalkulator.py kami:
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
Mudah, bukan? Mari kekalkan cara itu.
Masa untuk memastikan kod kami berfungsi. Inilah test_calculator.py kami:
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
Kami menggunakan pytest, alat ujian yang pada asasnya MVP ujian Python. Jika anda tidak pernah menggunakannya, jangan berpeluh, ia sangat mudah untuk diambil.
Baiklah, jadi bagaimana kami memastikan semua orang yang bekerja pada projek ini menggunakan kebergantungan yang sama? Kami menggunakan Puisi, yang seperti fail supercharged requirements.txt.
Begini rupa pyproject.toml kami:
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
Untuk memasang semuanya, jalankan sahaja:
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
Anda boleh menjalankan ujian unit asas dengan cara ini:
[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"
Dan akan melihat ujian unit standard menjalankan output.
Tox adalah mengenai automasi. Inilah tox.ini kami:
poetry install
Jalankan Tox dengan satu arahan:
poetry run pytest --verbose
Dan ledakan! Tox akan menguji kod anda merentas setiap versi Python yang disenaraikan. Lihat dan contoh output di sini:
Mahukan lebih kawalan? Nox membolehkan anda menjadi kreatif. Inilah noxfile.py kami:
[tox] envlist = py38, py39, py310, py311, py312, py313 [testenv] allowlist_externals = poetry commands_pre = poetry install --no-interaction --no-root commands = poetry run pytest
Jalankan Nox dengan:
poetry run tox
Kini anda mempunyai fleksibiliti penuh untuk menambah logik, melangkau persekitaran atau melakukan apa sahaja yang anda perlukan. Lihat dan contoh output di sini:
Mengapa berhenti di ujian tempatan? Mari sediakan ini untuk dijalankan secara automatik pada GitHub Actions dan GitLab CI/CD.
Tindakan GitHub
Berikut ialah fail aliran kerja .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
Berikut ialah .gitlab-ci.yml:
poetry run nox
Anda berjaya! Anda kini tahu cara menguji kod Python merentas berbilang versi menggunakan Tox, Nox dan Puisi.
Inilah perkara yang perlu diingat:
Projek ini menggunakan Tox, Nox, Puisi dan Pytest untuk automasi ujian. Untuk dokumentasi terperinci, sila lihat:
Dokumentasi Tox
Dokumentasi Nox
Dokumentasi Puisi
Dokumentasi Pytest
Perlukan kod penuh dan contoh? Lihat repo di GitHub: tox-nox-python-tests.
Untuk subjek menarik dan perbincangan teknikal lain, semak halaman LinkedIn saya.
Sekarang pergi ke sana dan jadikan projek Python anda kalis peluru! ?
Atas ialah kandungan terperinci Uji Kod Python Seperti Pro dengan Puisi, Tox, Nox dan CI/CD. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!