OpenStackClient 테스트 수정

김유경·2025년 5월 18일
post-thumbnail

문제

OpenStackClient에서 openstack server list 명령을 실행할 때, 각 서버 인스턴스의 사용자 이름(user_name)을 함께 보여주고자 했습니다. 하지만 기존 코드에는 이 필드가 없고, 테스트 코드도 이를 고려하지 않아 직접 수정이 필요했습니다.

코드 수정 요약

💻 실제 기능 코드

openstackclient/compute/v2/server.py 파일 내 take_action 함수에 다음 코드가 추가되었습니다.

columns += ('user_name',)
column_headers += ('User Name',)

try:
    user_obj = identity_client.users.get(s.user_id)
    s.user_name = user_obj.name
except Exception:
    s.user_name = 'N/A'

💡 테스트용 fake 객체 수정

테스트에서 사용하는 가짜 서버 객체에 기본적으로 user_name 속성을 부여했습니다.

# openstackclient/tests/unit/compute/v2/fakes.py
server.user_name = attrs.get('user_name', 'test-user')

💡 테스트 클래스에서 mock 처리

identity API 호출을 실제로 하지 않고 mock 객체를 반환하도록 설정하여 AttributeError 방지했습니다.

# openstackclient/tests/unit/compute/v2/test_server.py
class TestServerList(_TestServerList):
    def setUp(self):
        super().setUp()
        
        user_mock = mock.Mock()
        user_mock.name = 'test-user'
        self.identity_client.users.get = mock.Mock(return_value=user_mock)

✅ 최종 테스트 결과

tox

Python 프로젝트는 개발 환경, 의존성, Python 버전에 따라 실행 결과가 달라질 수 있습니다. 이러한 문제는 특히 협업 환경이나 배포 전 테스트 단계에서 문제를 유발할 수 있습니다.
tox는 이러한 문제를 해결하기 위해 설계된 테스트 자동화 및 환경 격리 도구입니다. 프로젝트에 필요한 python 버전과 의존성을 명확히 정의하고, 이를 바탕으로 격리된 테스트 환경을 구성하여, 일관된 테스트 실행을 보장합니다.

설치

pip install tox

기본 구조
tox는 tox.ini 또는 pyproject.toml 파일을 통해 설정을 관리합니다. 일반적으로는 다음과 같은 구조를 가집니다.

[tox]
minversion = 4.3.0
envlist = py3, pep8

[testenv]
description = Run unit tests
usedevelop = true
setenv =
    OS_STDOUT_CAPTURE=1
    OS_STDERR_CAPTURE=1
    OS_TEST_TIMEOUT=60
deps =
    -rrequirements.txt
    -rtest-requirements.txt
commands =
    stestr run {posargs}

주요 설정 항목

[tox] 섹션

  • minversion: 최소 tox 버전
  • envlist: 기본 실행 환경 목록
  • skipsdist: 패키지 빌드 생략 여부
  • toxworkdir: tox 작업 디렉토리 변경 (기본: .tox)
  • requires: 실행 전 설치가 필요한 패키지
  • isolated_build: pyproject.toml 기반 빌드 사용 여부

예시

[tox]
minversion = 4.3.0
envlist = py3, pep8
requires =
    tox>=4.0
    virtualenv>=20.0
skipsdist = true
toxworkdir = /tmp/mytox

[testenv] 섹션

  • description: 환경 설명 (예: 단위 테스트 수행 등)
  • usedevelop: 패키지를 개발 모드로 설치
  • setenv: 테스트 환경에 적용할 환경 변수
  • deps: 테스트 실행 전 설치할 의존성
  • commands: 실행할 명령어
  • basepython: 사용할 python 인터프리터 지정 가능
  • skip_install: 패키지 설치 생략 (lint 전용 환경 등에서 사용)
  • passenv: 외부 환경 변수 전달 지정 가능
  • whitelist_externals: whitelist_externals

예시

[testenv]
description = Run unit tests.
usedevelop = true
setenv =
    OS_STDOUT_CAPTURE=1
    OS_STDERR_CAPTURE=1
    OS_TEST_TIMEOUT=60
deps =
    -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
    -r{toxinidir}/test-requirements.txt
    -r{toxinidir}/requirements.txt
commands =
    stestr run {posargs}

stestr

tox와 자주 함께 사용되는 도구 중 하나가 stestr입니다. OpenStack 프로젝트에서 널리 사용되는 병렬 테스트 실행기이며, tox와의 연동을 통해 빠르고 안정적인 테스트가 가능합니다.

항목stestrpytest / unittest
병렬 실행기본 지원 (CPU 코어 수 자동 탐지)pytest-xdist 등의 플러그인 필요
실행 성능빠름 (대규모 테스트 최적화)보통, 플러그인 없으면 느릴 수 있음
테스트 이력 관리subunit 기반 (결과 추적, 재실행 가능)없음 (별도 설정 필요)
사용 편의성다소 복잡 (초기 설정 필요)매우 간단, 직관적
커뮤니티 및 문서OpenStack 중심활발한 커뮤니티와 풍부한 문서
사용 범위대규모 프로젝트, CI 환경소규모부터 대형 프로젝트까지 범용
설정 방식.stestr.conf, tox.inipytest.ini, 커맨드라인 인자 등

0개의 댓글