首頁 > 軟體

淺談Python任務自動化工具Tox基本用法

2022-06-22 14:01:38

淺談Python任務自動化工具Tox

引言:

最近在蒐集github上包含測試樣例的Python專案,並試圖在docker環境下跑通這些專案,發現這些專案主要使用的測試框架有 : unittest, pytest ,nosetest。還有一些用到了自動化工具Tox,所以簡單瞭解了一下。

簡介:

Command line driven CI frontend and development task automation tool
命令列驅動的 CI 前端和開發任務自動化工具

tox 的專案地址是:https://github.com/tox-dev/tox

其核心作用是支援建立隔離的 Python 環境,在裡面可以安裝不同版本的 Python 直譯器與各種依賴庫,以此方便開發者做自動化測試、打包、持續整合等事情。

簡單來說,tox 是一個管理測試虛擬環境的命令列工具。 它已存在多年且廣被開發者們使用,例如,著名的雲端計算平臺 OpenStack 也採用了它,作為最基礎的測試工具之一。

基本用法:

安裝

pip install tox

將有關專案和希望專案在其中執行的測試環境的基本資訊放入應位於檔案旁邊的檔案中:tox.ini setup.py

# content of: tox.ini , put in same dir as setup.py
[tox]
envlist = py27,py36
[testenv]
# install testing framework
# ... or install anything else you might need here
deps = pytest
# run the tests
# ... or run any other command line tool you need to run here
commands = pytest

若要打包、安裝和測試專案,現在可以在命令提示字元下鍵入:

tox

組態檔:

tox 的行為由其組態檔控制,當前它支援 3 種組態檔:

  • pyproject.toml
  • tox.ini
  • setup.cfg

我們以**python-project-wizard**專案為例,看一下開發人員寫的tox組態檔。

pyproject.toml

[tool]
[tool.poetry]
name = "ppw"
version = "1.1.1"
description = "A Wizard to create a skeleton python project with up-to-date technology"
license = "BSD-3-Clause"
authors = ["Aaron Yang <aaron_yang@jieyu.ai>"]
readme = "README.md"
repository = "https://github.com/zillionare/cookiecutter-pypackage"
documentation = "https://zillionare.github.io/cookiecutter-pypackage/"
keywords = ['cookiecutter', 'template', 'package']
packages = [
  {include = "ppw"}
]

include = [
  '{{cookiecutter.project_slug}}/**/*',
  'cookiecutter.json',
  'hooks/*'
]

[tool.poetry.dependencies]
python = ">=3.7,<4.0"
cookiecutter = "1.7.2"

pytest = {version = "^5.4.3", optional=true}
pytest-cookies = {version = "^0.5.1", optional=true}
pyyaml = {version="^5.3.1",optional=true}
mkdocs = {version="^1.1.2",optional=true}
mkdocs-material = {version="^6.1.7",optional=true}
mkdocs-material-extensions = {version="^1.0.1",optional=true}
pytest-cov = {version="^2.10.1",optional=true}
tox = {version = "^3.20.1", optional=true}
mkdocs-include-markdown-plugin = {version = "^2.8.0", optional=true}
fire = {version="^0.4.0", optional=true}
pre-commit = {version="^2.18.1",optional=true}

[tool.poetry.extras]
dev = [
  "pytest",
  "pytest-cookies",
  "pyyaml",
  "mkdocs",
  "mkdocs-material",
  "mkdocs-material-extensions",
  "pytest-cov",
  "tox",
  "mkdocs-include-markdown-plugin",
  "fire"
]

[tool.black]
line-length = 88
include = '.pyi?$'
exclude = '''
/(
    .eggs
  | .git
  | .hg
  | .mypy_cache
  | .tox
  | .venv
  | _build
  | buck-out
  | build
  | dist
)/
'''

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

[tool.poetry.scripts]
ppw = 'ppw.cli:main'
  • INI(.ini)檔案是一種非常原始的基礎形式,但各家有各家的用法,而且它最多隻能解決一層巢狀。只適合非常非常簡單的組態檔,一旦需要兩層巢狀,或需要陣列,就力不從心了。
  • 終於,TOML(.toml)橫空出世。它徹底放棄了括號或縮排的底層原理,而是採取了顯式鍵名鏈的方式。

tox.ini

[tox]
envlist = py37,py38,py39,py310, docs
isolated_build = True

[gh-actions]
python =
    3.7: py37
    3.8: py38, docs
    3.9: py39
    3.10: py310

[testenv:docs]
basepython=python
allowlist_externals = mkdocs
commands= mkdocs build

[testenv]
extras =
    dev

setenv =
    PYTHONPATH = {toxinidir}

commands = pytest -s --cov-report=term-missing tests
  • 每個[xxx]及其下方內容組成一個章節(section),每個章節間使用空行作間隔。
  • [tox]下面是全域性性的設定項
  • [xxx:yyy]繼承 xxx 的設定,同時其自身設定項的優先順序更高。
  • 對於每個虛擬環境,可用的設定項很多,例如常用的有:description(描述資訊)、basepython(Python直譯器版本)、deps(環境依賴項)、commands(命令語句)等等。

tox 的工作流程:

  • 設定(從figuration):載入組態檔(如 tox.ini),解析命令列引數,讀取系統環境變數等
  • 打包(packaging):可選的,對於帶有 setup.py 檔案的專案,可以在這步去生成它的源發行版
  • 建立虛擬環境:預設使用 virtualenv 來建立虛擬環境,並根據設定項中的“deps”安裝所需的依賴項,然後執行設定好的命令(commands)
  • 報告(report):彙總所有虛擬環境的執行結果並羅列出來 安裝使用:

安裝:

使用tox-quickstart快速生成tox.ini,也可以根據模板手寫tox.ini檔案

使用:

  • 設定好檔案後,可以tox 直接執行,也可以tox -e test_api
  • 如果在其他目錄下執行,則需要tox -c /test/tox.ini -c是指定組態檔的意思

小結:

tox 本身定位是一個測試工具,它試圖令 Python 測試工作變得自動化、標準化與流程化。但跟 unittest 和 pytest 這些測試框架不同,它作用的是程式碼層面之外的事情,是一種專案級的工具。因此,它需要跟這些測試框架相結合,或者同時處理多種自動化任務(如跑 pep8、測程式碼覆蓋率、生成檔案等等),這樣才能更好地發揮它的價值。

它的一大特色在於建立/管理虛擬環境,但這只是為了方便測試而使用的手段,因此相比其它可管理虛擬環境的工具,如 Virtualenvwrapper、conda、pipenv、poetry,它在某些方面就存在著不足。

到此這篇關於淺談Python任務自動化工具Tox的文章就介紹到這了,更多相關Python任務自動化工具Tox內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com