为什么单个模块导入会使pytest运行增加1.5秒?

时间:2019-06-11 17:03:47

标签: python unit-testing testing pytest

我正在用TDD编写一些代码,并具有一个类似于以下的测试(请注意,我正在使用pytest-describe,但是在没有附加格式的情况下使用测试时,也会出现相同的问题)

import numpy as np
import pytest
from maszcal.emulator import LensingEmulator, LargeErrorWarning




class FakeInterpolator:
    def __init__(self, coords, grid):
        pass

    def process(self):
        pass

    def interp(self, coords):
        return np.ones(tuple(c.size for c in coords))


def describe_emulator():

    def describe_error_check():

        @pytest.fixture
        def emulator(mocker):
            mocker.patch('maszcal.emulator.RbfInterpolator', new=FakeInterpolator)
            lensing_emulator = LensingEmulator()
            lensing_emulator.generate_grid = lambda coords: np.ones(tuple(c.size for c in coords))
            return lensing_emulator

        def other_test_1(emulator):
            do_stuff_with_emulator...

即使使用pytest --collectonly,该测试也需要2.5到3秒才能运行。导入LensingEmulator时,它会像这样从maszcal.interpolate模块导入:

spec/emulator/LensingEmulator.py
    imports ↑  
maszcal/emulator.py
    imports ↑
maszcal/interpolate.py
    imports ↑
          GPy

其中GPy是一个外部模块。当然,还存在其他依赖关系,但是奇怪的是,如果我从import GPy中删除maszcal.interpolate行,则加速时间将达到0.9ish秒,而不是2.5-3秒。

我对这种行为很困惑,因为单独导入模块并不那么慢,但是它增加了测试收集阶段的时间。解决此问题的正确方法是什么?

0 个答案:

没有答案