OS Specifi c Кукольный юнит тест - PullRequest
0 голосов
/ 13 марта 2020

Я все еще быстро набираю скорость в Puppet и rspe c и все такое, но ...

В настоящее время у нас есть CI runner, который тестирует код нашего модуля Puppet с использованием Docker контейнер работает на Linux. Что ж, теперь мы углубляемся в использование Windows -specifi c функций Puppet, и наши тесты не проходят. Поэтому нам интересно, есть ли способ игнорировать тесты, если платформа, на которой они выполняются, имеет значение Linux?

Например, если нам нужно запустить наши модульные тесты для нашего кода, который управляет локальными группами (https://puppet.com/docs/pe/2018.1/managing_windows_configurations.html#manage_local_groups), есть ли способ, чтобы, когда мы запускаем его локально на наших Windows устройствах разработки, он работал, но когда он запускается на нашем (Linux) CI runner, он пропускает этот конкретный тест?

Для каждого запроса приведен пример кода, который мы собираемся использовать для управления локальной группой:

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

Спасибо

1 Ответ

0 голосов
/ 16 марта 2020

Как я заметил в комментарии, я смог воспроизвести ошибку теста, используя манифест и код Spe c (сейчас), представленные в вопросе. Если я правильно понимаю, что сбой наблюдается только при запуске модульных тестов, а не при реальном обслуживании каталогов, то из этого следует, что проблема в конфигурации тестовой среды, которая может или не может быть на вас.

Но что касается настоящего вопроса:

Итак, мы задаемся вопросом, есть ли способ игнорировать тесты, если платформа, на которой они выполняются, имеет значение Linux?

Конечно, вы можете. Тесты Rspe c написаны на Ruby, и вы можете использовать практически все стандартные функции Ruby в них, включая операторы потока управления и механизмы для выполнения системных команд. Таким образом, в качестве временного временного решения , вы можете поместить свои тесты breaks-when-not-running-on- 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 для запроса указанного c системного факта, который сообщает вам, тест выполняется на Windows. Это решает проблему для меня. Обратите внимание, что эта конкретная реализация потребует установки facter на ваш компьютер CI.

...