防止在Python中使用任何文件系统's pytest



我有一个程序,出于数据安全原因,如果部署在云中,它永远不应该将任何东西持久化到本地存储。相反,任何输入/输出都需要写入连接的(加密的(存储。

为了允许在本地以及多个云上进行部署,我使用了非常有用的fsspec。然而,其他开发人员也在进行该项目,我需要一种方法来确保他们不会意外地使用本地文件I/O方法——这些方法可能通过单元测试,但在部署到云中时失败。

为此,我的想法基本上是用那些不起作用并使测试失败的方法来模拟/替换pytest中的任何I/O方法。然而,实现起来可能并不简单。我想知道是否有其他人也遇到过这个问题,也许已经有了最佳实践/库?

在我的研究过程中,我发现了pyfakefs,它看起来非常接近我想要做的事情——除了我不想模拟另一个文件系统,我希望有根本没有本地文件系统。

感谢任何意见。

您不能使用任何pytest插件来确保它的安全。总会有办法克服它。即使你在标准python库中修补所有东西,代码也总是可以使用第三方C库,而这是无法从python端修补的。

即使你以某种方式限制了python进程写入文件的每一种方式,它仍然可以调用操作系统或其他进程来写入一些东西。

唯一的方法是只运行受信任的代码,或者使用一些沙箱来运行进程。

在类Unix操作系统中,可行的解决方案可能是创建一个chroot并在其中运行程序

如果您可以使用open函数来阻止打开文件,那么您可以在builtins模块中修补此函数。

_original_open = builtins.open
class FileSystemUsageError(Exception):
pass
def patched_open(*args, **kwargs):
raise FileSystemUsageError()
@pytest.fixture
def disable_fs():
builtins.open = patched_open
yield
builtins.open = _original_open

我已经在pytest插件的基础上完成了这个代码示例,该插件由我现在工作的公司编写,以防止在pytest中使用网络。您可以在此处看到完整的示例:https://github.com/best-doctor/pytest_network/blob/4e98d816fb93bcbdac4593710ff9b2d38d16134d/pytest_network.py

相关内容

最新更新