在测试中使用fakechroot环境的fixture
fakechroot的Python项目详细描述
这个包提供了一个fixtures兼容的fixture来构建 在写时拷贝chroot环境中执行集成测试 要求以根用户身份运行测试。
为了使用它,您需要fakeroot、fakechroot和cowdancer。
这段代码是从Yaybu中的测试工具中提取和重构的。
那它又能做什么呢?
使用fixture的第一个测试将创建(或刷新)chroot。我们用 在没有根的用户空间中使用fakechroot魔术来实现这一点。然后运行每个测试 这本书的廉价副本。所以每个测试都有自己干净(和新鲜)的chroot。
这个chroot非常适合测试。你可以对一个看起来 完整的系统,同时从外部戳戳。
我怎么用?
像这样:
import unittest2 from fakechroot import TestCase class TestInAChroot(TestCase): def test_true(self): retval = self.chroot.call(["/bin/true"]) self.failUnlessEqual(retval, 0)
还有什么很酷的api呢?
fixture对象上有一堆api帮助程序,因此您可以编写测试 好像他们在马蹄里。下面的所有调用都将在 chroot(例如/foo)并在完全扩展的路径上操作(这可能 是/home/john/Projects/myproject/tmp2234a/foo)。
这些是在Yaybu需要它们的时候添加的—更多的补丁是受欢迎的。
- FakeChrootFixture.call
- 在chroot中使用适当的ld_预加载执行命令 设置。
- FakeChrootFixture.exists
- 如果存在色度中的路径,则返回^ {TT5}$。< /DD>
- FakeChrootFixture.isdir
- 返回True是chroot中的一个路径是一个目录。
- FakeChrootFixture.mkdir
- 在chroot中创建一个目录。
- FakeChrootFixture.open
- 返回chroot中用于读或写操作的文件。
- FakeChrootFixture.touch
- 在chroot中运行touch二进制文件。
- FakeChrootFixture.chmod
- 在chroot中运行chmod二进制文件。我们不能直接使用 os.chmod因为它不会通知faked有关更改的信息。
- FakeChrootFixture.readlink
- 获取符号链接的值。因为它可以包含 chroot我们去掉chroot路径。
- FakeChrootFixture.symlink
- 实际上在chroot中创建一个符号链接。
- FakeChrootFixture.stat
- 在路径上执行os.stat。
它是如何工作的?
这是通过三个LD_PRELOADlibs实现的,它们本质上是猴子补丁 认为他们比他们有更多特权的人。
fakeroot包用于欺骗您的代码,使其认为它是根和 它在根目录(例如chmod)中所做的更改 效果。一个特殊的faked守护进程用于协调 过程。
fakechroot包用于欺骗代码,使其认为 chrootsyscall工作。这意味着执行文件操作的任何代码 在syscall级别上被欺骗,当它执行~/yourchroot/tmp/foo时 天真地以为它刚碰到/tmp/foo。
cowdancer包是在用户空间中提供写时拷贝的。唯一的 需求是一个支持硬链接的文件系统。你在你的 使用cp -al的基图像。这就形成了一个强硬的农场。那cowdancer 然后,修补程序强制对基础映像执行任何本应写入的更改 写入一个新文件(从而断开硬链接)。
有什么限制?
你的代码只认为它有根。所以你不能绑定端口80或类似的 那。
现在我们只积极支持ubuntu。特别是我们 测试清晰准确。而其他unix在未来可能会得到支持。 不幸的是,不太可能支持OSX(没有什么比Debootstrap更好的了) 窗户也没有chroots的概念。
使用这样的系统会有一些开销。我们已经调整了一些 离开(例如,我们手工设置LD_PRELOADstuff来刮掉3个进程 每.call()调用一次,但您仍然会引入 间接的。你不会运行数百个测试用例每秒。
三个图书馆都是聪明的黑客。它们被大量用于 Debian,但他们可能还有漏洞。当这些虫子结合在一起时 可能被放大了。这个fixture将允许您运行一些可能 以前作为普通用户需要根,因此避免运行 像根一样完全断了。但这仍然足以擦去~!
有哪些选择?
在vm中运行代码是最好的测试,但是即使快照正在运行 在干净的环境中进行的每一次测试都会很痛苦。
在内核名称空间方面已经有了很多进展。LXC可能是一个合适的 另一种选择-这取决于您的用例。