0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用tox來(lái)實(shí)現(xiàn)Python中的標(biāo)準(zhǔn)化和自動(dòng)化測(cè)試

jf_pJlTbmA9 ? 來(lái)源:NVIDIA ? 作者:NVIDIA ? 2023-07-05 16:30 ? 次閱讀

許多開發(fā)人員使用 tox 作為 Python 中標(biāo)準(zhǔn)化和自動(dòng)化測(cè)試的解決方案。然而,僅將該工具用于測(cè)試自動(dòng)化嚴(yán)重限制了其功能和您可以實(shí)現(xiàn)的全部范圍。例如, tox 也是“它在我的機(jī)器上工作”問(wèn)題的一個(gè)很好的解決方案。這有幾個(gè)原因,例如:

可以針對(duì)不同的 Python 依賴項(xiàng)版本運(yùn)行測(cè)試

可以隔離環(huán)境變量

可以捕獲并運(yùn)行設(shè)置命令

此外,最重要的是,上面列出的操作可以在 Windows 、 macOS 和 Linux OS 上執(zhí)行。在本教程中,我將深入探討 tox 的工作原理以及如何使用它來(lái)節(jié)省寶貴的資源。我還將提供具體的代碼示例來(lái)演示如何利用 tox 。

什么是 Tox?

如果你讀了 tox documentation ,并從字面上理解它的意思,你可能會(huì)認(rèn)為 tox 只是一個(gè)用來(lái)創(chuàng)建虛擬環(huán)境的工具,用來(lái)安裝測(cè)試 Python 包所需的必要依賴項(xiàng)。

該文檔指出,“ tox 旨在自動(dòng)化和標(biāo)準(zhǔn)化 Python 中的測(cè)試。它是簡(jiǎn)化 Python 軟件的打包、測(cè)試和發(fā)布過(guò)程的更大愿景的一部分?!痹撐臋n后來(lái)指出,“ tox 是一個(gè)通用的virtualenv管理和測(cè)試命令行工具?!?。同一文檔中的幾個(gè)示例演示了 tox 用于構(gòu)建文檔和運(yùn)行開發(fā)環(huán)境。

然而,最好將 tox 視為自動(dòng)化某些工作流和管理虛擬環(huán)境的工具。 tox 文檔中提供的示例配置文件如下所示。

# content of: tox.ini , put in same dir as setup.py
[tox]
envlist = py27,py36

[testenv]
# install pytest in the virtualenv where commands will be executed
deps = pytest
commands =
    # NOTE: you can run any command line tool here - not just tests
    pytest

請(qǐng)注意,該文件僅安裝并運(yùn)行 Pytest ;然而,文檔指出,“您可以在這里運(yùn)行任何命令行工具,而不僅僅是測(cè)試。”

tox 是如何工作的?

tox 文檔的 System Overview 部分提供了一個(gè)工作流圖(圖 1 )。該圖顯示了 tox 如何通過(guò)將工作流分解為一系列步驟來(lái)工作,概述如下。

使用tox.ini文件中定義的 Python 版本生成虛擬環(huán)境。

將tox.ini文件的deps設(shè)置下列出的依賴項(xiàng)安裝到虛擬環(huán)境中。如果創(chuàng)建了一個(gè)項(xiàng)目(可選),它還將安裝該項(xiàng)目的sdist。

在隔離的虛擬環(huán)境中運(yùn)行命令;命令列在命令設(shè)置下。

將每個(gè)環(huán)境的結(jié)果返回給用戶。

tox-environment-diagram.png 圖 1 。 tox 的工作流程圖。信貸: tox documentation

這些步驟進(jìn)一步表明, tox 是一個(gè)有效的開發(fā)工具,可以通過(guò)創(chuàng)建虛擬環(huán)境并在其中運(yùn)行命令來(lái)自動(dòng)化工作流。由于您可以傳遞給 tox 的命令不限于執(zhí)行測(cè)試的命令,因此 tox 不僅僅是標(biāo)準(zhǔn)化和自動(dòng)化測(cè)試的工具。

tox 的好處

本節(jié)重點(diǎn)介紹了使用 tox 管理虛擬環(huán)境和自動(dòng)化工作流(包括測(cè)試)的一些好處。

簡(jiǎn)化協(xié)作

