Обработка атрибутов в InSpec

Я пытался создать несколько базовых тестов inspec для проверки набора HTTP-URL. Я начал так:

control 'http-url-checks' do
  impact 1.0
  title 'http-url-checks'
  desc '
   Specify the URLs which need to be up and working.
  '
  tag 'http-url-checks'

  describe http('http://example.com') do
    its('status') { should eq 200 }
    its('body') { should match /abc/ }
    its('headers.name') { should eq 'header' }
  end

  describe http('http://example.net') do
    its('status') { should eq 200 }
    its('body') { should match /abc/ }
    its('headers.name') { should eq 'header' }
  end
end

Мы заметили, что URL-адреса жестко запрограммированы в элементах управления и не очень забавны. Я хотел бы переместить их в какой-нибудь файл "атрибутов" и перебрать их в контрольном файле.

Я пытался использовать структуру папок 'files' внутри профиля. Я создал файл - httpurls.yml и в нем было следующее содержимое -

- url: http://example.com
- url: http://example.net

..и в моем контрольном файле у меня была конструкция -

  my_urls = yaml(content: inspec.profile.file('httpurls.yml')).params

  my_urls.each do |s|
    describe http(s['url']) do
      its('status') { should eq 200 }
    end
  end

Однако, когда я запускаю профиль соответствия, я получаю сообщение об ошибке - "httpurls.yml not found" (хотя не уверен насчет точного сообщения об ошибке). Ниже приведена структура папок для профиля соответствия.

введите описание изображения здесь

Что я делаю не так?

Есть ли лучший способ достичь того, что я пытаюсь сделать?

1 ответ

Секрет в том, чтобы использовать атрибуты профиля, как определено в нижней части этой страницы:

https://www.inspec.io/docs/reference/profiles/

Сначала создайте в YML-файле атрибуты профиля. Я называю мой profile-attribute.yml,

Во-вторых, поместите ваш массив значений в файл YML, например, так:

urls:
  - http://example.com
  - http://example.net

В-третьих, создайте атрибут в верхней части ваших тестов InSpec:

my_urls = attribute('urls', description: 'The URLs that I am validating.')

В-четвертых, используйте свой атрибут в тесте InSpec:

my_urls.each do |s|
  describe http(s['url']) do
    its('status') { should eq 200 }
  end
end

Наконец, когда вы вызываете свой тест InSpec, укажите на свой файл YML, используя --attrs:

inspec exec mytest.rb --reporter=cli --attrs profile-attribute.yml

Есть еще один способ сделать это, используя файлы (вместо атрибутов профиля и --attrs флаг). Вы можете использовать JSON или YAML.

Сначала создайте файл JSON и / или YAML и поместите их в files каталог. Простой пример файла JSON может выглядеть так:

{
    "urls": ["https://www.google.com", "https://www.apple.com"]
}

И простой пример файла YAML может выглядеть так:

urls:
- https://www.google.com
- https://www.apple.com

Во-вторых, включите код в верхней части файла InSpec, чтобы прочитать и проанализировать JSON и / или YAML, например так:

jsoncontent = inspec.profile.file("tmp.json")
jsonparams = JSON.parse(jsoncontent)
jsonurls = jsonparams['urls']

yamlcontent = inspec.profile.file("tmp.yaml")
yamlparams = YAML.load(yamlcontent)
yamlurls = yamlparams['urls']

В-третьих, используйте переменные в ваших тестах InSpec, например:

jsonurls.each do |jsonurl|
  describe http(jsonurl) do
    puts "json url is " + jsonurl
    its('status') { should eq 200 }
  end
end

yamlurls.each do |yamlurl|
  describe http(yamlurl) do
    puts "yaml url is " + yamlurl
    its('status') { should eq 200 }
  end
end

(Обратите внимание puts линия для отладки.)

Результат - то, что вы ожидаете:

json url is https://www.google.com
json url is https://www.apple.com
yaml url is https://www.google.com
yaml url is https://www.apple.com

Profile: InSpec Profile (inspec-file-test)
Version: 0.1.0
Target:  local://

  http GET on https://www.google.com
     ✔  status should eq 200
  http GET on https://www.apple.com
     ✔  status should eq 200
  http GET on https://www.google.com
     ✔  status should eq 200
  http GET on https://www.apple.com
     ✔  status should eq 200
Другие вопросы по тегам