0

我仍然在加快 Puppet 和 rspec 以及所有这些方面的速度,但是......

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

例如,如果我们需要对管理本地组的代码(https://puppet.com/docs/pe/2018.1/managing_windows_configurations.html#manage_local_groups)运行单元测试,有没有办法让我们运行它在我们的 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

谢谢

4

1 回答 1

0

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

但至于实际问题:

所以我们想知道如果运行测试的平台是 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 机器上安装因子。

于 2020-03-16T20:45:22.523 回答