每次我接到工作面試的帶回家任務(wù)時(shí),我都會(huì)使用 tox 。為了訪問(wèn)任務(wù),招聘公司的開發(fā)人員只需要安裝并運(yùn)行 tox 。與團(tuán)隊(duì)合作時(shí)也是如此。團(tuán)隊(duì)成員不需要復(fù)制環(huán)境或安裝依賴項(xiàng)。所有這些任務(wù)都在tox.ini文件中處理。

促進(jìn)持續(xù)集成

如果沒(méi)有 tox ,您的持續(xù)集成( CI )腳本必須同時(shí)處理虛擬環(huán)境的創(chuàng)建和包依賴項(xiàng)的安裝。這意味著沒(méi)有 tox 構(gòu)建的 CI 腳本更加復(fù)雜。下文將對(duì)此進(jìn)行更詳細(xì)的探討。

降低依賴關(guān)系沖突的風(fēng)險(xiǎn)

對(duì)于每個(gè)任務(wù), tox 都會(huì)創(chuàng)建一個(gè)新的虛擬環(huán)境。這減少了依賴沖突的機(jī)會(huì)。例如,運(yùn)行應(yīng)用程序和執(zhí)行應(yīng)用程序所需的依賴項(xiàng)可以分別安裝到兩個(gè)獨(dú)立的虛擬環(huán)境中。

Tox 學(xué)的一個(gè)主要弱點(diǎn)出現(xiàn)在當(dāng)?shù)匕l(fā)展過(guò)程中;也就是說(shuō),它無(wú)法跟蹤依賴關(guān)系的變化。因此,每次進(jìn)行更改時(shí),都必須重新創(chuàng)建毒性環(huán)境。這是通過(guò)在執(zhí)行 tox 時(shí)傳遞-r標(biāo)志來(lái)完成的(py -m tox -r)。

簡(jiǎn)單的 tox 用例示例

為了掌握 tox ,我創(chuàng)建了一個(gè)簡(jiǎn)單的示例,您可以從 kurtispykes/tox_example GitHub 存儲(chǔ)庫(kù)中克隆。跟隨學(xué)習(xí)如何使用 tox 。

├── __init__.py
├── .gitignore
├── LICENSE
├── README.md
├── string_reversal.py
├── test_string_reversal.py
├── tox.ini

tox 生態(tài)系統(tǒng)的中心是配置文件,它可能有以下三種風(fēng)格之一:

tox.ini
setup.cfg
pyproject.toml

本例使用tox.ini配置 tox 。內(nèi)容如下:

[tox]
envlist = my_env
skipsdist = true

[testenv]
deps = pytest
commands = pytest

INI File Structure 指出,使用.ini擴(kuò)展名的配置文件“由部分組成,每個(gè)部分由[section]標(biāo)頭開頭,后跟由特定字符串分隔的鍵/值條目(默認(rèn)情況下為=或:)?!?/p>

在 tox 中,節(jié)標(biāo)題轉(zhuǎn)換為新的 tox 環(huán)境。但是,請(qǐng)注意本例中的[tox]標(biāo)頭。標(biāo)頭配置 tox 運(yùn)行的全局設(shè)置。您可以告訴 tox 使用不同版本的 Python 來(lái)執(zhí)行此標(biāo)頭中的測(cè)試。

[tox]標(biāo)題包含兩項(xiàng):

envlist–通知 tox 從命令行運(yùn)行py -m tox時(shí)要執(zhí)行的環(huán)境。在本例中,envlist被命名為my_env。在最初的 tox 運(yùn)行之后,其他運(yùn)行將執(zhí)行得更快,因?yàn)?tox 會(huì)跟蹤虛擬環(huán)境的詳細(xì)信息,不會(huì)重新創(chuàng)建或重新安裝依賴項(xiàng)。

skipsdist–當(dāng)沒(méi)有setup.py或pyproject.toml時(shí),將skipsdist標(biāo)志設(shè)置為真。如果未設(shè)置,將導(dǎo)致錯(cuò)誤。

請(qǐng)注意,您還可以通過(guò)添加要測(cè)試的版本( py27 , py37 ),根據(jù)不同版本的 Python 測(cè)試包。您必須在您的環(huán)境中安裝要測(cè)試包的 Python 版本,否則將引發(fā)錯(cuò)誤。

[testenv]和[testenv:NAME]標(biāo)頭用于定義 tox 的測(cè)試環(huán)境,其中NAME是特定環(huán)境的名稱。[testenv]中定義的設(shè)置(稱為頂層)將由各個(gè)環(huán)境自動(dòng)繼承,除非您覆蓋這些設(shè)置。

