如何加快py.test

时间:2013-05-07 11:11:51

标签: python performance pytest

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

8 个答案:

答案 0 :(得分:13)

使用pytest.ini或tox.ini中的norecursedirs选项可以节省大量的收集时间,具体取决于工作目录中的其他文件。当我有这样的测试时,我的收集时间大约减少了一半(0.34s vs 0.64s)。

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

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

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

pytest文档有more details on py.test configuration files

答案 1 :(得分:6)

我遇到了同样的问题,我在项目的根目录中调用py.test,我的测试是三个子目录。该集合在实际测试执行0.4秒之前需要6-7秒。

我的解决方案最初是使用测试的相对路径调用py.test

py.test src/www/tests/

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:0)

对我来说,在环境变量中添加PYTHONDONTWRITEBYTECODE=1可以大大提高速度!请注意,我正在使用网络驱动器,这可能是一个因素。

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

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

答案 6 :(得分:0)

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

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

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

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

答案 7 :(得分:-1)

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