[英]Using pytest_addoptions in a non-root conftest.py
我有一個具有以下結構的項目:
Project/
|
+-- src/
| |
| +-- proj/
| |
| +-- __init__.py
| +-- code.py
| +-- tests/
| |
| +-- __init__.py
| +-- conftest.py
| +-- test_code.py
+-- doc/
+-- pytest.ini
+-- setup.py
可導入包proj
位於src
目錄下。 測試與它一起安裝在proj.tests
子包中。 代碼、測試本身和安裝都可以正常工作。 但是,我無法將選項傳遞給測試。
我有一個選項--plots
,它在conftest.py
(在Project/src/proj/tests/
)中定義,它在根文件夾中創建一個.plots/
文件夾並在那里放置一些圖形調試:
# conftest.py
def pytest_addoption(parser):
parser.addoption("--plots", action="store_true", default=False)
我想有兩種不同的方式來運行這個測試:
第一個是從命令行,在Project
目錄中:
$ pytest --plots
這立即失敗
usage: pytest [options] [file_or_dir] [file_or_dir] [...] pytest: error: unrecognized arguments: --plots inifile: /.../Project/pytest.ini rootdir: /.../Project
如果我添加包目錄,運行正常:
$ pytest src/proj --plots ... rootdir: /.../Project, inifile: pytest.ini ...
如果我指定測試子目錄,它也很順利:
$ pytest src/proj/tests --plots ... rootdir: /.../Project, inifile: pytest.ini ...
第二種方式是運行包本身的test
功能。 test
函數在Project/src/proj/__init__.py
如下:
# __init__.py def test(*args, **kwargs): from pytest import main cmd = ['--pyargs', 'proj.tests'] cmd.extend(args) return main(cmd, **kwargs)
該函數旨在像這樣安裝Project
后運行:
>>> import proj >>> proj.test()
一般來說,這工作正常,但如果我這樣做
>>> proj.test('--plots')
我像往常一樣得到同樣的錯誤:
usage: [options] [file_or_dir] [file_or_dir] [...] : error: unrecognized arguments: --plots inifile: None rootdir: /some/other/folder
對於這個測試,我運行python setup.py develop
然后cd
'd to
/some/other/folder` 以確保一切安裝正確。
我的目標是在傳入--plots
命令行選項時讓兩個選項都能正常工作。 似乎我找到了選項 #1 的解決方法,即手動將其中一個包傳遞給pytest
,但我什至不完全理解它是如何工作的(為什么我可以傳入src/proj
或src/proj/tests
?)。
所以問題是,如何讓 pytest 持續運行我的測試包,以便選擇正確的conftest.py
? 我願意考慮任何合理的替代方案,使我能夠讓--plots
選項在源(在Project
的 shell 中運行)版本和proj.test()
版本中proj.test()
。
作為參考,這是我的pytest.ini
文件:
# pytest.ini
[pytest]
testpaths = src/proj/tests
confcutdir = src/proj/tests
它似乎沒有任何區別。
我在 Python 2.7、3.3、3.4、3.5、3.6 和 3.7(在 anaconda 中)上運行 pytest 3.8.0。 在所有版本中,結果都是可重現的。
注意:由於
pytest
在啟動期間發現插件的方式,此功能應僅在位於測試根目錄的插件或conftest.py
文件中實現。...
請注意,
pytest
在工具啟動時不會在更深的嵌套子目錄中找到conftest.py
文件。 將conftest.py
文件保存在頂級測試或項目根目錄中通常是個好主意。
當你調用pytest
從Project
目錄, pytest
將其識別為根目錄,所以addoption
鈎Project/src/proj/tests/conftest.py
被忽略。
如果您描述的項目結構是pytest_addopts
,我pytest_addopts
鈎子 impl 移動到單獨的插件模塊; 這可以位於項目目錄中的任何位置,例如Project/src/proj/tests/plugin_plots.py
。 現在,如果你打電話
$ pytest -p src.proj.tests.plugin_plots
addoption
hook impl 將被執行並且參數將被正確添加。
(您可能需要調整sys.path
才能正確加載自定義插件模塊,例如使用PYTHONPATH=. pytest -p
或python -m pytest -p
,或以可編輯模式安裝項目等)
為了不每次都輸入-p
參數,請將其保留在pytest.ini
,例如
# pytest.ini
[pytest]
addopts=-p src.proj.tests.plugin_plots
以編程方式運行測試時,請增強 args 列表:
def test(*args, **kwargs):
from pytest import main
cmd = ['-p', 'proj.tests.plugin_plots', '--pyargs', 'proj.tests']
cmd.extend(args)
return main(cmd, **kwargs)
應該工作得很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.