在测试中使用fakechroot环境的fixture

fakechroot的Python项目详细描述


这个包提供了一个fixtures兼容的fixture来构建 在写时拷贝chroot环境中执行集成测试 要求以根用户身份运行测试。

为了使用它,您需要fakerootfakechrootcowdancer

这段代码是从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可能是一个合适的 另一种选择-这取决于您的用例。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Hibernategenerated列别名在使用查询时将别名断开为BeanResultTransformer   Java接口泛型,返回类型取决于泛型参数   java如何在Struts 2中通过表单提交获得迭代器列表   为什么Java日历比较糟糕?   openjdk的Java命令没有显示缺少什么类   Java代码中的mongodb性能问题   在Java中通过反射获取通用信息   java安装Android SDK和Eclipse   java如何在Groovy中自动加载数据库jar而不使用cp开关?   java应用程序在Eclipse中调试/运行,但是。APK给了我们更多的帮助。分析包含自定义视图的XML布局时发生classNotFoundException   java如何修复税率操作?   java从SQLite DB动态填充Bitmapfun图像(使用Url字符串)   在执行长程序期间,作为控制台输出的JTextArea的java动态更新?   java JT400 ProgramCall的run()方法未返回任何结果