Pytest项目运行非常缓慢

时间:2019-04-25 18:39:21

标签: 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作为输入。每个竞赛都有装饰器@pytest.fixture(scope="function"),测试有装饰器@pytest.mark.django_db

我认为加载时间不是由比赛或上一段中讨论的装饰器引起的,而是由我提出的树结构和pytest.ini文件引起的。有什么规则可以实现良好的结构?正如我所说,加载时间非常长,无法收集测试。为了更准确,我进行了大约80项测试,收集它们大约需要40秒。全部运行它们需要额外的20。

2 个答案:

答案 0 :(得分:1)

或多或少地重申https://mydomain-my.sharepoint.com/_api/v2.0/me/drive/items/root/children?select=id,name,size,deleted,folder,file,parentReference,lastModifiedDateTime

调用pytest时,它将扫描项目根目录中的每个子目录,以查找测试。这可能会减慢测试收集的速度;最好将不相关的目录排除在扫描范围之外。 pytest为此提供了两个配置选项:

  1. my other answer-保存将不被扫描的目录。当您寻找“包括所有,排除所选”模式时,请使用此选项。默认情况下,norecursedirs设置为'.*', 'build', 'dist', 'CVS', '_darcs', '{arch}', '*.egg',因此请注意,当您覆盖此选项时,默认设置将消失,您必须将其重新添加。
  2. 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