我需要扩展一个具有大量硬编码路径的python代码 为了不弄乱所有内容,我想在修改之前为代码创建单元测试:它将作为我的新代码的非回归测试(不具有硬编码路径)
但由于硬编码的系统路径,我将在chroot树中运行我的测试(我不想污染我的系统目录)
我的问题是我想只为测试设置chroot,这可以用os.chroot只用root权限来完成(我不想以root身份运行测试脚本)
实际上,我只需要一个伪树指针,这样当open('/etc/resolv.conf)
检索假的resolv.conf而不是我的系统的代码时
我显然不想在代码中替换自己的硬编码路径,因为它不会是真正的回归测试
你知道如何实现这个目标吗?
由于
请注意,所有访问的路径都可以通过用户accout
读取答案 0 :(得分: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
答案 1 :(得分:0)
您可以使用setuid root的帮助应用程序来运行chroot;这样可以避免以root身份运行测试。当然,这可能仍然会打开本地root漏洞,所以只能采取适当的预防措施(例如在VM映像中)。
无论如何,任何具有chroot的解决方案都具有固有的平台依赖性,因此它相当尴尬。我实际上更喜欢Dave Webb的想法(更好地覆盖open
),我必须承认......