Python 단원 테스트 실례 상세 설명

이 글 의 실례 는 Python 단원 테스트 를 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
Python 에서 유닛 테스트 를 진행 하려 면 자동 유닛 테스트 프레임 워 크 PyUnit,Python 2.1 과 그 이후 버 전 은 PyUnit 을 표준 모듈(즉 python 의 unittest 모듈)로 사용 해 야 합 니 다.만약 당신 이 out 이 라면 PyUnit 사이트 에서 소스 코드 를 다운로드 하여 설치 해 야 사용 할 수 있 습 니 다.
1.Python 유닛 테스트 범례
테스트 의 가장 기본 적 인 원 리 는 예상 결과 가 실제 실행 결과 와 같 는 지,같 으 면 테스트 에 성공 하 는 지,그렇지 않 으 면 테스트 에 실패 하 는 지 비교 하 는 것 이다.자동 테스트 프레임 워 크 PyUnit 을 잘 이해 하기 위해 위 젯 클래스 에 대한 테스트 를 예 로 들 어 설명 합 니 다.

#widget.py
#       Widget
class Widget:
  def __init__(self, size = (40, 40)):
    self._size = size
  def getSize(self):
    return self._size
  def resize(self, width, height):
    if width < 0 or height < 0:
      raise ValueError, "illegal size"
    self._size = (width, height)
  def dispose(self):
    pass

2.테스트 사례 테스트 케이스
소프트웨어 테스트 에서 가장 기본 적 인 구성 단위 식 테스트 사례(test case),PyUnit 은 TestCase 류 를 사용 하여 테스트 사례 를 표시 하고 테스트 를 수행 하 는 모든 클래스 를 이 클래스 에서 계승 해 야 한다 고 요구 합 니 다.TestCase 하위 클래스 에서 실 현 된 테스트 코드 는 자체 적 으로 포 함 된(self contained)이 어야 합 니 다.즉,테스트 사례 는 단독으로 실행 할 수도 있 고 다른 테스트 사례 와 집합 하여 공동으로 실행 할 수도 있 습 니 다.TestCase 클래스 에서 자주 사용 하 는 함수 나 방법 은 다음 과 같 습 니 다.
setup:테스트 전 초기 화 작업 을 진행 합 니 다.
tearDown:테스트 를 실행 한 후 제거 합 니 다.
failed info:인쇄 정보 faliedinfo 가 설정 되 지 않 았 음 을 표시 합 니 다.선택 가능 한 매개 변수 입 니 다.
self.assertEqual(value 1,value 2,failed info):무조건 테스트 에 실패 할 수 있 으 므 로 추천 하지 않 습 니 다.
self.assertTrue(,failed info):단언 value 1==value 2.
self.assert False(,failed info):단언 value 가 진실 입 니 다.
self.assertRaises(ValueError,self.widget.resize,-1,-1):이상 이 발생 할 것 이 라 고 단언 합 니 다.이상 이 발생 하지 않 으 면 테스트 에 실 패 했 습 니 다.매개 변수 1 은 이상 이 고 매개 변수 2 는 이상 한 호출 대상 이 며 나머지 매개 변 수 는 호출 가능 한 대상 에 게 전달 되 는 매개 변수 입 니 다.
TestCase 는 PyUnit 테스트 프레임 워 크 에서 테스트 단원 의 운행 실체 로 간주 되 며,Python 프로 그 래머 는 이 를 통 해 사용자 정의 테스트 과정 과 방법(테스트 단원)을 파생 시 킬 수 있 으 며,Command 와 Composite 디자인 모델 을 이용 하여 여러 개의 TestCase 를 테스트 용례 집합 으로 조합 할 수 있다.PyUnit 테스트 프레임 워 크 가 테스트 용례 를 실행 할 때 TestCase 하위 클래스 가 정의 한setUp(),runTest(),tearDown()방법 이 순서대로 실행 되 고 가장 간단 한 테스트 용례 는 덮어 쓰기runTest()방법 으로 특정한 테스트 코드 를 실행 하면 된다.
1.정적 방법
하나의 테스트 사례 는 소프트웨어 모듈 의 한 방법 만 테스트 하고 runTest()방법 으로 테스트 사례 를 구성 합 니 다.이것 은 PyUnit 에서 정적 방법 이 라 고 부 릅 니 다.예 를 들 어 다음 과 같이 설명 합 니 다.

#static.py
from widget import Widget
import unittest
#      
class WidgetTestCase(unittest.TestCase):
  def runTest(self):
    widget = Widget()
    self.assertEqual(widget.getSize(), (40, 40))
#  
if __name__ == "__main__":
  testCase = WidgetTestCase()
  testCase.runTest()

