[필수 과제] openstack token issue CLI에 대한 functional test 코드 구현하기
# /python-openstackclient/openstackclient/tests/functional/identity/v3/test_token.py
from openstackclient.tests.functional.identity.v3 import common
class TokenTests(common.IdentityTests):
def test_token_issue(self):
raw_output = self.openstack('token issue')
items = self.parse_show(raw_output)
self.assert_show_fields(items, self.TOKEN_FIELDS)
기존 Functional Test 코드는 self.assert_show_fields(items, self.TOKEN_FIELDS)을 통해 openstack token issue 명령어를 실행하고 나온 기본 table 형식의 출력을 분석합니다.
즉, 해당 테스트는 기대하는 필드들이 모두 포함되어 있는지 정도의 기본적인 구조만 검증할 뿐 직접적으로 어떠한 값이 존재하는지는 확인하지 않습니다.
# /python-openstackclient/openstackclient/tests/functional/identity/v3/test_token.py
import json
from openstackclient.tests.functional.identity.v3 import common
# 순수한 테스트 메소드
class TokenTests(common.IdentityTests):
# TC1: 기본 테이블 형식 출력 검증
def test_token_issue_table_format(self):
raw_output = self.openstack('token issue')
self.assertIn('expires', raw_output)
self.assertIn('project_id', raw_output)
self.assertIn('user_id', raw_output)
# TC2: JSON 형식 출력 검증
def test_token_issue_json_format(self):
raw_output = self.openstack('token issue --format json')
data = json.loads(raw_output)
self.assertIn('id', data)
self.assertIn('project_id', data)
self.assertIn('user_id', data)
# TC3: 특정 컬럼만 값으로 출력하는지 검증
def test_token_issue_single_column(self):
# project_id 필드가 존재하는지만 확인
raw_output = self.openstack(
'token issue --format value --column project_id'
)
# 출력이 비어있지 않은지만 확인
self.assertNotEqual('', raw_output.strip())
따라서 위와 같이 명령어의 출력 포맷이 올바르게 작동하는지 검증할 수 있도록 테스트 코드를 수정하였습니다.
openstack('command'): OpenStack CLI 명령어를 실행하고 그 결과를 문자열로 반환합니다.assertIn(expected, actual):actual문자열 안에expected문자열이 포함되어 있는지 확인합니다.assertEqual(expected, actual):expected값과actual값이 정확히 동일한지 확인합니다.
테스트를 구성하는 주요 메소드는 위와 같습니다.
# /python-openstackclient/.stestr.conf
[DEFAULT]
# test_path=./openstackclient/tests/unit
test_path=./openstackclient/tests/functional
top_dir=./
group_regex=([^\.]+\.)+
이후 위와 같이 Functional Test를 진행해주기 위해 test_path를 수정해줍니다.
# /python-openstackclient/tox.ini
[testenv:unit-tips]
commands =
python -m pip install -q -U -e {toxinidir}/../cliff#egg=cliff
python -m pip install -q -U -e {toxinidir}/../keystoneauth#egg=keystoneauth
python -m pip install -q -U -e {toxinidir}/../osc-lib#egg=osc_lib
python -m pip install -q -U -e {toxinidir}/../openstacksdk#egg=openstacksdk
python -m pip freeze
stestr run {posargs}
[testenv:functional{,-tips,-py38,-py39,-py310,-py311,-py312}]
description =
Run functional tests.
setenv =
OS_TEST_PATH=./openstackclient/tests/functional
# 인코딩 문제 해결
PYTHONUTF8=1
passenv =
OS_*
commands =
tips: python -m pip install -q -U -e {toxinidir}/../cliff#egg=cliff
tips: python -m pip install -q -U -e {toxinidir}/../keystoneauth#egg=keystoneauth1
tips: python -m pip install -q -U -e {toxinidir}/../osc-lib#egg=osc_lib
tips: python -m pip install -q -U -e {toxinidir}/../openstacksdk#egg=openstacksdk
tips: python -m pip freeze
{[testenv]commands}
또한 위와 같이 PYTHONUTF8=1를 추가하여 테스트 환경에서의 인코딩 문제를 해결해주고
# /python-openstackclient/clouds.yaml
clouds:
devstack-admin:
auth:
auth_url: http://<MSY-DEVSTACK-PUB-IP>/identity
username: "admin"
password: "<DEVSTACK-PW>"
project_domain_name: "default"
project_name: "admin"
user_domain_name: "default"
auth_type: "password"
region_name: "RegionOne"
interface: "public"
identity_api_version: 3
테스트를 진행할 때의 접속 정보를 clouds.yaml파일에 위와 같이 추가해주고
$ tox -e functional -- "openstackclient.tests.functional.identity.v3.test_token.TokenTests"
위 명령어를 통해 수정한 identity.v3.test_token.TokenTests 클래스에 대해서만 테스트를 수행해주면
$ tox -e functional -- "openstackclient.tests.functional.identity.v3.test_token.TokenTests"
...
functional: install_package> python -I -m pip install --force-reinstall --no-deps C:\...\OCA-OpenStack\python-openstackclient\.tox\.tmp\package\28\python_openstackclient-8.1.1.dev14-0.editable-py3-none-any.whl
functional: commands[0]> stestr run openstackclient.tests.functional.identity.v3.test_token.TokenTests
{0} openstackclient.tests.functional.identity.v3.test_token.TokenTests.test_token_issue_json_format [1.703573s] ... ok
{0} openstackclient.tests.functional.identity.v3.test_token.TokenTests.test_token_issue_single_column [1.720266s] ... ok
{0} openstackclient.tests.functional.identity.v3.test_token.TokenTests.test_token_issue_table_format [1.712172s] ... ok
======
Totals
======
Ran: 3 tests in 5.1360 sec.
- Passed: 3
- Skipped: 0
- Expected Fail: 0
- Unexpected Success: 0
- Failed: 0
Sum of execute time for each test: 5.1360 sec.
==============
Worker Balance
==============
- Worker 0 (3 tests) => 0:00:05.136011
.pkg: _exit> python C:\...\OCA-OpenStack\Lib\site-packages\pyproject_api\_backend.py True pbr.build
functional: OK (29.80=setup[7.67]+cmd[22.12] seconds)
congratulations :) (30.25 seconds)
위와 같이 수정한 Functional Test가 DevStack에서 정상적으로 수행되는 모습을 볼 수 있습니다.