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)
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] 섹션
예시
[tox]
minversion = 4.3.0
envlist = py3, pep8
requires =
tox>=4.0
virtualenv>=20.0
skipsdist = true
toxworkdir = /tmp/mytox
[testenv] 섹션
예시
[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}
tox와 자주 함께 사용되는 도구 중 하나가 stestr입니다. OpenStack 프로젝트에서 널리 사용되는 병렬 테스트 실행기이며, tox와의 연동을 통해 빠르고 안정적인 테스트가 가능합니다.
| 항목 | stestr | pytest / unittest |
|---|---|---|
| 병렬 실행 | 기본 지원 (CPU 코어 수 자동 탐지) | pytest-xdist 등의 플러그인 필요 |
| 실행 성능 | 빠름 (대규모 테스트 최적화) | 보통, 플러그인 없으면 느릴 수 있음 |
| 테스트 이력 관리 | subunit 기반 (결과 추적, 재실행 가능) | 없음 (별도 설정 필요) |
| 사용 편의성 | 다소 복잡 (초기 설정 필요) | 매우 간단, 직관적 |
| 커뮤니티 및 문서 | OpenStack 중심 | 활발한 커뮤니티와 풍부한 문서 |
| 사용 범위 | 대규모 프로젝트, CI 환경 | 소규모부터 대형 프로젝트까지 범용 |
| 설정 방식 | .stestr.conf, tox.ini | pytest.ini, 커맨드라인 인자 등 |