55

有什么方法可以加快重复执行的速度pytest吗?即使我在命令行上指定要执行哪些文件,它似乎也花费了大量时间来收集测试。我知道这也不是磁盘速度问题,因为在所有 .py 文件中运行 pyflakes 非常快。


各种答案代表了 pytest 可能变慢的不同方式。他们有时会有所帮助,但有时却没有。我正在添加一个解释常见速度问题的答案。但这里不可能选择“The”答案。

4

8 回答 8

25

使用norecursedirspytest.ini 或 tox.ini 中的选项可以节省大量收集时间,具体取决于您的工作目录中还有哪些其他文件。当我完成一组 300 次测试时,我的收集时间大约减半(0.34 秒对 0.64 秒)。

如果您已经像我一样使用tox ,您只需在 tox.ini 中添加以下内容:

[pytest]
norecursedirs = docs *.egg-info .git appdir .tox

您也可以将其添加到独立pytest.ini文件中。

pytest 文档有更多关于pytest 配置文件的详细信息。

于 2013-10-30T06:31:23.770 回答
8

pytest我在项目的根目录下调用时遇到了同样的问题,而我的测试在三个子目录下。在 0.4 秒的实际测试执行之前,收集需要 6-7 秒。

我的解决方案最初是pytest使用测试的相对路径调用:

pytest src/www/tests/

如果这样做也可以加快您的收集速度,您可以将测试的相对路径添加到addopts您的设置末尾pytest.ini- 例如:

[pytest]
addopts = --doctest-glob='test_*.md' -x src/www/tests/

这将收集 + 执行时间减少到大约一秒钟,我仍然可以pytest像以前一样调用。

于 2014-04-27T01:36:54.873 回答
4

使用xdist您可以并行化 pytest 运行。它甚至允许将测试发送到远程机器。取决于您的设置,它可以加速很多:)

于 2015-02-09T20:35:14.547 回答
3

对我来说,添加PYTHONDONTWRITEBYTECODE=1到我的环境变量中实现了巨大的加速!请注意,我使用的网络驱动器可能是一个因素。

  • 窗口批处理:set PYTHONDONTWRITEBYTECODE=1
  • Unix:export PYTHONDONTWRITEBYTECODE=1
  • subprocess.run: 添加关键字env={'PYTHONDONTWRITEBYTECODE': '1'}
  • PyCharm 已经为我自动设置了这个变量。

请注意,前两个选项仅对您当前的终端会话保持活动状态。

于 2020-12-03T22:35:44.783 回答
2

在 cygwin 的 python 下运行的特殊情况下,它的 unix 风格的文件处理速度很慢。请参阅pytest.py test very slow startup in cygwin了解如何在这种特殊情况下加快速度。

于 2015-06-12T14:29:30.313 回答
2

bash,试试{ find -name '*_test.py'; find -name 'test_*.py'; } | xargs pytest

对我来说,这将总测试时间缩短到几分之一秒。

于 2020-06-07T18:34:35.590 回答
1

如果您正在运行某些防病毒软件,请尝试将其关闭。我有这个完全相同的问题。收集测试的速度非常慢。原来是我的防病毒软件 (Avast) 导致了这个问题。当我禁用防病毒软件时,测试集的运行速度大约快了五倍。我对其进行了多次测试,打开和关闭了防病毒软件,所以我毫不怀疑这就是我的原因。

编辑:需要明确的是,我认为不应该关闭杀毒软件。我只是建议暂时关闭它,看看它是否是减速的根源。就我而言,确实如此,因此我寻找了其他没有相同问题的防病毒解决方案。

于 2017-07-26T20:13:28.497 回答
0

Pytest 导入testpaths目录中的所有模块以查找测试。导入本身可能很慢。如果您直接运行这些测试,这与您将经历的启动时间相同,但是,由于它会导入所有文件,因此会更长。这是一种最坏的情况。

不过,这不会增加整个测试运行的时间,因为无论如何它都需要导入这些文件来执行测试。

如果您在命令行上将搜索范围缩小到特定文件或目录,它只会导入那些文件或目录。在运行特定测试时,这可能是一个显着的加速。

加快这些导入涉及修改这些模块。模块的大小和传递的导入会减慢启动速度。另外寻找任何被执行的代码——函数之外的代码。这也需要在测试收集阶段执行。

于 2021-04-13T09:01:48.170 回答