我的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作为输入。每个竞赛都有装饰器@pytest.fixture(scope="function")
,测试有装饰器@pytest.mark.django_db
。
我认为加载时间不是由比赛或上一段中讨论的装饰器引起的,而是由我提出的树结构和pytest.ini
文件引起的。有什么规则可以实现良好的结构?正如我所说,加载时间非常长,无法收集测试。为了更准确,我进行了大约80项测试,收集它们大约需要40秒。全部运行它们需要额外的20。
答案 0 :(得分:1)
调用pytest
时,它将扫描项目根目录中的每个子目录,以查找测试。这可能会减慢测试收集的速度;最好将不相关的目录排除在扫描范围之外。 pytest
为此提供了两个配置选项:
norecursedirs
设置为'.*', 'build', 'dist', 'CVS', '_darcs', '{arch}', '*.egg'
,因此请注意,当您覆盖此选项时,默认设置将消失,您必须将其重新添加。norecursedirs
-保留仅应考虑进行扫描的目录,因此与norecursedirs
所做的工作基本上相反。查找“排除所有,包括所选内容”模式时,请使用此选项。根据您保留在项目根目录中的内容,此选项还会为测试发现增加一些次要或更重要的加速效果-大多数索引根本不会被遍历,并且测试运行会更快开始。用法:将选项放在pytest.ini
/ setup.cfg
/ tox.ini
中:
[tool:pytest]
testpaths = tests othertests doc
或从命令行通过--override-ini
传递它们。
pytest -o "testpaths=tests othertests doc" ...
答案 1 :(得分:0)
对我来说,问题在于某个特定的conftest.py
需要花费很长时间才能运行(它为我不需要的其他测试设置了一些大型夹具)。
诊断起来很棘手,因为延迟仍然会发生,--collect-only
标志和自定义rootdir
仅设置到测试目录(conftest位于另一个目录中,但是仍然以某种方式被检测到)。
对我来说,解决方案是运行pytest --noconftest
。