2015-04-25 33 views
9

我用setuptools做了我的項目,我想用tox測試它。我列出了變量中的依賴關係,並將其添加到setup()參數(tests_requireextras_require)。我的項目需要安裝tests_require中列出的所有依賴項進行測試,但pip install未安裝它們。pip從setup.py安裝測試依賴項tox

我試過,但沒有奏效:

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

如何安裝測試的依賴,而無需管理多個相關性列表(即具有在兩個test_requirements.txt列出的所有依賴關係tests_require變量)?

+1

我不確定你是否可以 - 我看到的所有使用'tox'集成的項目都只有一個特定的測試需求文件,並在'tox.ini'中設置'deps = -r whatever_file.txt'。 – jonrsharpe

+0

@jonrsharpe只是我想做不出文本文件。如果我做到了,我必須管理兩個代表名單。 – item4

+0

是的,我明白你爲什麼不想這樣做,而且我告訴你,我不確定你可以避免它*。另一種選擇是從'setup.py'中的文件中讀取測試依賴關係,而不是對它們進行硬編碼;這會將您帶回一個DRY列表。 – jonrsharpe

回答

1

你可以做的是有一個單一的文件(稱爲test_requirements.txt),並列出了測試的依賴,像這樣:

dnspython==1.12.0 
easydev==0.8.3 
enum34==1.0.4 
fabric==1.10.1 
... 

然後,在setup.py,解析和文件內容存儲在列表中並傳遞名單setup

tests_require = [line.strip() for line in 
       open('test_requirements.txt') 
       if line.strip() and not line.strip().startswith('--')] 

setuptools.setup(
    ... 
    tests_require=tests_require, 
    ... 
) 
12

我已經犯下的extra requirements輕微虐待實現這一點。你幾乎在那裏嘗試額外的語法,只是tests_require代表不會自動提供這種方式。

隨着setup.py這樣的:

from setuptools import setup 

test_deps = [ 
    'coverage', 
    'pytest', 
] 
extras = { 
    'test': test_deps, 
} 

setup(
    # Other metadata... 
    tests_require=test_deps, 
    extras_require=extras, 
) 

然後,您可以得到與演員語法安裝在測試的依賴,例如從項目的根目錄:

$ pip install .[test] 

給出相同的語法來弓形體在tox.ini,無需調整默認install_command

[testenv] 
commands = {posargs:pytest} 
deps = .[test] 

現在你不需要維持兩個依賴列表地點,並且他們表達他們應該爲發佈的包的位置:在包裝元數據中而不是requirements.txt文件。

看來這個小演員陣容is not all that uncommon