簡體   English   中英

在非根 conftest.py 中使用 pytest_addoptions

[英]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)

我想有兩種不同的方式來運行這個測試:

  1. 第一個是從命令行,在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 ...
  2. 第二種方式是運行包本身的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/projsrc/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_addoption文檔

注意:由於pytest 在啟動期間發現插件的方式,此功能應僅在位於測試根目錄的插件或conftest.py文件中實現。

...

請注意, pytest在工具啟動時不會在更深的嵌套子目錄中找到conftest.py文件。 conftest.py文件保存在頂級測試或項目根目錄中通常是個好主意。

當你調用pytestProject目錄, pytest將其識別為根目錄,所以addoptionProject/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 -ppython -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM