Continuous integration 操作系统特定的傀儡单元测试

Continuous integration 操作系统特定的傀儡单元测试,continuous-integration,puppet,pdk,Continuous Integration,Puppet,Pdk,我仍然在加快木偶和rspec的速度,但是 我们目前有一个CI运行程序,它使用Linux上运行的Docker容器测试我们的Puppet模块代码。嗯,我们现在正在深入研究使用Puppet的Windows特定功能,我们的测试失败了。所以我们想知道,如果运行测试的平台是Linux,是否有任何方法可以忽略这些测试 例如,如果我们需要对管理本地组()的代码运行单元测试,那么有没有一种方法可以让我们在Windows开发设备上本地运行它时,它可以工作,但当它在(基于Linux的)CI运行程序上运行时,它会跳过特

我仍然在加快木偶和rspec的速度,但是

我们目前有一个CI运行程序,它使用Linux上运行的Docker容器测试我们的Puppet模块代码。嗯,我们现在正在深入研究使用Puppet的Windows特定功能,我们的测试失败了。所以我们想知道,如果运行测试的平台是Linux,是否有任何方法可以忽略这些测试

例如,如果我们需要对管理本地组()的代码运行单元测试,那么有没有一种方法可以让我们在Windows开发设备上本地运行它时,它可以工作,但当它在(基于Linux的)CI运行程序上运行时,它会跳过特定的测试

根据请求,下面是我们希望用于管理本地组的代码示例:

class my_repo::profile::windows::remote_desktop_users (
  Array $members = ['MyDomain\MyUserAccount', 'MyDomain\ARandomDomainGroup'],
) {
  group{'Set local Remote Desktop Users memberships':
    ensure          => present,
    name            => 'Remote Desktop Users',
    members         => $members,
    auth_membership => false
  }
}
注意:我们使用的是角色配置文件模式

上面的代码似乎有效。当我们的单元测试通过CI运行时,它就会爆炸:

describe 'my_repo::profile::windows::remote_desktop_users' do
  on_supported_os.select { |_, f| f[:os]['family'] == 'windows' }.each do |os, os_facts|
    context "on #{os}" do
      let(:facts) { os_facts }

      it { is_expected.to compile }
    end
  end
end

感谢

正如我在评论中所说的,我能够使用问题中提供的清单和规范代码(现在)重现测试失败。如果我正确理解只有在运行单元测试时才观察到故障,而不是在实际提供目录时观察到故障,那么问题就出在测试环境的配置中,这可能在您身上,也可能不在您身上

但实际问题是:

所以我们想知道,如果运行测试的平台是Linux,是否有任何方法可以忽略这些测试

当然可以。Rspec测试是用Ruby编写的,您可以在其中使用几乎所有的标准Ruby特性,包括控制流语句和执行系统命令的机制。因此,作为一种临时解决方法,您可以将不在Windows测试上运行时的中断放入条件语句中,如下所示:

describe 'my_repo::profile::windows::remote_desktop_users' do
  on_supported_os.select { |_, f| f[:os]['family'] == 'windows' }.each do |os, os_facts|
    if %x{facter os.family}.chomp == 'windows'
      context "on #{os}" do
        let(:facts) { os_facts }

        it { is_expected.to compile }
      end
    end
  end
end

特别注意使用
%x
表达式在测试运行的主机上执行系统命令,并在其中使用
facter
请求特定的系统事实,该系统事实告诉您测试是否在Windows上运行。这就解决了我的问题。请注意,此特定实现需要在您的CI计算机上安装facter。

根据定义,单元测试不受基础平台的影响,并且操作系统细节在单元测试期间模拟。我们能在这里看到识别根本原因的代码吗?当单元测试失败时,会发出什么错误消息?当然,您的CI会向您提供这些信息。让我有点惊讶的是,我能够使用示例代码在Linux上运行的PDK1.16中生成一个失败的测试。它失败了,编译错误的中心是:“类成员的验证方法失败:Puppet::Util::Windows::SID:Module的未定义方法`name_to_principal'。我不知道这是否反映了您在CI中看到的问题(但不是在live puppetserver上?),但我倾向于将其归因于PDK中的缺陷。如果你看到了类似的东西,我鼓励你。