本示例不定義單個(gè)環(huán)境,但設(shè)置了以下兩項(xiàng):

deps–執(zhí)行代碼所需的依賴項(xiàng)。

commands–作為當(dāng)前測(cè)試環(huán)境的一部分要觸發(fā)的命令。

現(xiàn)在定義了配置,您可以創(chuàng)建并測(cè)試一個(gè)模塊來(lái)演示 tox 的作用。為本示例創(chuàng)建的模塊是string_reversal.py,其中包含用于反轉(zhuǎn)字符串的函數(shù)。

# The contents of string_reversal.py
def reverse_string(text):
    reverse_text = text[::-1]
    return reverse_text

要測(cè)試模塊是否正常工作,請(qǐng)使用以下test_string_reversal.py腳本:

# The contents of test_string_reversal.py
from string_reversal import reverse_string

def test_calculate_age():
    # Given
    text = "Hello World!"

    # When
    reversed = reverse_string(text)

    # Then
    assert reversed == "!dlroW olleH"

下一步是從存儲(chǔ)tox.ini文件的同一目錄運(yùn)行 tox 。在命令行中,使用以下命令運(yùn)行 tox :

py -m to

輸出應(yīng)該類似于圖 2 所示。

output-run-success-in-tox-environment.png 圖 2 :成功的毒殺記錄

雖然本示例使用 Pytest ,但您可以使用任何其他庫(kù)來(lái)測(cè)試模塊。事實(shí)上,您可以執(zhí)行任意命令。

創(chuàng)建機(jī)器學(xué)習(xí)

您還可以將 tox 擴(kuò)展到各種場(chǎng)景。例如, machine learning ( ML )模型基于交易數(shù)據(jù)進(jìn)行訓(xùn)練,以預(yù)測(cè)欺詐交易何時(shí)發(fā)生。請(qǐng)參閱 kurtispykes/fraud-detection-project GitHub repo 中的完整代碼。 ML 模型包的頂層結(jié)構(gòu)如下所示:

├── fraud_detection_model # Contains the code required to build the model
├── requirements
│   ├── requirements.txt
│   ├── test_requirements.txt
├── tests # Contains the unit tests for the model
├── LICENSE
├── MANIFEST.in
├── mypy.ini
├── publish_model.sh
├── pyproject.toml 
├── setup.py
├── tox.ini

構(gòu)建這個(gè) ML 模型包需要幾個(gè)依賴項(xiàng)。要更好地管理包依賴關(guān)系,請(qǐng)創(chuàng)建requirements.txt文件。

這個(gè)項(xiàng)目的 tox 配置文件包括幾個(gè)可以運(yùn)行 tox 的環(huán)境。這些單獨(dú)的環(huán)境從獲取模型訓(xùn)練所需的數(shù)據(jù)到將訓(xùn)練后的模型發(fā)布到 Gemfury 存儲(chǔ)庫(kù)。這進(jìn)一步表明, tox 可以是管理虛擬環(huán)境的有用工具。tox.ini文件中的一些配置如下所示。

# Part of the tox.ini file; click on the GitHub link to view the entire file
[tox]
envlist = test_package, typechecks, stylechecks, lint
skipsdist = True

[testenv]
install_command = pip install {opts} {packages}

passenv =
	KAGGLE_USERNAME
	KAGGLE_KEY
	GEMFURY_PUSH_URL

[testenv:test_package]
deps =
	-rrequirements/test_requirements.txt

setenv =
	PYTHONPATH=.
	PYTHONHASHSEED=0

commands=
	python fraud_detection_model/train_pipeline.py
	pytest 
	-s 
	-vv 
	{posargs:tests/}

[testenv:train]
envdir = {toxworkdir}/test_package
deps =
	{[testenv:test_package]deps}

setenv =
	{[testenv:test_package]setenv}

commands=
	python fraud_detection_model/train_pipeline.py

[testenv:fetch_data]
envdir = {toxworkdir}/test_package

setenv = {[testenv:test_package]setenv}

commands =
	# fetch
	kaggle competitions download -c ieee-fraud-detection  -p ./fraud_detection_model/data/interim
	# unzip
	unzip ./fraud_detection_model/data/interim/ieee-fraud-detection.zip -d ./fraud_detection_model/data/interim

[testenv:publish_model]
envdir = {toxworkdir}/test_package
deps =
	{[testenv:test_package]deps}

setenv =
	{[testenv:test_package]setenv}

