구현 과정
server.py > ListServer > take_action > ListServer 함수 내부에서 구현했던 과제2 코드 일부 변경하기
-
projects.list()users.list()를 사용하고 있었으나, 이 함수들을 활용한 반복문으로 인해 테스트 과정에서 오류가 발생하였습니다. -
따라서 하단
data에 추가 정보를 삽입하는 부분에서 바로user_id및project_id에 대응되는 이름을 가져오도록 수정했습니다.
# 변경 후 코드
if parsed_args.assignment2:
columns += (
'project_name',
'user_name',
)
column_headers += (
'Project Name',
'User Name',
)
for s in data:
s.project_name = identity_client.users.get(s.user_id).name
s.user_name = identity_client.projects.get(s.project_id).name
test_server.py > TestServerList 함수 내의 기존 테스트 코드 구조 분석하기
- 유사한 기능을 가진
test_server_list_all_projects_option함수를 분석했습니다.
def test_server_list_all_projects_option(self):
self.data = tuple(
(
s.id,
s.name,
s.status,
server.AddressesColumn(s.addresses),
# Image will be an empty string if boot-from-volume
self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
self.flavor.name,
s.project_id,
)
for s in self.servers
)
arglist = [
'--all-projects',
]
verifylist = [
('all_projects', True),
('long', False),
('deleted', False),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.image_client.images.assert_called()
self.compute_client.flavors.assert_called()
self.assertEqual(self.columns_all_projects, columns)
self.assertEqual(self.data, tuple(data))
-
우선
self.data에 테스트할 튜플 값을 생성합니다. 이때 튜플 내부에 작성되는 각 값은 출력되는 컬럼에 대응되는 데이터 값임을 알 수 있었습니다. -
이후에는 명령어에 전달되는 인자인
--all-projects를arglist값으로 받습니다.-
이와 함께
verifylist도 구성하는데, 현재 테스트는--all-projects=True이고, 나머지 옵션들은False인 상태를 기대하기 때문에, 테스트를 위한 값을 설정합니다. -
check_parser함수를 통해 해당 인자들이 올바르게 전달되어 실제 인자와 매칭되는지 확인하고, 테스트를 통과하면 그 값들을parsed_args에 저장합니다.
-
-
이후
take_action(parsed_args)함수에서 위 인자값들을 넣었을때, 관련 함수 구현이 실제로 올바르게 동작하는지 테스트하고, 그 결과값을 받아columnsdata에 저장합니다. -
다음으로는 기본 출력값에 존재하는
imageflavor정보를 체크하기 위해, 필요한 클라이언트를 호출합니다. -
이후 컬럼 기대값
columns_all_projects와 실제 테스트 결과값columns이 매칭되는지, 실제data와 사전에 튜플로 구성한self.data가 매칭되는지 체크합니다.columns_all_projects = ( 'ID', 'Name', 'Status', 'Networks', 'Image', 'Flavor', 'Project ID', )-
참고로
columns_all_projects값은 같은 파일에 따로 선언되어 있습니다.- 해당 값들이
--all-projects가 옵션으로 주어졌을때 출력되어야할 컬럼값들입니다.
- 해당 값들이
-
-
이 모든 과정에서 값들이 매칭되면 테스트가 성공합니다.
test_server_list_assignment2_option 테스트코드 구현하기
# 과제 3: 과제2 기능에 대한 unit test code 작성
columns_assignment2 = (
'ID',
'Name',
'Status',
'Networks',
'Image',
'Flavor',
'Project Name',
'User Name',
)
...
def test_server_list_assignment2_option(self):
self.data = tuple(
(
s.id,
s.name,
s.status,
server.AddressesColumn(s.addresses),
self.image.name if s.image else server.IMAGE_STRING_FOR_BFV,
self.flavor.name,
self.identity_client.users.get(s.user_id).name,
self.identity_client.projects.get(s.project_id).name,
)
for s in self.servers
)
arglist = [
'--assignment2',
]
verifylist = [
('assignment2', True),
('all_projects', False),
('long', False),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.image_client.images.assert_called()
self.compute_client.flavors.assert_called()
self.assertEqual(self.columns_assignment2, columns)
self.assertEqual(self.data, tuple(data))
# ----
-
위에서 분석했던 코드와 동일한 구조로
data에tuple값을 생성하여 넣어줍니다.- 이 때, 추가할 값인
user_nameproject_name은 과제2와 동일하게 추가합니다
- 이 때, 추가할 값인
-
arglistverifylist를 테스트할 수 있도록 구성합니다. -
assertEqual테스트 부분에서 사전 작성한columns_assignment2값을 사용하여 테스트합니다.

