19 Sep 2017 » python

2017-09-19-python_1

자동 테스트

코드를 수정하거나, 새 기능을 추가할 때 '테스트 실행'만 하면 모든 것이 잘 돌아가는지 테스트를 해야 한다.

자동 테스트로 모든 버그를 찾을 수는 없지만, 반복해서 입력하고 코드를 실행해 보는 시간은 줄여 줄 것이다.

1. 테스트 항목 작성

간단한 코드 토막과 간단한 테스트를 짜보자.

  • 테스트는 프로젝트 틀로 만든 새 프로젝트를 바탕으로 만들어 보자.
  1. skeleton 디렉토리를 ex47로 복사하자.
  2. NAME을 ex47로 변경
  3. 모든 파일에 있는 NAME을 ex47로 변경
  4. 마지막으로 모든 *.pyc 파일을 지워 깔끔하게 만들자.

다음으로 ex47/game.py 를 만들자.

ex47 디렉토리 안에 위치하도록 해야한다.

In [ ]:
class Room(object):
    
    def __init__(self, name, description):
        self.name = name
        self.description = description
        self.paths = {}

    def go(self, direction):
        return self.paths.get(direction, None)

    def add_paths(self, paths):
        self.paths.update(paths)

ex47_test.py 파일도 만들어보자.

In [ ]:
# -*- coding: utf-8 -*-

from nose.tools import *
from ex47.game import Room

def test_room():
    gold = Room("GoldRoom",
        """이 방에는 주워 담을 수 있는 금이 있습니다. 북쪽에는 문이 있습니다.""")
    assert_equal(gold.name, "GoldRoom")
    assert_equal(gold.paths, {})

def test_room_paths():
    center = Room("Center", "가운데의 테스트 방")
    north = Room("North", "북쪽의 테스트 방")
    south = Room("South", "남쪽의 테스트 방")

    center.add_paths({'north': north, 'south': south})
    assert_equal(center.go('north'), north)
    assert_equal(center.go('south'), south)

def test_map():
    start = Room("Start", "서쪽(west)이나 구멍 아래(down)로 갈 수 있습니다.")
    west = Room("Trees", "나무가 있습니다. 동쪽(east)으로 갈 수 있습니다.")
    down = Room("Dungeon", "아래는 어둡습니다. 위(up)로 갈 수 있습니다.")

    start.add_paths({'west': west, 'down': down})
    west.add_paths({'east': start})
    down.add_paths({'up': start})

    assert_equal(start.go('west'), west)
    assert_equal(start.go('west').go('east'), start)
    assert_equal(start.go('down').go('up'), start)

ex48.game 모듈에서 Room 클래스를 가져와서 테스트하는 파일이다.

이름이 test_로 시작하는 테스트 함수가 몇 개가 있다.

각 테스트 항목에는 방을 만들고 의도대로 작동하는지 체크하는 코드도 있다.

각 항목은 기초적인 방의 기능, 경로, 전체 지도를 순서대로 테스트한다.

assert_equal 은 중요한 함수이다.

이 함수는 변수나 Room에서 만든 경로가 정말로 생각한 대로 설정되어 있는지 확인한다.

틀린 결과가 나온다면 이유를 찾을 수 있도록 nosetests에서 오류 메시지를 출력해 준다.

2. 테스트 지침

테스트를 만들 때는 다음과 같은 일반적이고 느슨한 지침을 따르자.

  1. 테스트 파일의 네이밍

    • 'something_tests.py'로 이름을 지어 tests/에 넣어야 한다.
    • 이 방식대로 넣어야 nosetests에서 테스트를 실행한다.
  2. 모듈을 만들 때마다 테스트를 하나 만들자.

  3. 테스트 항목(함수)은 짧게 유지하며, 지저분하더라도 어쩔 수 없다. 테스트는 보통 지저분하다.

  4. 더러운 테스트 항목을 할 수 있는 한 깔끔하게 수정하고 반복되는 코드는 없애보자.

    • 중복 코드를 지우려면 helper 함수를 만들자.
  5. 마지막으로 테스트에 너무 얽매이지 말자. 답이 없을 때는 리셋하고 재설계하는 것이 가장 좋은 방법이다.

최종적으로 아래 구조를 갖고 있어야 한다.

In [ ]:
$ nosetests

테스트 코드 실행 후 결과는 아래와 같다.


Reference

  • 깐깐하게 배우는 파이썬


Related Posts