我如何测试结构任务

时间:2014-08-04 21:47:09

标签: python functional-testing fabric

有没有人设法测试他们的结构任务?那里有一个可以帮助解决这个问题的图书馆吗?

我对修补/嘲笑非常熟悉,但是它很难用布料,我也看了一下面料自己的测试套件,不幸的是没有用,并且没有用过。'在结构文档中似乎是关于它的任何主题。

These是我尝试测试的任务...我想尽可能避免启动虚拟机。

感谢任何帮助,提前致谢

1 个答案:

答案 0 :(得分:4)

免责声明:以下,功能测试与系统测试同义使用。大多数Fabric项目缺乏正式的规范使得这种区分没有实际意义。 此外,我可能会在功能测试和集成测试这两个术语之间徘徊,因为它们之间的边界模糊了任何配置管理软件。

Fabric的本地功能测试很难(或不可能)

我非常确定,如果不启动虚拟机,您可以将其作为约束条件之一进行功能测试,或者进行广泛的模拟(将会让你的测试设备本身就很脆弱。)

考虑以下简单功能:

def agnostic_install_lsb():
    def install_helper(installer_command):
        ret = run('which %s' % installer_command)
        if ret.return_code == 0:
            sudo('%s install -y lsb-release' % installer_command)
            return True
        return False

    install_commands = ['apt-get', 'yum', 'zypper']
    for cmd in install_commands:
        if install_helper(cmd):
            return True

     return False

如果您有一个调用agnostic_install_lsb的任务,您如何在本地方框上进行功能测试?

您可以通过模拟对runlocalsudo的调用进行单元测试,但在高级集成测试方面则不多。 如果您愿意对简单的单元测试感到满意,那么在mocknose之外的测试框架并不是很多,因为所有的单元测试都是紧密运行的受控条件。

你将如何做模拟

您可以模拟sudolocalrun函数,将其命令记录到一组StringIO个或文件中,但除非有{&1;}我缺少一些聪明的东西,你也必须非常小心地模仿它们的返回值。 要继续说明您可能已经知道的事情,您的模拟要么必须知道Fabric上下文管理器(硬),要么您必须模拟您使用的所有上下文管理器(仍然很难,但不是那么糟糕) )。

如果您确实希望沿着这条路走下去,我认为构建一个测试类更安全,更容易,该测试类的设置实例化了所有上下文管理器的模拟,runsudo和任何您正在使用的Fabric的其他部分,而不是尝试在每个测试的基础上进行更少量的模拟。 那时,你将为Fabric构建一个通用的测试框架,你可能应该在PyPi上分享它......" mabric"?

我认为在大多数情况下这不会有多大用处,因为你的测试最终会关注如何一次运行,而不仅仅是结束时所做的事情。 。 将命令从sudo('echo "cthulhu" > /etc/hostname')切换到run('echo "cthulhu" | sudo tee /etc/hostname')不应该破坏测试,并且很难看到如何通过简单的模拟来实现这一目标。 这是因为我们已经开始模糊功能和单元测试之间的界限,这种基本的模拟是尝试将单元测试方法应用于功能测试。


在VM上测试配置管理软件是一项既定实践

我建议你重新考虑你想要避免为你的功能测试调整虚拟机的程度。 这是厨师测试的普遍接受的做法,它面临着许多相同的挑战。

如果您担心自动化,Vagrant可以很好地简化模板中VM的创建。 如果你是Docker的粉丝,我甚至听说过Vagrant / Docker的整合很好。 唯一的缺点是如果你是VMWare粉丝,Vagrant需要VMWare Workstation($$$)。 或者,只需免费使用Vagrant和Virtualbox。

如果您在AWS等云环境中工作,您甚至可以选择使用与生产服务器相同的基本映像来启动新VM,以便进行测试。 当然,一个明显的缺点是这需要花钱。 但是,如果您已经在公共云中运行完整的软件堆栈,那么这不是您成本的很大一部分,因为测试服务器在一个月内总共只运行了几个小时。

简而言之,有许多方法可以解决在VM上进行全面功能测试的问题,这对其他配置管理软件来说是一种经过验证的技术。

如果不使用Vagrant(或类似),请保留一套本地可执行单元测试

使测试依赖于运行VM的一个明显问题是它使开发人员的测试变得困难。 对于本地代码版本的迭代测试尤其如此,因为某些项目(来自Web UI dev)可能需要。

如果您正在使用Vagrant + Virtualbox,Docker(或原始LXC)或类似的测试虚拟化解决方案,那么本地测试并不是非常昂贵。 这些解决方案可以在不到十分钟的时间内在廉价的笔记本电脑硬件上实现新的虚拟机。 对于特别快速的迭代,您可以针对同一个VM进行多次测试(然后将其替换为新的,以进行最终的测试运行)。

但是,如果您在公共云或类似环境中进行虚拟化,对VM进行过多测试的成本很高,则应将测试分成可在本地运行的大量单元测试套件,以及集成或系统测试需要VM。 这套独立的测试允许在没有完整测试套件的情况下进行开发,随着开发的进行,针对单元测试运行。 然后,在合并/发送/签署更改之前,它们应该针对VM上的功能测试运行。

最终,没有任何东西可以进入你没有通过功能测试的代码库,但是你应该尽可能地尝试实现这样的单元测试套件的完全代码覆盖率。 为了增强单元测试给你的信心,你可以做的越多越好,因为它减少了系统测试的虚假(并且可能代价高昂)运行的次数。

相关问题