Chart用のRSpecテストの記述

以下は、GitLab ChartのRSpecテストを作成する際の注意点と規約です。

RSpecテストのフィルタリング

開発を支援するために、:focus 1 つ以上のテストにタグを :focus追加することで、どのテストが実行されるかをフィルタリングすることができます。 タグを:focus 使用すると :focus、特にタグ付けされた_テストだけが_実行されます。 これにより、RSpec のすべてのテストが実行されるのを待つことなく、新しいコードを素早く開発したりテストしたりすることができます。 以下は、:focusでタグ付けされたテストの例です。

describe 'some feature' do
  it 'generates output', :focus => true do
    ...
  end
end

:focus タグは、describecontextit ブロックに追加することができ、テストまたはテストグループを実行することができます。

ChartからYAMLの生成

Chartのテストの多くは、多くのChart入力に対して正しいYAML構造を生成するかどうかです。 これは次のようにHelmTemplateクラスを使って行われます:

obj = HelmTemplate.new(values)

結果のobj は、Kubernetes オブジェクトkind とオブジェクト名 (metadata.name) によってインデックス化されたhelm templateコマンドによって返された YAML ドキュメントをエンコードします。 このインデックス化された値は、YAML 内の値を見つけるためにほとんどのメソッドで使用されます。

使用例:

obj.dig('ConfigMap/test-gitaly', 'data', 'config.toml.erb')

これは、test-gitaly ConfigMapに含まれるconfig.toml.erb ファイルの内容を返します。

注意:HelmTemplate クラスを使用すると、helm template コマンドを実行する際、常に “test” というリリース名が使用されます。

チャート入力

HelmTemplate クラスのコンストラクタへの入力パラメータは、Helmvalues.yaml コマンドラインで使用さ values.yamlれる値を表す辞書ですvalues.yaml 。 この辞書は values.yamlファイルのvalues.yaml YAML 構造を反映 values.yamlします。

describe 'some feature' do
  let(:default_values) do
    { 'certmanager-issuer' => { 'email' => 'test@example.com' } }
  end

  describe 'global.feature.enabled' do
    let(:values) do
      {
        'global' => {
          'feature' => {
            'enabled' => true
          }
        }
      }.merge(default_values)
    end

    ...
  end
end

上のスニペットは、複数のテストに共通するデフォルト値を設定し、それを特定のテストのHelmTemplate コンストラクタで使用する最終的な値にマージするという、よくあるパターンを示しています。

結果のテスト

HelmTemplate オブジェクトには、RSpec テストを書く際に役立つメソッドがいくつもあります。

  • .exit_code()

これは、Kuberneteshelm template クラスターでChartをインスタンス化するYAMLドキュメントを作成するために使用されたコマンドの helm template終了コードを返しますhelm template 。 成功 helm templateすると、終了コード0が返されます。

  • .dig(key, ...)

HelmTemplate インスタンスによって返された YAML ドキュメントをウォークダウンし、最後のキーに存在する値を返します。 値が見つからない場合はnilが返されます。

  • .volumes(item)

指定されたデプロイオブジェクトのすべてのボリュームの配列を返します。 返される配列は、デプロイオブジェクトからvolumes キーを直接コピーしたものです。

  • .find_volume(item, volume_name)

指定されたデプロイ・オブジェクトから、指定されたボリュームの辞書を返します。

  • .projected_volume_sources(item, mount_name)

指定された投影ボリュームのソースの配列を返します。 返される配列の構造は以下のとおりです:

- secret:
    name: test-rails-secret
    items:
     - key: secrets.yml
       path: rails-secrets/secrets.yml
  • .stderr()

helm template コマンド実行時の STDERR 出力を返します。

  • .values()

helm template コマンドの実行に使用されたすべての値の辞書を返します。