Pytest 原子测试成功,但在与其他测试一起运行时失败

Pytest atomic test succeed but fail when running with other tests

提问人:VndC 提问时间:11/17/2023 最后编辑:VndC 更新时间:11/17/2023 访问量:63

问:

我想在基于变量环境的模块中测试导入。为此,我使用一个改变 var env 的夹具,并在 test_module.py 中对其进行测试。 如果我运行测试是成功的,但如果我运行它失败,告诉我类是虚拟的。module.pypytest test/test_module.pypytest 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)

我尝试了很多东西:

  1. 重新加载模块importlib.reload(module)

  2. import sys
    
    del sys.modules['module']
    import module
    
  3. 把夹具放在模块范围,而不仅仅是功能范围

  4. 确保夹具运行良好(是的,var env 设置为“True”)

python pytest python-import

评论


答:

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: