tox/pytest 根据主机环境中是否安装了另一个模块测试 pass/fail

tox/pytest tests pass/fail depending on whether another module is installed in host environment

我有许多 pytest 测试,使用 tox 部署,安装旧版本的模块,然后导入它,然后安装同一模块的新版本。测试检查升级已加载的模块是否会引发警告(告诉用户重新启动 session/interpreter)。

我的问题是测试是否成功取决于主机环境中是否安装了旧版本的模块(例如pip install --user random_module && toxpip uninstall random_module && tox)。我非常惊讶地发现测试对我在用户中安装的内容很敏感。这是怎么回事,我如何避免这种交互,以便测试 运行 相同,而不管我的用户 site-packages?

中安装了什么

有关该项目的更多信息

我在写a wrapper package for pip to allow installing packages from inside a REPL/console/script。这引发的一个复杂问题是有人可能已经加载了一个模块,然后安装了升级,但旧版本将保留在内存中。在这些情况下,我需要警告用户他们需要重新启动会话才能使新安装生效。

两个测试在 failing/passing 之间切换的问题是 progress 包的安装没有在测试 运行 之间回滚。正如您在评论中所建议的那样,一种可能的解决方案是通过 tox 通过 运行ning tox --recreate 强制重新创建虚拟环境。另一个是在夹具中实现回滚,例如

@pytest.fixture
def rollback_progress_package():
    yield  # wait for the test to finish
    subprocess.run(['pip', 'install', '--force-reinstall', 'progress==1.5'])

@pytest.mark.usefixtures('rollback_progress_package')
def test_progress_already_loaded_warning():
    ...

这有很好的效果,回滚可以在测试之间完成 运行 而不是在重新创建虚拟环境时每个 运行 一次。