정적 방법 을 사용 하면 Python 프로그래머 는 테스트 할 방법 마다 테스트 클래스 를 만들어 야 합 니 다.이 클래스 는 덮어 쓰기runTest()방법 으로 테스트 를 수행 하고 테스트 클래스 마다 테스트 대상 을 만 듭 니 다.그러면 매우 번 거 롭 고 서 툴 러 집 니 다.
2.동적 방법
정적 방법의 결함 을 감안 하여 PyUnit 은 또 다른 잘 생 긴 부자 의 해결 방법 을 제공 했다.즉,동적 방법 은 하나의 테스트 클래스 만 작성 하여 전체 소프트웨어 모듈 에 대한 테스트 를 완성 할 수 있다.이러한 대상 의 초기 화 작업 은setUp()방법 에서 이 루어 질 수 있 고 자원 의 방출 은tearDown()방법 에서 이 루어 질 수 있다.예 를 들 어 다음 과 같다.

#dynamic.py
from widget import Widget
import unittest
class WidgetTestCase(unittest.TestCase):
  def setUp(self):
    self.widget = Widget()
  def tearDown(self):
    self.widget.dispose()
    self.widget = None
  def testSize(self):
    self.assertEqual(self.widget.getSize(), (40, 40))
  def testResize(self):
    self.widget.resize(100, 100)
    self.assertEqual(self.widget.getSize(), (100, 100))

동적 방법 은 runTest()방법 을 덮어 쓰 지 않 고 테스트 클래스 를 위해 여러 개의 테스트 방법 을 작성 합 니 다.관례 에 따라 테스트 로 시작 하지만 이것 은 필수 적 인 것 이 아 닙 니 다.TestCase 하위 클래스 의 인 스 턴 스 를 만 들 때 테스트 방법의 이름 을 알려 야 합 니 다.PyUnit 테스트 프레임 워 크 는 이 테스트 사례 를 실행 할 때 테스트 클래스 의 어떤 방법 을 사용 해 야 하 는 지 알려 줍 니 다.이것 은 보통 테스트 용례 집 TestSuite 와 결합 하여 사용한다.
3.테스트 사례 집 TestSuite
완전한 단원 테스트 는 하나의 테스트 용례 만 실행 하 는 것 이 매우 적 습 니 다.개발 자 들 은 보통 여러 개의 테스트 용례 를 작성 해 야 특정한 소프트웨어 기능 에 대해 비교적 완 성 된 테스트 를 할 수 있 습 니 다.이러한 테스트 용례 는 하나의 테스트 용례 집 이 라 고 하 는데 PyUnit 에 서 는 TestSuite 류 로 표 시 됩 니 다.PyUinit 테스트 프레임 워 크 는 Python 프로그래머 가 유닛 테스트 코드 에서 suite()라 는 전역 함 수 를 정의 하고 전체 유닛 테스트 의 입구 로 사용 할 수 있 도록 합 니 다.PyUnit 은 이 를 호출 하여 전체 테스트 과정 을 완성 합 니 다.

def suite():
  suite = unittest.TestSuite()
  suite.addTest(WidgetTestCase("testSize"))
  suite.addTest(WidgetTestCase("testResize"))
  return suite
             TestSuite   ,        __init__            :
class WidgetTestSuite(unittest.TestSuite)
  def __init__(self):
    unittest.TestSuite.__init__(self, map(WidgetTestCase, ("testSize", "testResize")))
          suite()                :
def suite():
  return WidgetTestSuite()

PyUnit 테스트 프레임 워 크 에서 TestSuite 류 는 TestCase 류 의 용기 로 볼 수 있 으 며 여러 테스트 사례 를 조직 하 는 데 사용 된다.이렇게 여러 테스트 사례 는 자동 으로 한 번 의 테스트 에서 모두 완성 할 수 있다.사실 TestSuite 는 TestCase 를 포함 할 수 있 을 뿐만 아니 라 TestSuite 도 포함 할 수 있어 더욱 방대 한 테스트 용례 집 을 구성 할 수 있다.

suite1 = mysuite1.TheTestSuite()
suite2 = mysuite2.TheTestSuite()
alltests = unittest.TestSuite((suite1, suite2))

