3

我需要扩展一个具有大量硬编码路径的python代码
为了不弄乱一切,我想在修改之前为代码创建单元测试:它将作为我的新代码的非回归测试(这将没有硬编码的路径)

但是由于硬编码的系统路径,我将在 chroot 树中运行我的测试(我不想污染我的系统目录)
我的问题是我想设置 chroot 仅用于测试,这可以用os.chroot 仅具有 root 权限(我不想以 root 身份运行测试脚本)

事实上,我只需要一个假的树目录,这样当open('/etc/resolv.conf)检索假的 resolv.conf 而不是我的系统的代码时

我显然不想在代码中替换自己的硬编码路径,因为它不是真正的回归测试

您知道如何实现这一目标吗?

谢谢

请注意,所有访问的路径都可以通过用户帐户读取

4

2 回答 2

5

open在您的测试设置中,您可以使用从“假”目录结构中读取的您自己的版本来覆盖您正在测试的模块中的内置模块:

import mymod
import os.path

def chroot_open(filename,*args):
    filename = os.path.join("/home/you/fakeroot",filename)
    return open(filename,*args)

mymod.open = chroot_open
于 2010-11-02T12:51:01.747 回答
0

您可以使用 setuid root 的帮助应用程序来运行 chroot;这将避免需要以 root 身份运行测试。当然,这可能仍然会打开本地 root 漏洞利用,因此只能在采取适当预防措施的情况下进行(例如在 VM 映像中)。

无论如何,任何带有 chroot 的解决方案本质上都是依赖于平台的,所以它相当尴尬。我实际上更喜欢 Dave Webb (override open) 的想法,我必须承认......

于 2010-11-02T13:18:43.273 回答