有没有办法加快py.test
的重复执行?即使我指定在命令行上执行哪些文件,它似乎也会花费大量时间来收集测试。我知道这不是磁盘速度问题,因为在所有.py文件中运行pyflakes非常快。
答案 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文件中。
答案 1 :(得分:6)
我遇到了同样的问题,我在项目的根目录中调用py.test
,我的测试是三个子目录。该集合在实际测试执行0.4秒之前需要6-7秒。
我的解决方案最初是使用测试的相对路径调用py.test
:
py.test src/www/tests/
如果这样做也会加快您的收藏速度,您可以将测试的相对路径添加到addopts
中pytest.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
可以大大提高速度!请注意,我正在使用网络驱动器,这可能是一个因素。
set PYTHONDONTWRITEBYTECODE=1
export PYTHONDONTWRITEBYTECODE=1
subprocess.run
:添加关键字env={'PYTHONDONTWRITEBYTECODE': '1'}
请注意,前两个选项仅在您当前的终端会话中保持活动状态。
答案 6 :(得分:0)
Pytest 导入 testpaths
目录中的所有模块以查找测试。导入本身可能很慢。如果您直接运行这些测试,这与您所经历的启动时间相同,但是,由于它会导入所有文件,因此需要更长的时间。这是最坏的情况。
虽然这不会增加整个测试运行的时间,因为无论如何它都需要导入这些文件来执行测试。
如果您将命令行上的搜索范围缩小到特定文件或目录,它只会导入这些文件或目录。在运行特定测试时,这可以显着提高速度。
加速这些导入涉及修改这些模块。模块的大小和可传递的导入会减慢启动速度。另外查找任何执行的代码——函数之外的代码。这也需要在测试收集阶段执行。
答案 7 :(得分:-1)
如果您正在运行某些防病毒软件,请尝试将其关闭。我有同样的问题。收集测试的速度非常慢。原来是我的防病毒软件(Avast)导致了这个问题。当我禁用防病毒软件时,测试集合的运行速度提高了大约五倍。我测试了几次,打开和关闭防病毒软件,所以我毫不怀疑这是我的原因。