網站首頁 編程語言 正文
淺談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,它在某些方面就存在著不足。
原文鏈接:https://blog.csdn.net/matafeiyanll/article/details/125389759
相關推薦
- 2024-02-26 gitlab合并分支
- 2022-06-20 React中styled-components的使用_React
- 2023-01-23 Python列表對象中元素的刪除操作方法_python
- 2023-05-08 Android事件分發之View事件處理關鍵及示例分析_Android
- 2024-04-08 Linux 服務器連接方式
- 2022-08-14 Android?MonoRepo多倉和單倉的差別理論_Android
- 2023-06-13 C語言中求余運算符的使用解讀_C 語言
- 2022-05-15 C++11:lambda表達式詳細介紹
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支