我的 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
为此提供了两个配置选项:
- >
norecursedirs
- 包含将从扫描中排除的目录。当您正在寻找模式“包括所有,排除选定”时使用此选项。默认情况下,norecursedirs
设置为'.*', 'build', 'dist', 'CVS', '_darcs', '{arch}', '*.egg'
,因此请注意,当您覆盖此选项时,默认值将消失,您必须将它们添加回来。 - >
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/