commands=
	python fraud_detection_model/train_pipeline.py
	./publish_model.sh .

請(qǐng)注意,由于添加了setup.py文件,因此skipsdist參數(shù)可以從全局 tox 標(biāo)頭中刪除。在這種情況下,它沒(méi)有被刪除,因?yàn)樵诖虬P椭埃?tox 仍然被用于管理虛擬環(huán)境。

您可能會(huì)注意到,全局envlist(在[tox]標(biāo)頭中)調(diào)用test_package、typechecks、stylechecks、lint。當(dāng)從命令行調(diào)用py -m tox時(shí),將創(chuàng)建每個(gè)環(huán)境,并執(zhí)行每個(gè)環(huán)境中的命令。

要選擇獨(dú)立運(yùn)行的特定環(huán)境,請(qǐng)使用以下命令:框架的全部功能。相反,最好將 tox 視為自動(dòng)化某些工作流和管理虛擬環(huán)境的工具。

py -m tox -e NAME

NAME是您希望 tox 創(chuàng)建的testenv的名稱。

生產(chǎn)中使用 tox 的注意事項(xiàng)

各種 CI 平臺(tái)與 tox 集成得非常好。 ML 模型示例使用 CircleCI 進(jìn)行連續(xù)集成。 Circle CI 配置文件調(diào)用 tox ,而不是直接創(chuàng)建多個(gè)虛擬環(huán)境。

總結(jié)

