python - Pytest 项目运行速度很慢

标签 python python-3.x pytest

我的 pytest 设置运行非常慢,尤其是在收集阶段。

所以我为我的 Django 项目设置了一个 pytest 设置,每个 Django 应用程序的测试文件都位于它自己的文件夹中,即树看起来如下

root
|
+--a
|  |
|  +--tests
|       |
|       +--conftest.py
|       +--testAa.py
|       +--testBa.py
+--b
|  |
|  +--tests
|       |
|       +--conftest.py
|       +--testAb.py
|       +--testBb.py
...
pytest.ini

pytest.ini 文件指定在何处查找测试并具有以下内容

[pytest]
DJANGO_SETTINGS_MODULE = project.project.settings.test
python_files = tests.py test_*.py *_tests.py
addopts = --reuse-db

对于 tests 文件夹中的每个应用程序,我都有一个名为 contest.py 的文件。该文件创建一组在测试文件中多次使用的对象。例如,如果类 A 的对象被多次使用,则竞赛会创建该变量一次,并且测试使用此 conftest 作为输入。每个 conftest 都有装饰器 @pytest.fixture(scope="function"),测试有装饰器 @pytest.mark.django_db

我不认为加载时间是由 conftests 或上一段中讨论的装饰器引起的,而是由我提供的树结构和 pytest.ini 文件引起的。有没有关于什么是好的结构的规则?正如我所说,收集测试的加载时间非常长。更准确地说,我有大约 80 个测试,收集它们大约需要 40 秒。运行它们全部需要额外的 20。

最佳答案

或多或少重申my other answer :

当您调用 pytest 时,它将扫描项目根目录中的每个子目录,以查找测试。这可能会减慢测试收集速度;从扫描中排除不相关的目录可能是明智的。 pytest 为此提供了两个配置选项:

  1. > norecursedirs - 包含将从扫描中排除的目录。当您正在寻找模式“包括所有,排除选定”时使用此选项。默认情况下,norecursedirs 设置为 '.*', 'build', 'dist', 'CVS', '_darcs', '{arch}', '*.egg',因此请注意,当您覆盖此选项时,默认值将消失,您必须将它们添加回来。
  2. > testpaths - 包含仅应考虑用于扫描的目录,因此这基本上与 norecursedirs 所做的相反。在查找模式“排除所有,包括选定的”时使用此选项。此选项还会为测试发现添加一些小的或更显着的加速,具体取决于您在项目根目录中保留的内容 - 大多数子目录根本不会被遍历并且测试运行开始得更快。

用法:将选项放在pytest.ini/setup.cfg/tox.ini中:

[tool:pytest]
testpaths = tests othertests doc

或从命令行通过 --override-ini 传递它们。

pytest -o "testpaths=tests othertests doc" ...

关于python - Pytest 项目运行速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55855702/

相关文章:

python - 使用 Tabula 从 PDF 中以字符串形式读取表格

python - 用 pandas 求和不同的列。 Python

python - 如何在 Pytest 执行期间使用标准输出进行调试

python-3.x - 从 conftest.py 中的 cmdline 选项生成的列表的 Pytest 参数化测试

python - 使用 pytest 测试日志输出

python - 如何使用 Python 将字符串中的特定字符序列转换为大写?

Python属性错误: 'module' object has no attribute 'Goslate'

python - 在 Python 3.X 中从 HTTP 响应中获取和评估 Python 代码

python - 为什么 2to3 将 mydict.keys() 更改为 list(mydict.keys())?

python - 如何根据另一列中的值在数据框中设置零和一