1. unit test code 수정
Mock data 데이터 생성
class TestServer(compute_fakes.TestComputev2):
mock_projects = identity_fakes.FakeProject.create_projects()
mock_users = identity_fakes.FakeUser.create_users()
def setup_sdk_servers_mock(self, count):
servers = compute_fakes.create_servers(
attrs=self.attrs,
count=count,
)
for server_obj in servers:
mock_project = random.choice(self.mock_projects)
mock_user = random.choice(self.mock_users)
server_obj.project_id = mock_project.id
server_obj.project_name = mock_project.name
server_obj.user_id = mock_user.id
server_obj.user_name = mock_user.name
# This is the return value for compute_client.find_server()
self.compute_client.find_server.side_effect = servers
return servers
- fake projects, users를 초기화
- 생성한 fake server에 대해 랜덤한 project, user 속성 추가
Identity API side_effect 설정
def setUp(self):
super().setUp()
# Set object attributes to be tested. Could be overwritten in subclass.
self.attrs = {}
def get_project_side_effect(project_id):
for project in self.mock_projects:
if project.id == project_id:
return project
return None
def get_user_side_effect(user_id):
for user in self.mock_users:
if user.id == user_id:
return user
return None
self.identity_client.projects.get.side_effect = get_project_side_effect
self.identity_client.users.get.side_effect = get_user_side_effect
identity_client의projects.get및users.get호출 시, 사전에 정의된 모의 객체를 반환하도록 설정take_action에서 identity_client.projects.get(project_id) 실행시에, 모킹 수행
Unit test 수정
TestServerList, TestServerListV273테스트 클래스를 수정
- column 추가
columns = (
'ID',
'Name',
'Status',
'Project Name', # New
'User Name', # New
'Networks',
'Image',
...
)
columns_long = (
'ID',
'Name',
'Status',
'Project Name', # New
'User Name', # New
'Task State',
'Power State',
...
)
columns_all_projects = (
'ID',
'Name',
'Status',
'Project Name', # New
'User Name', # New
'Networks',
...
)
assertEqual(self.columns, columns) 를 통과하기 위해, take_action에서 반환된 column과 동일하게 변경
- 각 테스트 predicted 데이터 수정
class TestServerList(_TestServerList):
def setUp(self):
super().setUp()
Image = collections.namedtuple('Image', 'id name')
self.image_client.images.return_value = [
Image(id=s.image['id'], name=self.image.name)
# Image will be an empty string if boot-from-volume
for s in self.servers
if s.image
]
Flavor = collections.namedtuple('Flavor', 'id name')
self.compute_client.flavors.return_value = [
Flavor(id=s.flavor['id'], name=self.flavor.name)
for s in self.servers
]
self.data = tuple(
(
s.id,
s.name,
s.status,
s.project_name, # New
s.user_name, # New
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,
)
for s in self.servers
)
setup_sdk_servers_mock 에서 추가한 속성 (project_name, user_name) 과 take action에서 mocking 해서 가져온 결과가 같은지 확인
- partial constructs 유닛테스트
해당 테스트는 setup 이후, Compute API가 비정상적으로 부분적인 정보만 포함된 서버 객체를 반환했을 때, server list가 오류 없이 정상적으로 해당 객체를 처리하는지 검증
setup에서 생성된 3개의 서버를 제외하고, 직접 생성된 서버 정보 확인
def test_server_list_v269_with_partial_constructs(self):
self.set_compute_api_version('2.69')
arglist = []
verifylist = []
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
mock_user = self.mock_users[0] # fake user
mock_project = self.mock_projects[0] # fake project
# include "partial results" from non-responsive part of
# infrastructure.
server_dict = {
"id": "server-id-95a56bfc4xxxxxx28d7e418bfd97813a",
"status": "UNKNOWN",
"tenant_id": "6f70656e737461636b20342065766572",
"project_id": mock_project.id, # pass mock project id
"user_id": mock_user.id, # pass mock user id
"created": "2018-12-03T21:06:18Z",
"links": [
{"href": "http://fake/v2.1/", "rel": "self"},
{"href": "http://fake", "rel": "bookmark"},
],
"networks": {},
}
fake_server = _server.Server(**server_dict)
self.servers.append(fake_server)
columns, data = self.cmd.take_action(parsed_args)
# get the first three servers out since our interest is in the partial
# server.
next(data)
next(data)
next(data)
partial_server = next(data)
expected_row = (
'server-id-95a56bfc4xxxxxx28d7e418bfd97813a', # ID
None, # Server Name
'UNKNOWN', # Status
mock_project.name, # Project Name
mock_user.name, # User Name
server.AddressesColumn(None), # Networks
'', # Image
'', # Flavor
)
self.assertEqual(expected_row, partial_server)
server_dict에project_id와user_id를 명시적으로 추가setUp에서 설정된 Identity API 모킹(mocking)이 동작하도록 함
- take_action의 결과에 mocking에서 반환된 project name과 user name 확인
