[GitLab] pytest 코드 테스트 적용

SungyunKim·2025년 6월 26일

develop

목록 보기
3/3

CI란?

  • CI(Continuous Integration, 지속적 통합)는 소프트웨어 개발 과정에서 여러 개발자가 작업한 코드를 자주, 자동으로 통합(merge)하고, 그 과정에서 빌드와 테스트를 자동화해 코드 품질을 높이는 개발 방법론

GitLab CI의 주요 특징과 동작 방식

  • 자동화된 빌드, 테스트, 배포 새로운 코드를 푸시하거나 머지 리퀘스트를 생성하면, GitLab CI가 자동으로 파이프라인을 실행하여 코드의 빌드, 테스트, 배포 과정을 자동화
  • 구성 파일: .gitlab-ci.yml 프로젝트의 루트 디렉터리에 .gitlab-ci.yml 파일을 생성해 CI/CD 파이프라인을 정의합니다. 이 파일에는 어떤 작업(Job)을 어떤 순서(Stage)로 실행할지, 어떤 조건에서 실행할지 등을 YAML 형식으로 기술
  • 구성 요소
    • Pipeline: 전체 자동화 프로세스의 흐름 정의
    • Stage: 빌드, 테스트, 배포 등 논리적으로 묶인 작업 단계로, 각 stage를 순차적으로 실행
    • Job: 실제로 실행되는 개별 작업(예: 테스트 실행, 빌드 명령 등)으로, 같은 Stage 내의 Job은 병렬 실행 가능
    • Runner: ****실제로 Job을 실행하는 에이전트로, GitLab 서버와 별도로 동작하므로 개별 설치 필요

CI 도입의 장점

  • 코드 변경이 있을 때마다 자동으로 빌드와 테스트가 실행되어, 다양한 문제의 조기 식별 가능
  • 여러 개발자가 동시에 작업해도 통합 과정에서 발생할 수 있는 충돌이나 오류를 신속하게 파악 가능
  • 반복적인 작업(빌드, 테스트, 배포 등)이 자동화되어 개발 효율성 향상

코드 테스트란?

코드 테스트는 소프트웨어가 의도한 대로 동작하는지, 오류나 결함이 없는지 확인하기 위해 다양한 방법으로 코드를 검증하는 과정. 테스트는 소프트웨어의 품질을 높이고, 유지보수성을 확보하며, 개발 과정에서 발생할 수 있는 문제를 조기에 발견하는 데 중요한 역할

종류

  1. 단위 테스트(Unit Test)
    • 가장 작은 코드 단위(함수, 메서드, 클래스 등)를 독립적으로 검증
    • 각 기능이 올바르게 동작하는지 확인하며, 빠르고 반복적으로 실행
    • 예시: add(1, 2)가 3을 반환하는지 확인하는 테스트.
  2. 통합 테스트(Integration Test)
    • 여러 단위(모듈, 클래스 등)를 결합해 상호작용이 정상적으로 이루어지는지 검증
    • 단위별로는 문제없던 코드가, 결합 후 예상치 못한 오류를 내는지 확인
  3. 시스템 테스트(System Test)
    • 전체 시스템이 요구사항대로 동작하는지, 실제 사용 환경에서 검증
    • 사용자의 관점에서 소프트웨어를 테스트하며, 기능 간 상호작용과 전체 흐름 점검

Unit Test GitLab CI 자동화

오프라인 환경 기준

1. .gitlab-ci.yml 생성

프로젝트 루트 디렉토리에 생성

stages:
  - test

pytest:
  stage: test
  image: pytest:8.1.1
  script:
    - pytest --junitxml=pytest-results.xml
  tags:
	  - docker
	  - pytest
  artifacts:
    reports:
      junit: pytest-results.xml

2. 코드 테스트를 위한 Docker image 생성

# Dockerfile
FROM python:3.10.16-slim

# 시스템 패키지 설치
RUN apt-get update && apt-get install -y \
    gcc \
    g++ \
    build-essential \
    && rm -rf /var/lib/apt/lists/*

# requirements.txt 설치
COPY requirements.txt .
RUN pip install --upgrade pip && pip install -r requirements.txt && \
    pip cache purge
# requirements.txt
pandas==2.3.0
numpy==2.2.6
scikit-learn==1.7.0
torch==2.6.0
torchaudio==2.6.0
torchvision==0.21.0
tensorboard==2.19.0
tensorboardX==2.6.4
ray[default]==2.43.0
mlflow==2.20.4
click==8.1.7
pydantic==2.10.6
h5py==3.13.0
pytest==8.1.1
# Docker image 옮기기
docker save -o pytest.tar pytest:8.1.1
scp -P <PORT> pytest.tar sungyunkim@<IP>:<DIR>
docker load -i pytest.tar

3. gitlab-runner 등록

sudo vi mlops/gitlab-runner/config.toml
[[runners]]
  name = "automl_runner"
  url = "http://<IP:PORT>"
  id = ID
  token = "TOKEN"
  token_obtained_at = 2025-06-26T05:57:34Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "docker"
  [runners.cache]
    MaxUploadedArchiveSize = 0
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "pytest:8.1.1"
    pull_policy = "never"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
    network_mtu = 0
# 실행이 잘 안되면
docker exec -it gitlab-runner /bin/bash
gitlab-runner run

MR 성공 예시

profile
MedicalAI Researcher

0개의 댓글