如何测试结构任务

2024-04-26 11:02:47 发布

您现在位置:Python中文网/ 问答频道 /正文

有人试过他们的织物任务吗?有没有图书馆可以帮你解决这个问题?在

我对修补/模仿非常熟悉,但是使用fabric非常困难,我还浏览了fabrics自己的测试套件,不幸的是,它没有任何用处,而且fabric文档中似乎没有关于它的任何主题。在

These是我正在测试的任务。。。如果可能的话,我不想提起虚拟机。在

如有任何帮助,请提前感谢


Tags: 文档主题图书馆套件fabric用处织物these
1条回答
网友
1楼 · 发布于 2024-04-26 11:02:47

免责声明:下面,功能测试与系统测试同义。对于大多数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的任务,如何对本地框进行功能测试?在

您可以通过模拟对runlocal和{}的调用来进行单元测试,但是对于更高级别的集成测试来说,这并不多。 如果您愿意满足于简单的单元测试,那么除了mocknose之外的测试框架并没有太多的需求,因为您的所有单元测试都是在严格控制的条件下运行的。在

你会怎么嘲笑你

您可以模拟sudolocal和{}函数,将它们的命令记录到一组StringIO或文件中,但是,除非我遗漏了一些聪明的东西,否则您还必须非常小心地模拟它们的返回值。 为了继续说明您可能已经知道的东西,您的mock必须知道Fabric上下文管理器(hard),或者您必须模仿您使用的所有上下文管理器(仍然很难,但还没有那么糟糕)。在

如果您确实想沿着这条路走下去,我认为构建一个测试类,它的设置为所有上下文管理器、runsudo、以及您正在使用的Fabric的任何其他部分实例化mock的测试类,而不是尝试在每个测试的基础上进行更少量的模拟。 到那时,您已经为Fabric构建了一个通用的测试框架,您可能应该在PyPi上共享它,作为马布里奇“?在

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


在VMs上测试配置管理软件是一种既定的实践

我强烈建议您重新考虑一下,您多么希望避免为您的功能测试而启动vm。 这是Chef测试的普遍接受的实践,它面临许多相同的挑战。在

如果您担心这方面的自动化,Vagrant在简化从模板创建vm方面做得非常好。 我甚至听说如果你是Docker迷的话,有很好的流浪者/码头工人的整合。 唯一的缺点是,如果您是VMWare迷,Vagrant需要VMWare Workstation($$$)。 或者,只需免费使用Virtualbox的Vagrant。在

如果您在像AWS这样的云环境中工作,您甚至可以选择使用与生产服务器相同的基本映像来启动新的vm,其唯一目的就是进行测试。 当然,一个明显的缺点是这需要花钱。 然而,如果你已经在公共云中运行完整的软件栈,这并不是你成本的一个重要组成部分,因为测试服务器一个月总共只运行几个小时。在

简言之,有很多方法可以解决在vm上进行完整的功能测试的问题,这对于其他配置管理软件来说是一种行之有效的技术重新。在

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

使测试依赖于运行VM的一个明显的问题是,它使开发人员的测试变得困难。 对于针对本地代码版本的迭代测试来说尤其如此,因为有些项目(比如webui-dev)可能需要这样做。在

如果您正在使用Vagrant+Virtualbox、Docker(或raw LXC)或类似的解决方案来进行测试虚拟化,那么本地测试并不是非常昂贵。 这些解决方案使得在10分钟内就可以在廉价的笔记本电脑硬件上构建新的虚拟机。 对于特别快速的迭代,您可以针对同一个VM进行多次测试(然后用一个新的VM替换它以进行最后的测试运行)。在

但是,如果您在公共云或类似的环境中进行虚拟化,在这些环境中,在VM上进行过多的测试是非常昂贵的,那么您应该将测试分为一个可以在本地运行的扩展单元测试套件,以及需要VM的集成或系统测试。 这个独立的测试集允许在没有完整测试套件的情况下进行开发,在开发过程中针对单元测试运行。 然后,在合并/传送/签署变更之前,它们应该针对虚拟机上的功能测试运行。在

最终,没有任何东西可以进入你的代码库中,但是你应该尽你所能为这样一套单元测试实现接近完整的代码覆盖率。 您可以做的越多,以增强单元测试给您的信心,就越好,因为这样可以减少系统测试的错误(而且可能代价高昂)运行的次数。在

相关问题 更多 >