2010-11-02 34 views
3

我需要扩展一个具有大量硬编码路径的Python代码
为了不混淆一切,我想在修改之前为代码创建单元测试:它将服务于作为我的新代码(这将不会有硬编码路径)的非回归测试回归测试处理硬编码路径

但由于硬编码系统路径,我将在chroot树内运行我的测试(我不想污染我的系统dir)
我的问题是我只想为测试设置chroot,并且这可以使用os.chroot来完成,仅限于root权限(并且我不想以root身份运行测试脚本)

其实,我只是需要一个假树diretory,这样当open('/etc/resolv.conf)检索假resolv.conf的,而不是我的系统中的一个

我显然不希望更换自己的代码中的硬编码路径代码因为它不会真实回归测试

你有什么想法如何做到这一点?

感谢

注意,访问的所有路径都是可读与用户户头

回答

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 
+0

感谢这完全是我所需要的 – Louis 2010-11-02 14:21:38

0

你可以使用一个辅助应用程序是使用setuid root运行chroot环境;这将避免需要以root身份运行测试。当然,这可能仍然会导致本地root攻击,因此只能采取适当的预防措施(例如在VM映像中)。

无论如何,任何使用chroot的解决方案本质上都是平台相关的,所以它很笨拙。我其实更喜欢Dave Webb的想法(覆盖open),我必须承认...