3주차 과제 - 이진용

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_clientprojects.getusers.get 호출 시, 사전에 정의된 모의 객체를 반환하도록 설정
  • take_action에서 identity_client.projects.get(project_id) 실행시에, 모킹 수행

Unit test 수정

TestServerList, TestServerListV273테스트 클래스를 수정

  1. 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과 동일하게 변경

  1. 각 테스트 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 해서 가져온 결과가 같은지 확인

  1. 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_dictproject_iduser_id를 명시적으로 추가
    • setUp에서 설정된 Identity API 모킹(mocking)이 동작하도록 함
  • take_action의 결과에 mocking에서 반환된 project name과 user name 확인

2. 테스트 결과