有什么方法可以加快重复执行的速度pytest
吗?即使我在命令行上指定要执行哪些文件,它似乎也花费了大量时间来收集测试。我知道这也不是磁盘速度问题,因为在所有 .py 文件中运行 pyflakes 非常快。
各种答案代表了 pytest 可能变慢的不同方式。他们有时会有所帮助,但有时却没有。我正在添加一个解释常见速度问题的答案。但这里不可能选择“The”答案。
有什么方法可以加快重复执行的速度pytest
吗?即使我在命令行上指定要执行哪些文件,它似乎也花费了大量时间来收集测试。我知道这也不是磁盘速度问题,因为在所有 .py 文件中运行 pyflakes 非常快。
各种答案代表了 pytest 可能变慢的不同方式。他们有时会有所帮助,但有时却没有。我正在添加一个解释常见速度问题的答案。但这里不可能选择“The”答案。
使用norecursedirs
pytest.ini 或 tox.ini 中的选项可以节省大量收集时间,具体取决于您的工作目录中还有哪些其他文件。当我完成一组 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 运行。它甚至允许将测试发送到远程机器。取决于您的设置,它可以加速很多:)
对我来说,添加PYTHONDONTWRITEBYTECODE=1
到我的环境变量中实现了巨大的加速!请注意,我使用的网络驱动器可能是一个因素。
set PYTHONDONTWRITEBYTECODE=1
export PYTHONDONTWRITEBYTECODE=1
subprocess.run
: 添加关键字env={'PYTHONDONTWRITEBYTECODE': '1'}
请注意,前两个选项仅对您当前的终端会话保持活动状态。
在 cygwin 的 python 下运行的特殊情况下,它的 unix 风格的文件处理速度很慢。请参阅pytest.py test very slow startup in cygwin了解如何在这种特殊情况下加快速度。
在bash
,试试{ find -name '*_test.py'; find -name 'test_*.py'; } | xargs pytest
。
对我来说,这将总测试时间缩短到几分之一秒。
如果您正在运行某些防病毒软件,请尝试将其关闭。我有这个完全相同的问题。收集测试的速度非常慢。原来是我的防病毒软件 (Avast) 导致了这个问题。当我禁用防病毒软件时,测试集的运行速度大约快了五倍。我对其进行了多次测试,打开和关闭了防病毒软件,所以我毫不怀疑这就是我的原因。
编辑:需要明确的是,我认为不应该关闭杀毒软件。我只是建议暂时关闭它,看看它是否是减速的根源。就我而言,确实如此,因此我寻找了其他没有相同问题的防病毒解决方案。
Pytest 导入testpaths
目录中的所有模块以查找测试。导入本身可能很慢。如果您直接运行这些测试,这与您将经历的启动时间相同,但是,由于它会导入所有文件,因此会更长。这是一种最坏的情况。
不过,这不会增加整个测试运行的时间,因为无论如何它都需要导入这些文件来执行测试。
如果您在命令行上将搜索范围缩小到特定文件或目录,它只会导入那些文件或目录。在运行特定测试时,这可能是一个显着的加速。
加快这些导入涉及修改这些模块。模块的大小和传递的导入会减慢启动速度。另外寻找任何被执行的代码——函数之外的代码。这也需要在测试收集阶段执行。