提问人:VndC 提问时间:11/17/2023 最后编辑:VndC 更新时间:11/17/2023 访问量:63
Pytest 原子测试成功,但在与其他测试一起运行时失败
Pytest atomic test succeed but fail when running with other tests
问:
我想在基于变量环境的模块中测试导入。为此,我使用一个改变 var env 的夹具,并在 test_module.py 中对其进行测试。
如果我运行测试是成功的,但如果我运行它失败,告诉我类是虚拟的。module.py
pytest test/test_module.py
pytest test/
# test/confest.py
from typing import Generator
@pytest.fixture(scope="function") -> Generator[None, None, None]:
def change_var_env():
some_env_var = os.getenv("ENV_VAR")
os.environ["ENV_VAR"] = "True"
yield None
if some_env_var is not None:
os.environ["ENV_VAR"] = some_env_var
# src/my_package/module.py
if os.getenv("ENV_VAR") == "True":
instance_class = RealClass()
else:
instance_class = DummyClass()
# test/test_module.py
import pytest
def test_import_module.py(change_var_env):
from mypackage.module import instance_class
assert isinstance(instance_class, RealClass) # Succeed if running pytest test/test_module.py
# test/test_module_bis.py
import pytest
def test_import_module.py():
from mypackage.module import instance_class
assert isinstance(instance_class, DummyClass)
我尝试了很多东西:
重新加载模块
importlib.reload(module)
-
import sys del sys.modules['module'] import module
把夹具放在模块范围,而不仅仅是功能范围
确保夹具运行良好(是的,var env 设置为“True”)
答:
1赞
Benoît Lebreton
11/17/2023
#1
我认为你的单元测试不应该依赖于外部状态(数据库、计算机上的文件或环境变量)。 否则,测试之间将存在依赖关系(例如与数据库的并发性)。 你应该模拟你的环境变量。有几个例子:Python mock Patch os.environ 和返回值
评论
0赞
VndC
11/17/2023
我尝试了选项,它仍然失败。monkeypatch.setenv()
0赞
VndC
11/17/2023
尝试仍然失败。无论如何,env var 为 true,我认为问题出在导入期间,就像导入之前是否使用当前 var env 完成一样with patch.dict(os.environ, {"ENV_VAR": "True"}, clear=True) as mock_env:
评论