Как контролировать, какую кухню пользователя использует проверка при тестировании командного ресурса?

У меня есть кулинарная книга Chef, которая устанавливает «git версии 2.5.2». Я использую CentOS 6.4 vm для применения этой кулинарной книги и написал тест для проверки версии git.

Фрагмент выглядит так:

# Test if git exists
describe command('git --version') do
  its(:stdout) { should match "git version 2.5.2" }
end

Когда я запускаю проверку кухни, тест выполняется, но возвращает другую версию git, чем я ожидал, что приводит к сбою теста.

Вот ошибка:

 2) Command "git --version" stdout should match "git version 2.5.2"
    Failure/Error: its(:stdout) { should match "git version 2.5.2" }
      expected "git version 1.7.1\n" to match "git version 2.5.2"
      Diff:
      @@ -1,2 +1,2 @@
      -git version 2.5.2
      +git version 1.7.1

      /bin/sh -c git\ --version
      git version 1.7.1

На виртуальной машине установлена ​​​​версия git 1.7.1 в каталоге /usr/bin. Рецепт устанавливает git версии 2.5.2 в каталог /usr/local/bin. Когда я вхожу в виртуальную машину с помощью команды «кухонный вход», я подключаюсь как бродячий пользователь. Каталог /usr/local/bin находится выше в PATH, чем /usr/bin, поэтому, когда я запускаю «git --version», я получаю «git version 2.5.2» в качестве вывода. Однако, когда я запускаю проверку кухни, мои тесты будут выполняться с пользователем root. PATH пользователя root не включает /usr/local/bin, но имеет /usr/bin, поэтому он возвращает «git version 1.7.1».

Как я могу контролировать, какой пользователь на виртуальной машине, которую проверяет кухня, будет использовать при выполнении тестов?


Я попытался использовать команду «su -c» в таком тесте:

describe command('su -c "whoami" vagrant') do
  its(:stdout) { should match "vagrant" }
end

Результат был ожидаемым:

   Command "su -c "whoami" vagrant"
     stdout
       should match "vagrant"

Внесение изменений с помощью команды git:

describe command('su -c "git --version" vagrant') do
  its(:stdout) { should match "git version 2.5.2" }
end

Результат:

     1) Command "su -c "git --version" vagrant" stdout should match "git version 2.5.2"
        Failure/Error: its(:stdout) { should match "git version 2.5.2" }
          expected "" to match "git version 2.5.2"
          /bin/sh -c su\ -c\ \"git\ --version\"\ vagrant

Проверка бродячего пути пользователя:

describe command('su -c "echo $PATH" vagrant') do
  its(:stdout) { should match "" }
end

В этом случае тест проходит успешно. Путь не устанавливается для бродячего пользователя, поэтому простая команда «git --version» не будет работать.



person theNoob    schedule 28.10.2015    source источник
comment
Насколько я знаю, вы не можете изменить пользователя, который запускает тесты. Вы можете попробовать изменить команду на su -c "git --version" vagrant   -  person Draco Ater    schedule 29.10.2015
comment
Возможно, добавление опции --login к su приведет к инициализации $PATH.   -  person Draco Ater    schedule 29.10.2015
comment
@DracoAter, это действительно полезно. Я могу получить результат, которого ожидал, когда запускал команду whoami. Похоже, я не могу ожидать, что путь пользователя будет установлен при использовании команды su -c. Я попробовал переключатель -l, но та же ситуация. Я добавлю, что я пытаюсь ответить на вопрос. Спасибо за ваши ответы!   -  person theNoob    schedule 29.10.2015
comment
@DracoAter, спасибо за ваши полезные ответы и направление меня к решению.   -  person theNoob    schedule 29.10.2015
comment
Переместите последнюю часть вашего вопроса в ответ. А затем примите это.   -  person Draco Ater    schedule 30.10.2015


Ответы (1)


Поскольку переключатель -c работал для смены пользователя, я просмотрел справочную страницу для su, чтобы узнать, какие другие переключатели я могу попробовать. Переключатель -l или --login выглядел многообещающе.

describe command('su -c --login "git --version" vagrant') do
  its(:stdout) { should match "git version 2.5.2" }
end

Тест все равно не проходит...

     1) Command "su -c --login "git --version" vagrant" stdout should match "git version 2.5.2"
        Failure/Error: its(:stdout) { should match "git version 2.5.2" }
          expected "" to match "git version 2.5.2"
          /bin/sh -c su\ -c\ --login\ \"git\ --version\"\ vagrant

Хотя, глядя на порядок переключателей...

describe command('su --login -c "git --version" vagrant') do
  its(:stdout) { should match "git version 2.5.2" }
end

Тест проходит успешно. Я не думал, что порядок переключателей повлияет на результат, но это так. Спасибо Драко Атеру за полезные комментарии.

person theNoob    schedule 30.10.2015