对于pytest,为什么单个测试结果与运行所有测试不同?

2024-10-05 13:25:56 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python的py3.m进行管道模拟测试。我有测试来处理不同的阀门校准等等。在

奇怪的是,如果我在一个目录中运行所有测试,所有测试都会通过。如果我试图运行一个测试类,它会失败。我尝试添加setup/teardown方法来将它与其他代码分开,以防它受到其他类的影响。在

下面是测试代码(ffc是组件库,fff是方法库):

class TestGate3TankLevels:
    @classmethod
    def setup_class(cls):
        ffc.tank2.level = 18.0
        fff.change_tank_level(ffc.tank2, ffc.tank2.level)
        fff.gate1_open()
        fff.gate2_open()
        fff.gate3_open()
        fff.gate4_open()

    def test_gate3_tank_levels(self):
        assert ffc.gate1.position == 100
        assert ffc.gate1.flow_out == 19542.86939891452
        assert ffc.gate1.press_out == 13.109851301499999

        assert ffc.gate2.position == 100
        assert ffc.gate2.flow_out == 19542.86939891452
        assert ffc.gate2.press_out == 6.5549256507499996

        assert ffc.gate3.position == 100
        assert ffc.gate3.flow_in == 19542.86939891452
        assert ffc.gate3.press_in == 13.109851301499999
        assert ffc.gate3.flow_out == 19542.86939891452
        assert ffc.gate3.press_out == 13.109851301499999
        assert ffc.gate6.flow_in == 19542.86939891452
        assert ffc.gate6.press_in == 13.109851301499999

        assert ffc.gate4.position == 100
        assert ffc.gate4.flow_in == 0.0
        assert ffc.gate4.press_in == 0.0
        assert ffc.gate4.flow_out == 0.0
        assert ffc.gate4.press_out == 0.0

    @classmethod
    def teardown_class(cls):
        ffc.tank2.level = 32.0
        fff.change_tank_level(ffc.tank2, ffc.tank2.level)

单独运行时,我得到以下结果:

^{pr2}$

但是,如果我在test_燃料内运行所有测试_组件.py文件,我一切都通过了:

Testing started at 2:16 PM ...
/home/cody/PycharmProjects/VirtualPLC/venv/bin/python /home/cody/.local/share/JetBrains/Toolbox/apps/PyCharm-P/ch-0/182.3341.8/helpers/pycharm/_jb_pytest_runner.py --path /home/cody/PycharmProjects/VirtualPLC/tests/models/fuel_farm/test_fuel_components.py
Launching py.test with arguments /home/cody/PycharmProjects/VirtualPLC/tests/models/fuel_farm/test_fuel_components.py in /home/cody/PycharmProjects/VirtualPLC/tests/models/fuel_farm

============================= test session starts ==============================
platform linux -- Python 3.6.3, pytest-3.6.2, py-1.5.3, pluggy-0.6.0
rootdir: /home/cody/PycharmProjects/VirtualPLC/tests/models/fuel_farm, inifile:collected 20 items

test_fuel_components.py ....................                             [100%]

========================== 20 passed in 0.16 seconds ===========================
Process finished with exit code 0

如果我将这个测试类移到文件中的另一个位置(现在它在所有其他测试的末尾),它会导致任何后续测试失败,同时也会导致自身失败。在

我不明白一个测试类怎么会自己失败,但当与其他测试一起运行时,它是可以的。在

编辑Link to other tests(太长,无法在此处发布)


Tags: inpytesthomefffassertoutflow
2条回答

所以这里的问题是,当水箱模型是imported时,每个水箱和阀门的状态初始化一次,就像这里的tank1:

# Storage tanks
# Assumes 36 ft tall tank w/ 1 million gallon capacity = 27778 gallons per foot
# Assumes 16 inch diam transfer piping
tank1 = tank.Tank("Tank 1", level=36.0, fluid_density=DENSITY, spec_gravity=SPEC_GRAVITY, outlet_diam=16,
                  outlet_slope=0.25)
tank1.static_tank_press = tank1.level
tank1.gravity_flow(tank1.pipe_diam, tank1.pipe_slope, tank1.pipe_coeff)

如果不知道这个项目应该做什么,很难对这个设计提出具体的批评,但是这个设计有大量的全局状态,这使得测试非常困难。在

不管现有设计的优缺点如何,如果您希望测试可靠和孤立,您需要做的是在每次测试开始时将每个坦克的状态重置为已知状态。考虑到这里涉及到多少全球事务,你的选择非常有限。在

当全局存储这么多状态时,我的建议是在每次测试后使用setUptearDown方法重置回已知状态。在

这是未经测试的,但您正在寻找这样的东西:

^{pr2}$

它基本上在每次测试之前存储原始状态,然后在每次测试之后恢复它。这些属性中有一些魔力,所以可能需要一点尝试和错误才能使其100%工作。在

储油罐的全球状况是问题所在。一开始我做了一些测试,改变了其中一个水箱的液位,但一直没有恢复到正常状态。在

通过在开始其余测试之前添加一些函数调用并确保油箱液位“满”,它修复了所有问题:

    fff.change_tank_level(ffc.tank1, 36)
    fff.change_tank_level(ffc.tank2, 36)

36是一个满的油箱。在

所以,当我进入TestGate3TankLevels类时,更改tank级别是正确的。然后,teardown方法将水箱液位恢复正常。在

相关问题 更多 >

    热门问题