チャートテスト

チャートには、連携して動作する多数のKubernetesリソースとコンポーネントが含まれています。チャート作成者は、チャートがインストールされたときに期待どおりに動作することを検証するテストを作成することができます。これらのテストは、チャート利用者がチャートの役割を理解するのにも役立ちます。

helmチャートのテストは、`templates/`ディレクトリ下にあり、実行するコマンドを指定したコンテナを含むジョブ定義です。テストが成功とみなされるためには、コンテナが正常に終了する(終了コード0)必要があります。ジョブ定義には、helmテストフックアノテーション:`helm.sh/hook: test`が含まれている必要があります。

Helm v3までは、ジョブ定義には、`helm.sh/hook: test-success`または`helm.sh/hook: test-failure`のいずれかのhelmテストフックアノテーションが含まれている必要がありました。 `helm.sh/hook: test-success`は、`helm.sh/hook: test`の下位互換性のある代替手段として、現在も受け入れられています。

テスト例

  • values.yamlファイルの設定が正しく反映されていることを検証します。
    • ユーザー名とパスワードが正しく動作することを確認します。
    • 間違ったユーザー名とパスワードが動作しないことを確認します。
  • サービスが稼働しており、正しく負荷分散されていることを確認します。
  • など

Helmにあらかじめ定義されているテストは、`helm test <リリース名>`コマンドを使用してリリースに対して実行できます。チャート利用者にとって、これはチャート(またはアプリケーション)のリリースが期待どおりに動作することを確認するための優れた方法です。

テスト例

helm createコマンドを実行すると、いくつかのフォルダとファイルが自動的に作成されます。helm test機能を試すには、まずデモhelmチャートを作成します。

$ helm create demo

これで、デモhelmチャートに次の構造が表示されます。

demo/
  Chart.yaml
  values.yaml
  charts/
  templates/
  templates/tests/test-connection.yaml

`demo/templates/tests/test-connection.yaml`に、試すことができるテストがあります。helmテストpodの定義はこちらで見ることができます。

apiVersion: v1
kind: Pod
metadata:
  name: "{{ include "demo.fullname" . }}-test-connection"
  labels:
    {{- include "demo.labels" . | nindent 4 }}
  annotations:
    "helm.sh/hook": test
spec:
  containers:
    - name: wget
      image: busybox
      command: ['wget']
      args: ['{{ include "demo.fullname" . }}:{{ .Values.service.port }}']
  restartPolicy: Never

リリースでテストスイートを実行する手順

まず、クラスターにチャートをインストールしてリリースを作成します。すべてのpodがアクティブになるまで待つ必要がある場合があります。このインストール直後にテストすると、一時的な障害が表示される可能性があるため、再テストが必要になります。

$ helm install demo demo --namespace default
$ helm test demo
NAME: demo
LAST DEPLOYED: Mon Feb 14 20:03:16 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE:     demo-test-connection
Last Started:   Mon Feb 14 20:35:19 2022
Last Completed: Mon Feb 14 20:35:23 2022
Phase:          Succeeded
[...]

注意事項

  • 1つのyamlファイルに、または`templates/`ディレクトリ内の複数のyamlファイルに、必要なだけテストを定義できます。
  • 分離性を高めるために、`<チャート名>/templates/tests/`のように`tests/`ディレクトリの下にテストスイートをネストすることもできます。
  • テストはHelmフックであるため、`helm.sh/hook-weight`や`helm.sh/hook-delete-policy`などのアノテーションをテストリソースで使用できます。