~cpp
import unittest
class DefaultWidgetSizeTestCase(unittest.TestCase):
def runTest(self):
widget = Widget("The widget")
assert widget.size() == (50,50), 'incorrect default size'
테스팅을 하기 위해 Python의 assert 구문을 사용한다. testcase가 실행될 때 assertion을 실행하면 AssertionError 가 일어나고, testing framework는 이 testcase를 'failure' 했다고 정의할 것이다. 'assert' 를 명시적으로 써놓지 않은 부분에서의 예외가 발생한 것들은 testing framework 에서는 'errors'로 간주한다.~cpp testCase = DefaultWidgetSizeTestCase ()
~cpp
import unittest
class SimpleWidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget("The widget")
class DefaultWidgetSizeTestCase(SimpleWidgetTestCase):
def runTest(self):
assert self.widget.size() == (50,50), 'incorrect default size'
class WidgetResizeTestCase(SimpleWidgetTestCase):
def runTest(self):
self.widget.resize(100,150)
assert self.widget.size() == (100,150), \
'wrong size after resize'
~cpp
import unittest
class SimpleWidgetTestCase (unittest.TestCase):
def setUp (self):
self.widget = Widget ("The widget")
def tearDown (self):
self.widget.dispose ()
self.widget = None
만일 setUp 메소드 실행이 성공되면, tearDown 메소드는 runTest가 성공하건 안하건 상관없이 호출될 것이다.~cpp
import unittest
class WidgetTestCase (unittest.TestCase):
def setUp (self):
self.widget = Widget ("The widget")
def tearDown (self):
self.widget.dispose ()
self.widget = None
def testDefaultSize (self):
assert self.widget.size() == (50,50), 'incorrect default size'
def testResize (self):
self.widget.resize (100,150)
assert self.wdiget.size() == (100,150), 'wrong size after resize'
여기에는 runTest 메소드가 없는대신, 두개의 다른 test 메소드를 가지고 있다. 클래스 인스턴스는 이제 각각 self.widget 을 생헝하고 각 인스턴스에 대해 따로 소멸되면서 각각의 test method를 실행한다.~cpp
defaultSizeTestCase = WidgetTestCase ("testDefaultSize")
resizeTestCase = WidgetTestCase ("testResize")
~cpp
widgetTestSuite = unittest.TestSuite ()
widgetTestSuite.addTest (WidgetTestCase ("testDefaultSize"))
widgetTestSuite.addTest (WidgetTestCase ("testResize"))
~cpp
def suite ():
suite = unittest.TestSuite ()
suite.addTest (WidgetTestCase ("testDefaultSize"))
suite.addTest (WidgetTestCase ("testResize"))
return suite
또는~cpp class WidgetTestSuite (unittest.TestSuite): def __init__(self): unittest.TestSuite.__init__(self, map(WdigetTestCase, "testDefaultSize", "testResize")))unittest 모듈에는 makeSuite 라는 편리한 함수가 있다. 이 함수는 test case class 안의 모든 test case를 포함하는 test suite를 만들어준다. (와우!!)
~cpp suite = unittest.makeSuite (WidgetTestCase, 'test')makeSuite 함수를 사용할때 testcase들은 cmp 함수를 사용하여 소트한 순서되로 실행된다.
~cpp runner = unittest.TextTestRunner () runner.run (widget.TestSuite)기본적으로 TextTestRunner는 sys.stderr에 출력한다. TextTestrunner 같은 클래스는 Python interpreter session과 상호작용하면서 test들을 실행시켜볼 수 있는 이상적인 방법이다.
~cpp def runTest(self): self.assert_(self.widget.size() == (100,100), "size is wrong")
~cpp
def runTest(self):
...
if not hasattr(something, "blah"):
self.fail("blah missing")
# or just 'self.fail()'
~cpp def testSomething(self): self.widget.resize(100,100) self.assertEqual(self.widget.size, (100,100))