Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pytest,为什么单个测试结果与运行所有测试不同?_Python_Unit Testing_Pytest - Fatal编程技术网

Python 使用pytest,为什么单个测试结果与运行所有测试不同?

Python 使用pytest,为什么单个测试结果与运行所有测试不同?,python,unit-testing,pytest,Python,Unit Testing,Pytest,使用Python3.6中的pytest,我正在为一个项目进行管道模拟。我有测试来处理不同的阀门校准等 奇怪的是,如果我在一个目录中运行所有测试,所有测试都会通过。如果我尝试运行一个测试类,它就会失败。我已经尝试添加setup/teardown方法来将其与代码的其余部分分开,以防它受到其他类的影响 以下是测试代码(ffc是组件库,fff是方法库): 单独运行时,我得到以下结果: F test_fuel_components.py:408 (TestGate3TankLevels.test_gate

使用Python3.6中的pytest,我正在为一个项目进行管道模拟。我有测试来处理不同的阀门校准等

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

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

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

F
test_fuel_components.py:408 (TestGate3TankLevels.test_gate3_tank_levels)
19542.86939891452 != 39085.73879782904

Expected :39085.73879782904
Actual   :19542.86939891452
 <Click to see difference>

self = <VirtualPLC.tests.models.fuel_farm.test_fuel_components.TestGate3TankLevels object at 0x7f9b35289a20>

    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
E       assert 39085.73879782904 == 19542.86939891452
E        +  where 39085.73879782904 = <PipingSystems.valve.valve.Gate object at 0x7f9b3515ce80>.flow_in
E        +    where <PipingSystems.valve.valve.Gate object at 0x7f9b3515ce80> = ffc.gate6

test_fuel_components.py:423: AssertionError
如果我将这个测试类移动到文件中的另一个位置(现在它位于所有其他测试的末尾),它会导致任何后续测试失败,以及自身失败

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


编辑(太长,无法在此处发布)

因此,这里的问题是,当油箱型号为时,每个油箱和阀门的状态初始化一次,如这里的油箱1:

# 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)
在不了解更多关于这个项目应该做什么的情况下,很难对这个设计提出具体的批评,但是这个设计有大量的全局状态,这使得测试非常困难

无论现有设计的优缺点如何,如果希望测试可靠且隔离,您需要做的是在每次测试开始时将每个油箱的状态重置为已知状态。考虑到这里涉及到多少全球国家,你的选择非常有限

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

这是未经测试的,但您正在寻找以下内容:

original_states = {}
tanks = [tank1, tank2, tank3, tank4, tank5, tank6]
tank_attrs = [ "name", "level", "fluid_density", "spec_grav",
               "tank_press", "flow_out", "pipe_diam", "pipe_slope" ]
def setUp(self):
    for tank in self.tanks:
        self.original_states[id(tank)] = {}
        for attr in self.tank_attrs:
            self.original_states[id(tank)] = getattr(tank, attr)

def tearDown(self):
    try:
        for tank in self.tanks:
            for attr, value in self.original_states[id(tank)].items():
                setattr(tank, attr, value)
    finally:
        self.original_states = {}

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

因此,这里的问题是,当油箱模型为时,每个油箱和阀门的状态初始化一次,如这里的油箱1:

# 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)
在不了解更多关于这个项目应该做什么的情况下,很难对这个设计提出具体的批评,但是这个设计有大量的全局状态,这使得测试非常困难

无论现有设计的优缺点如何,如果希望测试可靠且隔离,您需要做的是在每次测试开始时将每个油箱的状态重置为已知状态。考虑到这里涉及到多少全球国家,你的选择非常有限

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

这是未经测试的,但您正在寻找以下内容:

original_states = {}
tanks = [tank1, tank2, tank3, tank4, tank5, tank6]
tank_attrs = [ "name", "level", "fluid_density", "spec_grav",
               "tank_press", "flow_out", "pipe_diam", "pipe_slope" ]
def setUp(self):
    for tank in self.tanks:
        self.original_states[id(tank)] = {}
        for attr in self.tank_attrs:
            self.original_states[id(tank)] = getattr(tank, attr)

def tearDown(self):
    try:
        for tank in self.tanks:
            for attr, value in self.original_states[id(tank)].items():
                setattr(tank, attr, value)
    finally:
        self.original_states = {}

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

储罐的全局状态就是问题所在。一开始我做了一些测试,改变了其中一个油箱的液位,但从未恢复到正常状态

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

    fff.change_tank_level(ffc.tank1, 36)
    fff.change_tank_level(ffc.tank2, 36)
其中36是一个满油箱


因此,当我进入TestGate3TankLevels类时,我可以正确地更改储罐液位。然后,拆卸方法将储罐液位恢复正常。

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

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

    fff.change_tank_level(ffc.tank1, 36)
    fff.change_tank_level(ffc.tank2, 36)
其中36是一个满油箱


因此,当我进入TestGate3TankLevels类时,我可以正确地更改储罐液位。然后,拆卸方法将油箱液位恢复正常。

如果您可以提供其他测试,这将非常有用。最可能的原因是其他一些测试正在更改gate6的状态,而不是重置它。模块中是否有另一个控制该状态的测试?对此表示抱歉。本打算将链接添加到回购协议,但忘记了。这是一个案例研究,说明了为什么全球状态是坏的。如果您可以提供其他测试,这将很有帮助。最可能的原因是其他一些测试正在更改gate6的状态,而不是重置它。模块中是否有另一个控制该状态的测试?对此表示抱歉。本打算将链接添加到回购协议中,但却忘记了。这是一个案例研究,说明了为什么全球状态不佳。我以为是这样的,这就是为什么我开始为阀门添加设置类,但我没有想到为其他组件添加设置类。我想我只是假设当调用每个测试类时,它会自动“重新启动”每个组件实例。谢谢。我以为是这样的,这就是为什么我开始为阀门添加设置类,但我没有想到为其他组件添加设置类。我想我只是假设当调用每个测试类时,它会自动“重新生成”每个组件实例。