用于在测试中使用fakechroot环境的固定装置
项目描述
本软件包提供了一种兼容fixtures的固定装置,用于在不要求测试以root身份运行的情况下,在copy-on-write chroot环境中构建和执行集成测试。
为了使用它,您需要fakeroot、fakechroot和cowdancer。
此代码是从Yaybu测试框架中提取和重构的。
那么它到底做了什么呢?
第一个使用该固定装置的测试将创建(或刷新)一个chroot。我们使用fakechroot魔法在用户空间中这样做,而不需要root权限。然后每个测试都在这个chroot的便宜副本上运行。因此,每个测试都获得其自己的干净(且新鲜的)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?
固定装置对象上有一系列API辅助工具,因此您可以将测试编写得就像它们在chroot中一样。以下所有调用都将接受chroot中的路径(例如/foo),并操作完全展开的路径(可能是/home/john/Projects/myproject/tmp2234a/foo)。
这些是为了满足Yaybu的需求而添加的 - 欢迎更多补丁。
- FakeChrootFixture.call
在chroot环境中执行命令,并设置适当的LD_PRELOAD配置。
- FakeChrootFixture.exists
如果chroot中的路径存在,则返回True。
- FakeChrootFixture.isdir
如果chroot中的路径是目录,则返回True。
- 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_PRELOAD库实现的,它们本质上是在chroot上做猴子补丁,使其认为它们具有比实际更多的权限。
使用fakeroot包来欺骗你的代码,使其认为它是root,并且它作为root所做的更改(例如,例如chmod)正在生效。使用特殊的faked守护进程在进程之间协调。
使用fakechroot包来欺骗你的代码,使其认为chroot系统调用已成功。这意味着任何执行文件操作的代码在系统调用级别上被欺骗,在它天真地认为只是接触了/tmp/foo时,实际上在~/yourchroot/tmp/foo上操作。
使用cowdancer包提供用户空间中的写时复制(copy-on-write)。唯一的要求是支持硬链接的文件系统。您可以使用cp -al在您的基镜像上创建一个副本。这创建了一个硬链接的农场。然后cowdancer补丁强制任何原本要写入基镜像的更改写入新文件(从而打破硬链接)。
有什么限制?
你的代码只认为它有root权限。所以你不能绑定端口80或类似的东西。
目前我们只积极支持Ubuntu。特别是,我们只在Lucid和Precise上积极测试。虽然其他Unix可能在将来得到支持,但不幸的是,对OS X的支持不太可能(没有类似debootstrap的东西),Windows也没有chroot的概念。
使用这样的系统有一些开销。我们调整了一些(例如,我们手动设置LD_PRELOAD内容,以在每个.call()中减少3个进程调用),但你仍然引入了相当多的间接引用。你不会每秒运行数百个测试用例。
这三个库本身都是巧妙的黑客技术。它们在Debian中被大量使用,但它们可能仍然有bug。并且当它们组合在一起时,这些bug可能会放大。这个测试夹具将允许你运行一些可能以前需要root权限作为普通用户运行的测试,从而避免以root权限运行你刚刚彻底破坏的代码。但这仍然足够强大,可以擦除~!
有哪些替代方案?
在虚拟机中运行你的代码是最佳测试,但即使使用快照,在干净的环境中运行每个测试也会很痛苦。
内核命名空间有了很多进步。LXC可能是一个合适的替代品 - 这取决于你的用例。
项目详情
fakechroot-0.2.1.zip 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 56d9c744723948aed8dc50d979989bff3b2549499cc35406061a8ac497fa8678 |
|
MD5 | fa7fce2cb1284f355b45cc0e775fc3ce |
|
BLAKE2b-256 | 65217d184e36728908267f79c6774bba9de52aa9efbcb99142a1c766e811ff88 |