Tox - 使用介紹

1. 概述

tox是通用的虛擬環(huán)境管理和測(cè)試命令行工具。tox能夠讓我們?cè)谕粋€(gè)Host上自定義出多套相互獨(dú)立且隔離的python環(huán)境(tox是openstack社區(qū)最基本的測(cè)試工具舌劳,比如python程序的兼容性卿城、UT等)菊匿。它的目標(biāo)是提供最先進(jìn)的自動(dòng)化打包狭莱、測(cè)試和發(fā)布功能奥裸。

  • 作為持續(xù)集成服務(wù)器的前端就轧,大大減少測(cè)試工作所需時(shí)間证杭;
  • 檢查軟件包能否在不同的python版本或解釋器下正常安裝;
  • 在不同的環(huán)境中運(yùn)行測(cè)試代碼妒御。

2. 使用介紹

2.1. 安裝

$ pip install tox

2.2. 創(chuàng)建tox測(cè)試項(xiàng)目

項(xiàng)目目錄

$ tree .
.
├── requirements.txt
├── src
│   ├── app.py
│   ├── app.pyc
│   ├── __init__.py
│   └── __init__.pyc
├── tests
│   ├── __init__.py
│   ├── __init__.pyc
│   └── test_app.py
└── tox.ini

2 directories, 9 files

src/app.py

from math import fabs, ceil

def math_fabs(x):
    return fabs(x)

def math_ceil(x):
    return ceil(x)

if __name__ == '__main__':
    print math_fabs(-1.2)
    print math_ceil(-2.3)

tests/test_app.py

# -*- coding:utf-8 -*-

import pytest
from src.app import math_fabs, math_ceil

def test_math_fabs():
    assert math_fabs(-1.2) == 1.2
    assert math_fabs(0) == 0
    assert math_fabs(2.4) == 2.4

def test_math_ceil():
    assert math_ceil(-1.2) == -1
    assert math_ceil(0) == 0
    assert math_ceil(2.4) == 3

tox.ini

[tox]
envlist = py27
skipsdist = True
indexserver =
    default = https://pypi.doubanio.com/simple


[testenv]
install_command = pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com {opts} {packages}
deps =
    -rrequirements.txt
commands = coverage erase
           py.test --cov={toxinidir}/src -sx tests
           coverage html
setenv =
    PYTHONPATH = {toxinidir}/py27

[testenv:dev]
deps = pytest
commands = {posargs:py.test}
  • skipsdist解愤,tox默認(rèn)會(huì)使用sdist構(gòu)建包,對(duì)于測(cè)試來(lái)說(shuō)沒(méi)有必要乎莉,而且構(gòu)建還會(huì)要求存在README送讲、setup.py等文件,并且保證setup.py的格式符合要求等惋啃,所以跳過(guò)此步
  • [testenv]哼鬓,默認(rèn)的集成方案
  • [testenv:dev],非默認(rèn)的集成方案边灭,需要使用tox -e dev才能invoke
  • deps = pytest异希,集成需要的依賴
  • commands = {posargs:py.test},可以把調(diào)用的命令的參數(shù)通過(guò)posargs傳給tox來(lái)使用
  • commands = coverage erase
    py.test --cov={toxinidir}/src -sx tests
    coverage html
    相當(dāng)于執(zhí)行三步
  • install_command = pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com {opts} {packages}
    安裝需要的依賴包绒瘦,替換原有的安裝命令
  • setenv =
    PYTHONPATH = {toxinidir}/py27
    設(shè)置python程序運(yùn)行的環(huán)境變量

requirements.txt

pytest==3.0.0
mock==2.0.0
coverage==4.1
pytest-cov==2.0
pytest-randomly==1.0.0
pytest-mock==1.2

2.3. 測(cè)試執(zhí)行