這篇文章解釋了如何使用 tox 來(lái)實(shí)現(xiàn) Python 中的標(biāo)準(zhǔn)化和自動(dòng)化測(cè)試。僅將 tox 用于自動(dòng)化測(cè)試嚴(yán)重未充分利用框架的全部功能。相反,最好將 tox 視為自動(dòng)化某些工作流和管理虛擬環(huán)境的工具。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    4793

    瀏覽量

    102427
  • 自動(dòng)化
    +關(guān)注

    關(guān)注

    28

    文章

    5386

    瀏覽量

    78626
  • 標(biāo)準(zhǔn)化
    +關(guān)注

    關(guān)注

    1

    文章

    30

    瀏覽量

    7999
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    語(yǔ)言自動(dòng)化識(shí)別器 Polyglot

    語(yǔ)言自動(dòng)化識(shí)別器 Polyglot V3.38介紹:該軟件是一個(gè)語(yǔ)言自動(dòng)化語(yǔ)言識(shí)別器軟件。推出400種語(yǔ)言。可以采用統(tǒng)一的字符編碼標(biāo)準(zhǔn)和美國(guó)國(guó)家標(biāo)準(zhǔn)化組織編碼
    發(fā)表于 09-02 12:13

    封裝如何標(biāo)準(zhǔn)化

    封裝標(biāo)準(zhǔn)化封裝標(biāo)準(zhǔn)化封裝標(biāo)準(zhǔn)化
    發(fā)表于 11-07 15:45

    開關(guān)電源自動(dòng)化測(cè)試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

      摘 要: 按照以軟件為核心的模塊系統(tǒng)構(gòu)架,設(shè)計(jì)并實(shí)現(xiàn)了新一代開關(guān)電源自動(dòng)化測(cè)試系統(tǒng)。該系統(tǒng)能自動(dòng)完成開關(guān)電源功能
    發(fā)表于 11-29 16:59

    python變量的標(biāo)準(zhǔn)化

    python 數(shù)據(jù)分析基礎(chǔ) day17-對(duì)模型自變量進(jìn)行標(biāo)準(zhǔn)化
    發(fā)表于 10-21 14:40

    如何對(duì)用戶界面進(jìn)行自動(dòng)化測(cè)試

    按鍵操作)的自動(dòng)化, 可以實(shí)現(xiàn)完全的自動(dòng)化測(cè)試。 如下圖所示,界面測(cè)試螞蟻機(jī)器人自動(dòng)控制相機(jī)拍攝
    發(fā)表于 03-06 19:57

    python控制CANoe實(shí)現(xiàn)自動(dòng)化測(cè)試的方法

    ”完成了python控制CANoe實(shí)現(xiàn)自動(dòng)化測(cè)試。那么,python能控制釘釘么?答案是可以的。那么用py
    發(fā)表于 12-29 08:12

    LabVIEW與Tektronix示波器實(shí)現(xiàn)電源測(cè)試自動(dòng)化

    和Tektronix示波器解決了電源測(cè)試的實(shí)際問(wèn)題,實(shí)現(xiàn)測(cè)試過(guò)程的自動(dòng)化、高效和精確
    發(fā)表于 12-09 20:37

    自動(dòng)化測(cè)試框架unittes詳解

    測(cè)試框架,不妨“軟為硬用”。這里就基于python自動(dòng)化測(cè)試框架unittest來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)
    的頭像 發(fā)表于 05-20 14:47 ?2755次閱讀

    測(cè)試自動(dòng)化Python

      用于測(cè)試的編程需要與開發(fā)應(yīng)用程序的編程不同的方法。如果你想要一種專門用于測(cè)試編碼的簡(jiǎn)單而精簡(jiǎn)的語(yǔ)言,Python 是一個(gè)不錯(cuò)的選擇。Python
    的頭像 發(fā)表于 12-09 14:53 ?735次閱讀

    什么是自動(dòng)化測(cè)試框架

    自動(dòng)化測(cè)試框架,即是應(yīng)用于自動(dòng)化測(cè)試所用的框架。按照框架的定義,自動(dòng)化測(cè)試框架要么是提供可重用的
    發(fā)表于 04-18 14:44 ?786次閱讀

    使用Python實(shí)現(xiàn)功能測(cè)試自動(dòng)化

    單的單元測(cè)試到復(fù)雜的功能測(cè)試測(cè)試。根據(jù)Future Market Insights集團(tuán)發(fā)布的一份報(bào)告,到14年底,全球自動(dòng)化測(cè)試市場(chǎng)預(yù)計(jì)將
    的頭像 發(fā)表于 05-04 11:20 ?742次閱讀
    使用<b class='flag-5'>Python</b><b class='flag-5'>實(shí)現(xiàn)</b>功能<b class='flag-5'>測(cè)試</b><b class='flag-5'>自動(dòng)化</b>

    Facebook群組自動(dòng)化python – 網(wǎng)絡(luò)自動(dòng)化

    電子發(fā)燒友網(wǎng)站提供《Facebook群組自動(dòng)化python – 網(wǎng)絡(luò)自動(dòng)化.zip》資料免費(fèi)下載
    發(fā)表于 07-05 14:26 ?0次下載
    Facebook群組<b class='flag-5'>自動(dòng)化</b><b class='flag-5'>python</b> – 網(wǎng)絡(luò)<b class='flag-5'>自動(dòng)化</b>

    Python 模擬鍵盤鼠標(biāo)的方式實(shí)現(xiàn)自動(dòng)化

    在某些情況下,如果我們需要進(jìn)行自動(dòng)化操作的應(yīng)用沒(méi)有提供相應(yīng)的接口,我們無(wú)法直接通過(guò)Python來(lái)調(diào)用API實(shí)現(xiàn)自動(dòng)化。這種情況下,
    的頭像 發(fā)表于 11-02 14:48 ?1052次閱讀
    <b class='flag-5'>Python</b> 模擬鍵盤鼠標(biāo)的方式<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>自動(dòng)化</b>

    電源測(cè)試怎么自動(dòng)化?電源模塊自動(dòng)化測(cè)試系統(tǒng)如何實(shí)現(xiàn)?

    納米軟件在電測(cè)行業(yè)深耕十余年,在行業(yè)的大背景下,為了進(jìn)一步完善自動(dòng)化測(cè)試,開發(fā)出了新的智能的電源模塊自動(dòng)化測(cè)試系統(tǒng)ATECLOUD-POW
    的頭像 發(fā)表于 12-15 14:40 ?628次閱讀
    電源<b class='flag-5'>測(cè)試</b>怎么<b class='flag-5'>自動(dòng)化</b>?電源模塊<b class='flag-5'>自動(dòng)化</b><b class='flag-5'>測(cè)試</b>系統(tǒng)如何<b class='flag-5'>實(shí)現(xiàn)</b>?

    開關(guān)電源自動(dòng)化測(cè)試設(shè)備:如何實(shí)現(xiàn)自動(dòng)化測(cè)試?

    開關(guān)電源自動(dòng)化測(cè)試設(shè)備是將測(cè)試軟件和測(cè)試硬件集成在一個(gè)電源測(cè)試的ate
    的頭像 發(fā)表于 08-30 18:19 ?954次閱讀
    開關(guān)電源<b class='flag-5'>自動(dòng)化</b><b class='flag-5'>測(cè)試</b>設(shè)備:如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>自動(dòng)化</b><b class='flag-5'>測(cè)試</b>?