最近在搜集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 <[email protected]>"]
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
)文件是一種非常原始的基礎形式,但各家有各家的用法,而且它最多只能解決一層嵌套。只適合非常非常簡單的配置文件,一旦需要兩層嵌套,或需要數組,就力不從心了。.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
安裝:
使用tox-quickstart快速生成tox.ini,也可以根據模板手寫tox.ini文件
使用:
tox 本身定位是一個測試工具,它試圖令 Python 測試工作變得自動化、標准化與流程化。但跟 unittest 和 pytest 這些測試框架不同,它作用的是代碼層面之外的事情,是一種項目級的工具。因此,它需要跟這些測試框架相結合,或者同時處理多種自動化任務(如跑 pep8、測代碼覆蓋率、生成文檔等等),這樣才能更好地發揮它的價值。
它的一大特色在於創建/管理虛擬環境,但這只是為了方便測試而使用的手段,因此相比其它可管理虛擬環境的工具,如 Virtualenvwrapper、conda、pipenv、poetry,它在某些方面就存在著不足。