簡體   English   中英

如何讓 pytest 在已安裝的模塊中發現並運行 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.

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