Таким образом, проблема в том, что состояние каждого бака и клапана инициализируется один раз, когда модели бака импортированы , как здесь бак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%.