跳转到主要内容

用于在测试中使用fakechroot环境的固定装置

项目描述

本软件包提供了一种兼容fixtures的固定装置,用于在不要求测试以root身份运行的情况下,在copy-on-write chroot环境中构建和执行集成测试。

为了使用它,您需要fakerootfakechrootcowdancer

此代码是从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 (21.2 kB 查看哈希值)

上传时间

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面