Python任務自動化工具 tox 教程

​參考:https://zhuanlan.zhihu.com/p/101330325

一個神奇的測試工具 tox,本文將對它做簡單的介紹,說不定大家在開發項目時能夠用得上。

Python任務自動化工具 tox 教程

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

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

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

Python任務自動化工具 tox 教程

1、tox 能做什麼?

細分的用途包括:

  • 創建開發環境
  • 運行靜態代碼分析與測試工具
  • 自動化構建包
  • 針對 tox 構建的軟件包運行測試
  • 檢查軟件包是否能在不同的 Python 版本/解釋器中順利安裝
  • 統一持續集成(CI)和基於命令行的測試
  • 創建和部署項目文檔
  • 將軟件包發佈到 PyPI 或任何其它平臺
Python任務自動化工具 tox 教程

2、tox 怎麼配置?

關於它的用法:使用pip install tox 安裝,使用tox 運行全部測試環境,和tox -e envname運行指定的環境。還有不少的命令行參數,通過tox -h 查看。

tox 的行為由其配置文件控制,當前它支持 3 種配置文件:

  1. pyproject.toml
  2. tox.ini
  3. setup.cfg

以 tox 項目自己的 tox.ini 配置內容為例

Python任務自動化工具 tox 教程


Python任務自動化工具 tox 教程

每個[xxx]及其下方內容組成一個章節(section),每個章節間使用空行作間隔。

[tox]下面是全局性的配置項,envlist 字段定義了 tox 去操作的環境。[xxx]下面是 xxx 虛擬環境的配置項,[xxx:yyy]繼承 xxx 的配置,同時其自身配置項的優先級更高。

對於每個虛擬環境,可用的配置項很多,例如常用的有:description(描述信息)、basepython(Python解釋器版本)、deps(環境依賴項)、commands(命令語句)等等。

tox 還支持作變量替換,它提供了一些內置的基礎變量(全局的或對於虛擬環境的):{toxinidir}、{homedir}、{envname}、{envdir}等等。

除了基礎性的變量替換,它還支持這些高級用法:

Python任務自動化工具 tox 教程

  • 取操作系統的環境變量:{env:KEY},效果等同於os.environ['KEY'] 。可以變化成:{env:KEY:DEFAULTVALUE},在取不到環境變量時則使用默認值;{env:KEY:{env:DEFAULT_OF_KEY}},達到 if-else 的取值效果
  • 傳遞命令行參數:{posargs:DEFAULTS},當沒有命令行參數時,使用 DEFAULTS 值。使用方式:tox arg1 arg2 傳兩個參,或者tox -- --opt1 arg1 將“-- opt1 arg1”作為整體傳入。
  • 章節間傳值:{[sectionname]valuename},不同章節的內容可以傳遞使用。
  • 交互式控制檯注入:{tty:ON_VALUE:OFF_VALUE},當交互式 shell 控制檯開啟時,使用第一個值,否則使用第二個。pytest 在使用“--pdb”時,是這樣的例子。
  • 花括號“{}”除了可以做變量替換使用,它還可以作為“或關係”判斷的取值。直接看下面的例子:

    <code>[tox]
    envlist = {py27,py36}-django{15,16}/<code>

    {py27,py36}-django{15,16} 的 2 組花括號內各有 2 個值,它們實際可以組合成 4 個環境:py27-django15、py27-django16、py36-django15、py36-django16。

    關於 tox 有哪些配置項、使用條件、什麼含義、高級用法等等內容,可在官方文檔中查看

    3、tox 的插件化

    除了自身強大的可配置性,tox 還具有很強的可擴展性,它是可插拔的(pluggable),圍繞它產生了一個極為豐富的插件生態。

    使用pip search tox ,可以看到數量眾多的“tox-”開頭的庫,它們都是 tox 的插件包。其中不乏 setuptools、pipenv、conda、travis、pytest、docker 等被大家熟知的名字。


    Python任務自動化工具 tox 教程


    Python任務自動化工具 tox 教程

    4、tox 的工作流程

    接下來看看 tox 是怎麼運作的:

    Python任務自動化工具 tox 教程

    其工作流程中主要的環節有:

    • 配置(從figuration):加載配置文件(如 tox.ini),解析命令行參數,讀取系統環境變量等
    • 打包(packaging):可選的,對於帶有 setup.py 文件的項目,可以在這步去生成它的源發行版
    • 創建虛擬環境:默認使用 virtualenv 來創建虛擬環境,並根據配置項中的“deps”安裝所需的依賴項,然後執行配置好的命令(commands)
    • 報告(report):彙總所有虛擬環境的運行結果並羅列出來

    5、小結

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

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

    tox 還有強大的可配置性與豐富的插件支持,這使得它在運用上具有很大的可能性與自由度。因此,不少忠實開發者仍在持續地在使用它。

    Python任務自動化工具 tox 教程

    最後還需補充一點,tox 使用配置文件作驅動,但配置文件還是挺繁瑣的,因此有人開發了一個跟 tox 相似的nox,使用 Python 文件來做配置。這個項目也很受歡迎,吸引了很多項目投入其門下,例如 pipx、urllib3、Salt 等等。

    結尾

    最後多說一句,小編是一名python開發工程師,這裡有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。想要這些資料的可以關注小編,並在後臺私信小編:“01”即可領取。


    分享到:


    相關文章: