본문 바로가기

개발/프로그래머스 데브코스

프로그래머스 데브코스 84일차 with. TS 웹 풀스택

📚요약

지난 시간까지 젠킨스에 대해 실습을 진행했습니다. 이번 시간에는 인수 테스트를 자동화시켜 보겠습니다.

 

📖인수 테스트

📄인수 테스트(UAT)

인수 테스트란 요구사항대로 기능이 구현되었는지 확인하는 과정입니다.

 

UAT 자동화의 어려운 이유들

  • 사용자 참여
  • 의존성 통합
  • 스테이징 환경
  • 애플리케이션 동일성
  • 릴리스 준비

📑아티팩트 리포지토리(Artifact Repository)

버전 관리, 접근 제어들의 기능을 가지는 소프트웨어 개발 산출물을 발행하거나 인출할 수 있는 저장소 및 관리 기법으로 파이프라인의 모든 단계에서 동일한 바이너리가 사용되는 것을 보장함으로써 지속적 인도 프로세스에서 매우 중요한 역할을 합니다.

 

📑도커 레지스트리

컨테이너화된 소프트웨어의 산출물인 도커 이미지를 관리할 수 있는 리포지토리

  • 클라우드 방식 레지스트리: docker hub. aws ecr, gcp artifact resgistry etc
  • 자체 호스팅 방식 레지스트리: 사내 네트워크가 아닌 외부에 소프트웨어를 보관하는 것을 금지하는 정책을 가지고 있는 경우에 사용할 수 있는 유일한 해법. 관리에 부담이 있고, 번거로운 작업을 해야 한다.

docker hub에 있는 위 이미지를 이용해 도커 레지스트리를 운용할 수 있습니다.

docker run -d --rm -p 8765:5000 --name registry registry:2
// 도커 레지스트리 동작

docker tag ubuntu:22.04 localhost:8765/ubuntu:22.04
docker push localhost:8765/ubuntu:22.04

curl localhost:8765/v2/_catalog
// 결과 : {"repositories":["ubuntu"]}

curl localhost:8765/v2/ubuntu/tags/list
// 결과 : {"name":"ubuntu","tags":["22.04"]}

 

📑k8s 레지스트리

registry.yaml 파일을 사용해 k8s에 레지스트리에 작업을 해보겠습니다. 남은 작업은 도커 레지스트리에서 했던 작업과 동일합니다.

더보기
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: registry
  name: registry
  namespace: registry
spec:
  replicas: 1
  selector:
    matchLabels:
      run: registry
  template:
    metadata:
      labels:
        run: registry
    spec:
      containers:
      - name: registry
        image: registry:2
        ports:
        - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: registry-service
  namespace: registry
spec:
  type: LoadBalancer
  selector:
    run: registry
  ports:
  - name: registry-tcp
    protocol: TCP
    port: 30100
    targetPort: 5000
    nodePort: 30100

△registry.yaml

kubectl create namespace registry
// namespace 만들기
kubectl apply -f registry.yaml

curl localhost:30100/v2/_catalog
// 결과: {"repositories":[]}

docker tag ubuntu:22.04 localhost:30100/ubuntu:22.04
docker push localhost:30100/ubuntu:22.04

curl localhost:30100/v2/_catalog
// 결과: {"repositories":["ubuntu"]}

curl localhost:30100/v2/ubuntu/tags/list
// 결과: {"name":"ubuntu","tags":["22.04"]}

 

📄데이터 볼륨과 SSL 인증서

  • 호스트 디렉터리에 레지스트리에 볼륨으로 공유
  • 자가 서명된 인증서 발급해 레지스트리 서버에 설치

📑OpenSSL을 통한 인증서 발급

windows에 OpenSSL을 설치하는 방법은 사이트를 참고하시면 됩니다. 설치한 후 설치하고자 하는 폴더로 이동해서 다음 명령어를 실행하면 됩니다.

openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/registry.key -addext "subjectAltName = DNS:registry-service.registry.svc.cluster.local" -x509 -days 3650 -out certs/registry.crt

혹시 req: Can't open "certs/registry.key" for writing, No such file or directory 다음과 같은 에러가 발생하면, 단순하게 해당 폴더에 certs이름을 가진 빈 폴더를 하나 만들어 주시면 됩니다.

 

다음은 k8s의 secret으로 만든 키를 등록하는 것입니다. 다음 명령어를 실행하면 됩니다.

kubectl create secret tls registry-cert --cert=certs/registry.crt --key=certs/registry.key -n registry

 

📑볼륨 추가

위에서 사용했던 registry.yaml에 추가로 입력합니다.

더보기
spec:
  containers:
  - name: registry
    image: registry:2
    ports:
    - containerPort: 5000
    env:
    - name: REGISTRY_HTTP_TLS_CERTIFICATE
      value: "/certs/tls.crt"
    - name: REGISTRY_HTTP_TLS_KEY
      value: "/certs/tls.key"
    volumeMounts:
    - name: registry-certs
      mountPath: "/certs"
      readOnly: true
    - name: registry-data
      mountPath: "/var/lib/registry"
  volumes:
  - name: registry-certs
    secret:
      secretName: registry-cert
  - name: registry-data
    persistentVolumeClaim:
      claimName: registry-data-pvc

△ deployment 생성에 추가된 부분

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: registry-data-pv
  namespace: registry
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 50Gi
  accessModes:
  - ReadWriteOnce
  hostPath:
    path: "c/Users/User/Desktop/TY/docker/uat"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: registry-data-pvc
  namespace: registry
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: manual
  resources:
    requests:
      storage: 50Gi

△서비스 하단에 볼륨 생성을 추가한 부분

볼륨을 추가하는 부분은 에러만 발생하고 아직 해결하지 못함 윈도우 경로 문제로 예상 중 ready 상태에서 동작을 하지 않음

 

📄Jenkins 파이프라인에서 인수 테스트

  • Jenkins에서 도커 이미지 빌드, 푸시 및 인수 테스트 환경 준비
  • 로컬 환경에서 빌드 및 테스트
  • Jenkins 파이프라인에 스테이지 추가

📄프레임워크를 적용한 인수 테스트

📑사용자 대면 테스트

인수 테스트는 사용자 대면 테스트라고도 합니다. REST API의 경우 curl에 의한 테스트로 블랙박스 테스트가 가능하지만 의존할 수는 없습니다. 읽고 이해하기가 어렵고 유지보수에 불리하기 때문입니다. 그렇기에 사용자와 같이 작성하고 사용자가 이해할 수 있는 방법이 필요한데 이 방법이 인수 테스트입니다.

 

📑BDD

사용자가 테스트의 기준을 제시하고 해당 기준으로부터 개발자가 fixture 또는 step definitions라고 부르는 친화적인 DSL과 프로그래밍 언어를 합쳐서 테스트를 작성합니다.

 

위 방법을 도와주는 도구로 CucumberSelenium이 있습니다.

 

📑인수 테스트 생성 with. Cucumber

  • 인수 기준 생성
  • 스텝 정의 작성
  • 자동 인수 테스트 실행
🍯tip! 테스트는 항상 성공이 아닌 실패 시나리오부터 진행한다.

 

📑TDD

  • 인수 테스트는 기술보다 사람이 중심이다
  • TDD는 인수 테스트에 적합하다
  • 인수 기준 사양을 먼저 작성한다

 

다음 시간에 계속...

 

출처 & 참고

이시윤 강사님의 강의