免责声明:下面,功能测试与系统测试同义使用。大多数Fabric项目缺少正式的规范,因此没有什么区别。此外,我可能会在功能测试和集成测试这两个术语之间感到随意,因为它们之间的边界因任何配置管理软件而变得模糊。
我非常确定,如果不启动作为约束之一给出的VM或进行极其广泛的模拟(这会使测试套件本来就脆弱),就不可能进行功能测试。
考虑以下简单功能:
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
Run Code Online (Sandbox Code Playgroud)
如果您有一个调用的任务agnostic_install_lsb,那么如何在本地机器上进行功能测试?
您可以通过对run,local和的调用进行模拟来进行单元测试sudo,但是就高级集成测试而言,可以做得很少。如果您愿意对简单的单元测试感到满意,那么除了mock和之外,对于测试框架的需求就不多了nose,因为您的所有单元测试都在严格控制的条件下运行。
你可以嘲笑sudo,local和run功能的命令登录到一组StringIOS或文件,但是,除非有一些聪明的我失踪,你也必须非常仔细地嘲笑他们的返回值。为了继续陈述您可能已经知道的事情,您的模拟要么必须了解Fabric上下文管理器(很难),要么必须模拟所有使用的上下文管理器(仍然很困难,但还不那么糟糕) )。
如果你想走上这条道路,我认为它是更安全,更容易建立一个测试类,它的安装实例嘲笑所有的上下文管理的run,sudo和任何其他面料的部分正在使用,而不是试图在每次测试的基础上进行最少的模拟。到那时,您将为Fabric建立一个有点通用的测试框架,并且您可能应该在PyPi上将其共享为……“数学”?
我争辩说这不会是大多数情况下多大用处,因为你的测试结果为约关怀如何运行完成,而不仅仅是什么是它的结束完成。将命令切换为sudo('echo "cthulhu" > /etc/hostname')from run('echo "cthulhu" | sudo tee /etc/hostname')不会破坏测试,而且很难看到如何通过简单的模拟来实现这一点。这是因为我们已经开始模糊功能测试和单元测试之间的界限,并且这种基本的模拟是尝试将单元测试方法应用于功能测试。
我敦促您重新考虑要避免为功能测试而分裂VM的严重程度。这是厨师测试的普遍接受的做法,它面临许多相同的挑战。
如果您为此担心自动化,那么Vagrant可以很好地简化从模板创建VM的工作。我什至听说如果您是Docker迷,那么Vagrant / Docker集成很好。唯一的缺点是,如果您是VMWare的拥护者,那么Vagrant需要VMWare Workstation($$$)。另外,只需将Vagrant与Virtualbox一起免费使用。
如果您在类似AWS的云环境中工作,则甚至可以选择仅选择与生产服务器具有相同基本映像的新VM来进行测试。当然,值得注意的缺点是这要花钱。但是,如果您已经在公共云中运行了完整的软件堆栈,那么这并不是您花费的很大一部分,因为测试服务器一个月内只能使用几个小时。
简而言之,有很多方法可以解决在VM上进行完整的功能测试的问题,这对于其他配置管理软件来说是一种经过实践检验的真实技术。
使测试依赖于运行VM的明显问题之一是,这使开发人员的测试变得困难。这对于某些项目(例如Web UI开发人员)可能需要的针对本地代码版本的迭代测试尤其如此。
如果您正在使用Vagrant + Virtualbox,Docker(或原始LXC)或用于测试虚拟化的类似解决方案,则本地测试的成本不会很高。这些解决方案使得在不到十分钟的时间内就可以在廉价的笔记本电脑硬件上运行新的虚拟机。对于特别快速的迭代,您可以在同一个VM上进行多次测试(然后将其替换为新的VM,以进行最终测试)。
但是,如果您要在公共云或类似环境中进行虚拟化,而在虚拟机上对虚拟机进行过多的测试非常昂贵,则应将测试分为可在本地运行的广泛的单元测试套件和需要虚拟机的集成或系统测试。这套独立的测试集允许在没有完整测试套件的情况下进行开发,并随着开发的进行与单元测试相对应。然后,在合并/发送/拒绝更改之前,它们应针对VM上的功能测试运行。
最终,没有任何东西可以进入尚未通过功能测试的代码库,但是您应该尝试为这样的单元测试套件尽可能接近完整的代码覆盖率。您可以做的越多,就可以增强单元测试给您带来的信心,那就越好,因为它可以减少系统测试的虚假(且可能代价很高)运行次数。
| 归档时间: |
|
| 查看次数: |
1193 次 |
| 最近记录: |