Puppet中的TDD是否有意义,如果积极如何实现它

时间:2014-02-02 14:23:02

标签: tdd puppet

当在Geppetto中创建新的木偶模块时,也会创建清单,规范和测试文件夹。驻留在manifests文件夹中的init.pp如下所示:

define X (
    $version = "",
    $installer = "",
    $installer_extension = ""
) {
    file { "${name}_installer_copied_to_temp_directory":
        path => "c:/temp/${name}-${version}.${installer_extension}",
        source => "puppet:///files/${installer}.${installer_extension}",
        before => Exec["${name}_installed"],
        require => File["c:/temp"];
    }
}

驻留在tests文件夹中的关联init.pp如下所示:

include X

如果puppet中的TDD有意义,如何为define X片段创建测试以及如何在Geppetto中运行测试?

2 个答案:

答案 0 :(得分:2)

确实有意义!

我首先看rspec-puppet。它为您提供了自定义RSpec匹配器,可帮助您测试Puppet资源。

我不确定Geppetto创建的样板包含什么,但是在模块的根目录下运行rspec-puppet-init会为你设置它。

在您的情况下,您应该首先创建一个specs/defines/X_spec.rb文件并创建一些测试用例,其中包含define输入的变体,用于测试所包含的File资源正确的属性。

您可以查看rspec-puppet的{​​{3}},了解有关如何编写测试用例的示例。

请注意,您不应该测试是否在磁盘中创建了文件。这是Puppet的域(不是你的模块),已经在Puppet的代码库中测试过。

答案 1 :(得分:0)

为了澄清更高层次,使用rspec-puppet在Puppet中进行TDD的方式可能与您在其他语言中使用的TDD略有不同。 Rspec-puppet仅测试生成的目录;它不会以您可能首先想到的方式进行“冒烟测试”,但它对单元测试非常有效。

例如它不是什么,比如在一般的包文件服务范例中,有一些特定于环境的原因,包可能没有安装 - 比如,它与另一个RPM冲突。 Rspec-puppet无法测试或捕获这样的东西,因为它只检查生成的目录;而不是该目录在实际系统上的实际应用。

通常,开始测试的一个好方法是识别(a)分支逻辑和(b)模块中不同的数据/值。作为第一步,针对所有逻辑分支编写测试,并测试代码中可能存在的变量的有效,无效和异常值。

在上面的例子中,确实没有太多的逻辑,但你可以测试当$ name或$ version的奇数值被放入时会发生什么;你希望你的木偶代码优雅地失败,因为未处理的木偶错误通常不是最具沟通性和最明显的错误。

绝对最低......

it { should compile }

(安装后让它干净利落可能有点熊,这是真的。我也使用puppetlabs_spec_helper。)