3주차 과제 - 권순석

구현 과정

server.py > ListServer > take_action > ListServer 함수 내부에서 구현했던 과제2 코드 일부 변경하기

  • projects.list() users.list() 를 사용하고 있었으나, 이 함수들을 활용한 반복문으로 인해 테스트 과정에서 오류가 발생하였습니다.

  • 따라서 하단 data에 추가 정보를 삽입하는 부분에서 바로 user_idproject_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-projectsarglist 값으로 받습니다.

    • 이와 함께 verifylist 도 구성하는데, 현재 테스트는 --all-projects=True 이고, 나머지 옵션들은 False인 상태를 기대하기 때문에, 테스트를 위한 값을 설정합니다.

    • check_parser 함수를 통해 해당 인자들이 올바르게 전달되어 실제 인자와 매칭되는지 확인하고, 테스트를 통과하면 그 값들을 parsed_args에 저장합니다.

  • 이후 take_action(parsed_args) 함수에서 위 인자값들을 넣었을때, 관련 함수 구현이 실제로 올바르게 동작하는지 테스트하고, 그 결과값을 받아 columns data에 저장합니다.

  • 다음으로는 기본 출력값에 존재하는 image flavor 정보를 체크하기 위해, 필요한 클라이언트를 호출합니다.

  • 이후 컬럼 기대값 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))
# ----

  • 위에서 분석했던 코드와 동일한 구조로 datatuple 값을 생성하여 넣어줍니다.

    • 이 때, 추가할 값인 user_name project_name은 과제2와 동일하게 추가합니다
  • arglist verifylist를 테스트할 수 있도록 구성합니다.

  • assertEqual 테스트 부분에서 사전 작성한 columns_assignment2 값을 사용하여 테스트합니다.

테스트 결과 확인하기

1개의 좋아요