자동 테스트¶
코드를 수정하거나, 새 기능을 추가할 때 '테스트 실행'만 하면 모든 것이 잘 돌아가는지 테스트를 해야 한다.
자동 테스트로 모든 버그를 찾을 수는 없지만, 반복해서 입력하고 코드를 실행해 보는 시간은 줄여 줄 것이다.
1. 테스트 항목 작성¶
간단한 코드 토막과 간단한 테스트를 짜보자.¶
- 테스트는 프로젝트 틀로 만든 새 프로젝트를 바탕으로 만들어 보자.
- skeleton 디렉토리를 ex47로 복사하자.
- NAME을 ex47로 변경
- 모든 파일에 있는 NAME을 ex47로 변경
- 마지막으로 모든
*
.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)
assert_equal 은 중요한 함수이다.¶
이 함수는 변수나 Room에서 만든 경로가 정말로 생각한 대로 설정되어 있는지 확인한다.
틀린 결과가 나온다면 이유를 찾을 수 있도록 nosetests에서 오류 메시지를 출력해 준다.
2. 테스트 지침¶
테스트를 만들 때는 다음과 같은 일반적이고 느슨한 지침을 따르자.
테스트 파일의 네이밍
- 'something_tests.py'로 이름을 지어 tests/에 넣어야 한다.
- 이 방식대로 넣어야 nosetests에서 테스트를 실행한다.
모듈을 만들 때마다 테스트를 하나 만들자.
테스트 항목(함수)은 짧게 유지하며, 지저분하더라도 어쩔 수 없다. 테스트는 보통 지저분하다.
더러운 테스트 항목을 할 수 있는 한 깔끔하게 수정하고 반복되는 코드는 없애보자.
- 중복 코드를 지우려면
helper 함수
를 만들자.마지막으로 테스트에 너무 얽매이지 말자. 답이 없을 때는 리셋하고 재설계하는 것이 가장 좋은 방법이다.
최종적으로 아래 구조를 갖고 있어야 한다.¶
In [ ]:
$ nosetests