차트 테스트

차트 테스트

차트는 함께 동작하는 여러 Kubernetes 리소스와 컴포넌트를 담아요. 차트 작성자라면 설치했을 때 차트가 예상대로 동작하는지 검증하는 테스트를 작성하고 싶을 거예요. 이런 테스트는 차트 사용자가 차트가 무엇을 하기 위한 것인지 이해하는 데도 도움이 돼요.

Helm 차트의 테스트templates/ 디렉터리 아래에 있으며, 주어진 명령을 실행할 컨테이너를 지정하는 워크로드 정의(흔히 Pod나 Job)예요. 테스트가 성공하려면 컨테이너가 성공적으로 종료(exit 0)해야 해요. 정의에는 helm 테스트 훅 어노테이션 helm.sh/hook: test가 반드시 들어 있어야 해요.

Helm v3까지는 작업 정의에 helm.sh/hook: test-success 또는 helm.sh/hook: test-failure 중 하나의 helm 테스트 훅 어노테이션이 필요했어요. helm.sh/hook: test-successhelm.sh/hook: test의 하위 호환 대안으로 여전히 허용돼요.

예제 테스트:

  • values.yaml 파일의 설정이 제대로 주입됐는지 검증해요.

  • 사용자 이름과 비밀번호가 올바르게 동작하는지 확인해요.

  • 잘못된 사용자 이름과 비밀번호가 동작하지 않는지 확인해요.

  • 서비스가 떠 있고 올바르게 로드 밸런싱하는지 확인해요.

  • 등등.

helm test <RELEASE_NAME> 명령으로 Helm 릴리스에서 정의된 테스트를 실행할 수 있어요. 차트 사용자에게는 차트(또는 애플리케이션) 릴리스가 예상대로 동작하는지 확인하는 아주 좋은 방법이에요.

출처: 문서

본문

예제 테스트

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 테스트 포드 정의를 볼 수 있어요:

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

릴리스에서 테스트 스위트 실행 단계

먼저 클러스터에 차트를 설치해 릴리스를 만들어요. 모든 포드가 활성화될 때까지 기다려야 할 수도 있어요. 설치 직후에 테스트하면 일시적 실패(transitive failure)가 나올 가능성이 높으니 다시 테스트하고 싶을 거예요.

$ 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
[...]

참고 사항

  • 하나의 yaml 파일에 원하는 만큼 테스트를 정의하거나 templates/ 디렉터리의 여러 yaml 파일에 나눠 정의할 수 있어요.

  • 더 격리하려면 <chart-name>/templates/tests/처럼 tests/ 디렉터리 아래에 테스트 스위트를 중첩해도 돼요.

  • 테스트는 Helm 훅이므로 helm.sh/hook-weighthelm.sh/hook-delete-policy 같은 어노테이션을 테스트 리소스에 사용할 수 있어요.

더 알아보기 (Learn more)