Предположим, вы хотите протестировать функцию, подобную этой:
def foo():
something = os.environ.get("SOMETHING")
if something=="BAD":
raise Exception("BAM")
Она используется в небольшом приложении вроде этого:
def main():
try:
foo()
print("OK")
except:
print("SAD")
Я могу указать значения среды в командестрока, которая в итоге достигает foo
$ SOMETHING=BAD ./my_app
SAD
$ SOMETHING=ELSE ./my_app
OK
Теперь я хочу протестировать поведение foo, но мне нужно быть осторожным, чтобы не изменять настройки среды, поэтому мне нужно установить и восстановить их,даже если тест пройдёт плохо.Это выглядит примерно так:
def test_foo_ok():
orig = os.environ.get("SOMETHING")
os.environ["SOMETHING"]="ELSE"
try:
foo()
finally:
if orig is None:
del os.environ["SOMETHING"]
else:
os.environ["SOMETHING"]=orig
def test_foo_bad():
orig = os.environ.get("SOMETHING")
os.environ["SOMETHING"]="BAD"
try:
with pytest.raises(Exception) as excinfo:
foo()
assert str(excinfo.value) == "BAM"
finally:
if orig is None:
del os.environ["SOMETHING"]
else:
os.environ["SOMETHING"]=orig
Вы можете обернуть шаблон в них, если хотите.Я бы назвал это что-то вроде @testwithenv
, тогда тесты будут выглядеть чище.
@testwithenv({"SOMETHING","ELSE"})
def test_foo_ok():
foo()
@testwithenv({"SOMETHING","BAD"})
def test_foo_bad():
with pytest.raises(Exception) as excinfo:
foo()
assert str(excinfo.value) == "BAM"