![](/img/trans.png)
[英]how to tell PyCharm to run pytest on test files not doctests
[英]How to let pytest discover and run doctests in installed modules?
我正在添加單元測試和一種“遺留”Python 包。 一些模塊包含嵌入在文檔字符串中的自己的文檔測試。 我的目標是同時運行這些文檔測試和新的專用單元測試。
在這個問答之后(“如何讓 py.test 運行 doctests 以及正常的測試目錄?”)我正在使用 pytest 的pytest
--doctest-modules
選項。 從源存儲庫運行時, pytest
確實從src
目錄下的 Python 模塊中發現了嵌入式 doctests。
但是,我的目標是測試源代碼分發是否完全構建和安裝,然后針對已安裝的包測試所有內容。 為此,我使用tox
來自動構建sdist
(源代碼分發)tarball、將其安裝在虛擬環境中並針對已安裝的版本運行測試。 為確保測試導入的是已安裝的版本,而不是源存儲庫中的版本,我遵循本文中的建議,存儲庫現在如下所示:
repo/
src/
my_package/
__init__.py
module_a.py
module_b.py
...
tests/
test_this.py
test_that.py
requirements.txt
setup.py
tox.ini
(測試中的tests
腳本像import my_package
一樣導入包,它會命中已安裝的版本,因為存儲庫布局確保src/my_package
目錄不在模塊搜索路徑中。)
在tox
配置文件中,相關部分看起來像
[tox]
envlist = py27,py36,coverage-report
[testenv]
deps =
-rrequirements.txt
commands =
coverage run -p -m pytest --
[pytest]
addopts = --doctest-modules
到目前為止,測試運行良好,並且從src/my_package
下的模塊中獲取了文檔測試,而不是從安裝在tox
虛擬環境中的包中獲取。
我與此設置相關的問題如下:
tox
似乎可以確保您安裝的是源存儲庫中的內容,但它確實如此嗎?pytest
以一種干凈的方式從已安裝的模塊實際運行 doctests? 我可以想到一些解決方案,例如在doc
目錄中構建一個專用的文檔樹,然后讓pytest
使用--doctest-glob
選項在其中找到 doctests。 但是有沒有一種方法可以在不先構建文檔的情況下做到這一點?我找到了我自己問題的答案。
引用pytest
問題#2042 :
目前
doctest-modules
從根本上與針對已安裝包的測試不兼容,因為結帳時的模塊搜索與site-packages
中的模塊使用
所以到目前為止,解決方案不存在。
pytest
從當前目錄收集測試(除非您指示它以其他方式傳遞顯式目錄)。 在tox.ini
中使用tox 替換添加安裝目錄。 即,要么傳遞目錄:
[testenv]
deps =
-rrequirements.txt
commands =
coverage run -p -m pytest {envsitepackagesdir}/my_package
或更改目錄:
[testenv]
changedir = {envsitepackagesdir}/my_package
deps =
-rrequirements.txt
commands =
coverage run -p -m pytest --
這就是我解決導入不匹配的方法:
$ pytest tests/ --doctest-modules --pyargs myrootpkg <other args>
這里的問題是,一旦您開始明確指定源路徑(在本例中通過--pyargs
),您還必須指定所有其他源路徑(在此示例中為tests/
),因為pytest
將停止掃描 rootdir。 不過,這在使用src
布局時應該不是問題,因為測試通常不會分散在存儲庫周圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.