4.테스트 테스트 러 너 실시
테스트 용례(TestCase)를 작성 하고 테스트 용례 집(TestSuite)으로 구성 하 는 최종 목적 은 하나 입 니 다.테스트 를 실시 하고 최종 결 과 를 얻 는 것 입 니 다.PyUnit 은 TestRunner 류 를 테스트 사례 의 기본 실행 환경 으로 사용 하여 전체 단원 테스트 과정 을 구동 합 니 다.그러나 Python 개발 자 들 은 유닛 테스트 를 할 때 TestRunner 류 를 직접 사용 하지 않 고 하위 클래스 TextTestRunner 를 사용 하여 테스트 를 완성 하고 테스트 결 과 를 텍스트 로 표시 합 니 다.예 를 들 어 다음 과 같이 설명 한다.

#text_runner.py
from widget import Widget
import unittest
#      
class WidgetTestCase(unittest.TestCase):
  def setUp(self):
    self.widget = Widget()
  def tearDown(self):
    self.widget.dispose()
    self.widget = None
  def testSize(self):
    self.assertEqual(self.widget.getSize(), (40, 40))
  def testResize(self):
    self.widget.resize(100, 100)
    self.assertEqual(self.widget.getSize(), (100, 100))
#  
if __name__ == "__main__":
  #     
  suite = unittest.TestSuite()
  suite.addTest(WidgetTestCase("testSize"))
  suite.addTest(WidgetTestCase("testResize"))
  #    
  runner = unittest.TextTestRunner()
  runner.run(suite)

다음 명령 을 사용 하여 이 단원 테스트 를 실행 합 니 다:

$python text_runner.py


기본적으로 TextTestRunner 는 결 과 를 sys.stdout/sys.stderr 에 출력 하지만 TextTestRunner 클래스 인 스 턴 스 를 만 들 때 파일 대상 을 구조 함수 에 전달 하면 출력 결 과 는 이 파일 로 재 설정 합 니 다.
5.대로 에서 간 main()까지
PyUnit 모듈 에 서 는 main 이라는 전역 적 인 방법 을 정의 합 니 다.이 를 사용 하면 유닛 테스트 모듈 을 직접 실행 할 수 있 는 테스트 스 크 립 트 로 편리 하 게 만 들 수 있 습 니 다.main()방법 은 TestLoader 류 를 사용 하여 이 모듈 에 포 함 된 모든 테스트 방법 을 검색 하고 자동 으로 실행 합 니 다.Python 프로그래머 가 약속(test 로 시작)에 따라 모든 테스트 방법 을 명령 할 수 있다 면 테스트 모듈 의 마지막 에 다음 과 같은 몇 줄 의 코드 를 추가 하면 됩 니 다.

if __name__ == "__main__":
  unittest.main()

다음은 main()방법 을 이용 하여 테스트 를 진행 하 는 완전한 예 입 니 다.

#main_runner.py
from widget import Widget
import unittest
#      
class WidgetTestCase(unittest.TestCase):
  def setUp(self):
    self.widget = Widget()
  def tearDown(self):
    self.widget.dispose()
    self.widget = None
  def testSize(self):
    self.assertEqual(self.widget.getSize(), (40, 40))
  def testResize(self):
    self.widget.resize(100, 100)
    self.assertEqual(self.widget.getSize(), (100, 100))
#  
if __name__ == "__main__":
  unittest.main()

다음 명령 을 사용 하여 위의 단원 테스트 를 실행 합 니 다:

$python main_runner.py

위 와 같이 WidgetTestCase 의 모든 테스트 방법 을 실행 합 니 다.그러나 testSize()방법 만 실행 하려 면 다음 과 같 을 수 있 습 니 다.

$python main_runner.py WidgetTestCase.testSize

유닛 테스트 스 크 립 트 에서 TestSuite 를 정의 하면 실행 할 테스트 집합 을 지정 할 수 있 습 니 다.-h 인 자 를 사용 하면 이 스 크 립 트 를 실행 하 는 데 사용 할 수 있 는 모든 인 자 를 볼 수 있 습 니 다.

$python main_runner.py -h


주의해 야 할 것 은:PyUnit 의 TestCase 에 test 가 여러 개 있 으 면xxx 는 기본적으로 xxx 의 자모 순서에 따라 테스트 용례 함 수 를 실행 합 니 다.만약 testxxx 간 에 의존 관계 가 있 으 면 오류 가 발생 하고 해결 방법 은 2:1 이 며 결합 을 해제 합 니 다.2.xxx 함 수 를 작성 할 때 인위적으로 알파벳 순 으로 작성 합 니 다.
물론 Python 2.7.2 이상 버 전 을 설치 했다 면 discover 함 수 를 이용 하여 테스트 용례 를 자동 으로 발견 하고 실행 할 수 있 습 니 다.

$python2.7 -m unittest discover

Python 유닛 테스트 에 관 한 더 많은 자 료 는 참고 할 수 있 습 니 다여기,이곳,그리고여기,이곳.
더 많은 Python 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기