[英]How to speed up pytest
有什么方法可以加快pytest
的重復執行pytest
嗎? 似乎花費了大量時間收集測試,即使我在命令行上指定要執行哪些文件。 我知道這也不是磁盤速度問題,因為在所有 .py 文件中運行 pyflakes 非常快。
各種答案代表了 pytest 可能變慢的不同方式。 他們有時有所幫助,而在其他方面則沒有。 我正在添加一個解釋常見速度問題的答案。 但是這里不可能選擇“The”答案。
使用 pytest.ini 或 tox.ini 中的norecursedirs
選項可以節省大量收集時間,具體取決於您的工作目錄中還有哪些其他文件。 當我進行了 300 次測試時,我的收集時間大約減半(0.34 秒對 0.64 秒)。
如果你已經像我一樣使用tox ,你只需要在你的 tox.ini 中添加以下內容:
[pytest]
norecursedirs = docs *.egg-info .git appdir .tox
您還可以將其添加到獨立的pytest.ini
文件中。
pytest 文檔有關於pytest 配置文件的更多細節。
我遇到了同樣的問題,我在項目的根目錄下調用pytest
並且我的測試在三個子目錄下。 在實際測試執行 0.4 秒之前,收集需要 6-7 秒。
我的解決方案最初是使用測試的相對路徑調用pytest
:
pytest src/www/tests/
如果這樣做也可以加快您的收集速度,您可以將測試的相對路徑添加到addopts
設置的pytest.ini
- 例如:
[pytest]
addopts = --doctest-glob='test_*.md' -x src/www/tests/
這將收集 + 執行時間降低到大約一秒鍾,我仍然可以像以前一樣調用pytest
。
使用xdist,您可以並行化 pytest 運行。 它甚至允許將測試發送到遠程機器。 取決於您的設置,它可以加快相當多的速度:)
在您在 cygwin 的 python 下運行的特殊情況下,其 unix 樣式的文件處理速度很慢。 有關如何在這種特殊情況下加快速度的信息,請參閱pytest.py test very slow startup in cygwin 。
在bash
,嘗試{ find -name '*_test.py'; find -name 'test_*.py'; } | xargs pytest
{ find -name '*_test.py'; find -name 'test_*.py'; } | xargs pytest
{ find -name '*_test.py'; find -name 'test_*.py'; } | xargs pytest
。
對我來說,這將總測試時間縮短到幾分之一秒。
如果您正在運行某些防病毒軟件,請嘗試將其關閉。 我有這個完全相同的問題。 收集測試運行得非常慢。 結果是我的防病毒軟件 (Avast) 導致了問題。 當我禁用防病毒軟件時,測試收集的運行速度大約快了五倍。 我測試了幾次,打開和關閉防病毒軟件,所以我毫不懷疑這是我的原因。
編輯:明確地說,我認為不應該關閉和停止防病毒軟件。 我只是建議暫時關閉它,看看它是否是減速的根源。 就我而言,確實如此,所以我尋找了其他沒有相同問題的防病毒解決方案。
對我來說,將PYTHONDONTWRITEBYTECODE=1
添加到我的環境變量中實現了巨大的加速! 請注意,我正在使用網絡驅動器,這可能是一個因素。
set PYTHONDONTWRITEBYTECODE=1
export PYTHONDONTWRITEBYTECODE=1
subprocess.run
:添加關鍵字env={'PYTHONDONTWRITEBYTECODE': '1'}
請注意,前兩個選項僅對您當前的終端會話保持活動狀態。
Pytest 導入testpaths
目錄中的所有模塊以查找測試。 導入本身可能很慢。 如果您直接運行這些測試,這與您所經歷的啟動時間相同,但是,由於它會導入所有文件,因此需要更長的時間。 這是一種最壞的情況。
但這不會為整個測試運行增加時間,因為無論如何它都需要導入這些文件來執行測試。
如果您將命令行上的搜索范圍縮小到特定文件或目錄,它只會導入這些文件或目錄。 在運行特定測試時,這可能是一個顯着的加速。
加速這些導入涉及修改這些模塊。 模塊的大小和可傳遞的導入會減慢啟動速度。 另外查找任何執行的代碼——函數之外的代碼。 這也需要在測試收集階段執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.