$ tox
py27 installed: bumpversion==0.5.3,click==6.7,coverage==4.1,Flask==0.12.2,funcsigs==1.0.2,itsdangerous==0.24,Jinja2==2.10,MarkupSafe==1.0,mock==2.0.0,pbr==4.0.1,py==1.5.3,pytest==3.0.0,pytest-cov==2.0.0,pytest-mock==1.2,pytest-randomly==1.0.0,six==1.11.0,Werkzeug==0.14.1
py27 runtests: PYTHONHASHSEED='1191855235'
py27 runtests: commands[0] | coverage erase
py27 runtests: commands[1] | py.test --cov=/home/kevin/learn/python-web/tox/src -sx tests
============================================================================== test session starts ===============================================================================
platform linux2 -- Python 2.7.12, pytest-3.0.0, py-1.5.3, pluggy-0.3.1
Using --randomly-seed=1522848244
rootdir: /home/kevin/learn/python-web/tox, inifile:
plugins: randomly-1.0.0, mock-1.2, cov-2.0.0
collected 2 items

tests/test_app.py ..
---------------------------------------------------------------- coverage: platform linux2, python 2.7.12-final-0 ----------------------------------------------------------------
Name              Stmts   Miss  Cover
-------------------------------------
src/__init__.py       0      0   100%
src/app.py            8      2    75%
-------------------------------------
TOTAL                 8      2    75%

============================================================================= pytest-warning summary =============================================================================
WC1 None pytest_funcarg__cov: declaring fixtures using "pytest_funcarg__" prefix is deprecated and scheduled to be removed in pytest 4.0.  Please remove the prefix and use the @pytest.fixture decorator instead.
================================================================== 2 passed, 1 pytest-warnings in 0.02 seconds ===================================================================
py27 runtests: commands[2] | coverage html
____________________________________________________________________________________ summary _____________________________________________________________________________________
  py27: commands succeeded
  congratulations :)
  • 備注:
    在tox.ini配置[testenv:dev]宠互,可以執(zhí)行tox -e dev,完成指定虛擬環(huán)境dev的test椭坚。
$ tox -e dev
dev recreate: /home/kevin/learn/python-web/tox/.tox/dev
dev installdeps: pytest
dev installed: attrs==17.4.0,funcsigs==1.0.2,more-itertools==4.1.0,pluggy==0.6.0,py==1.5.3,pytest==3.5.0,six==1.11.0
dev runtests: PYTHONHASHSEED='487614162'
dev runtests: commands[0] | py.test
============================================================================== test session starts ===============================================================================
platform linux2 -- Python 2.7.12, pytest-3.5.0, py-1.5.3, pluggy-0.6.0
rootdir: /home/kevin/learn/python-web/tox, inifile:
collected 2 items

tests/test_app.py ..                                                                                                                                                       [100%]

============================================================================ 2 passed in 0.01 seconds ============================================================================
____________________________________________________________________________________ summary _____________________________________________________________________________________
  dev: commands succeeded
  congratulations :)

3. 參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末予跌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子善茎,更是在濱河造成了極大的恐慌券册,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垂涯,死亡現(xiàn)場(chǎng)離奇詭異烁焙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)耕赘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門骄蝇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人操骡,你說(shuō)我怎么就攤上這事九火∽裕” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵岔激,是天一觀的道長(zhǎng)勒极。 經(jīng)常有香客問(wèn)我,道長(zhǎng)虑鼎,這世上最難降的妖魔是什么辱匿? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮炫彩,結(jié)果婚禮上匾七,老公的妹妹穿的比我還像新娘。我一直安慰自己江兢,他們只是感情好乐尊,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著划址,像睡著了一般扔嵌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夺颤,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天痢缎,我揣著相機(jī)與錄音,去河邊找鬼世澜。 笑死独旷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寥裂。 我是一名探鬼主播嵌洼,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼封恰!你這毒婦竟也來(lái)了麻养?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诺舔,失蹤者是張志新(化名)和其女友劉穎鳖昌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體低飒,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡许昨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褥赊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糕档。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拌喉,靈堂內(nèi)的尸體忽然破棺而出速那,到底是詐尸還是另有隱情俐银,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布琅坡,位于F島的核電站,受9級(jí)特大地震影響残家,放射性物質(zhì)發(fā)生泄漏榆俺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一坞淮、第九天 我趴在偏房一處隱蔽的房頂上張望茴晋。 院中可真熱鬧,春花似錦回窘、人聲如沸诺擅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烁涌。三九已至,卻和暖如春酒觅,著一層夾襖步出監(jiān)牢的瞬間撮执,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工舷丹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抒钱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓颜凯,卻偏偏與公主長(zhǎng)得像谋币,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子症概,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容