《测试驱动开发》中使用Python开发测试工具

最近在看《测试驱动开发 by example》,发现从测试开始进行设计与编码确实很有意思。

于是本人花了点时间,把第二部分xUnit中清单上的剩余条目全部补充实现了。

完整代码如下:

View Code
'''
Created on 2011-12-10

@author: Mnid
'''

class TestCase(object):
def __init__(self, name):
self.name= name

def setUp(self):
pass
def tearDown(self):
pass
def run(self, result):
result.testStarted()
try:
self.setUp()
except:
self.tearDown()
return None
try:
method = getattr(self, self.name)
method()
except:
result.testFailed()
self.tearDown()

def summary(self):
pass


def createSuite(self, name):
self.name = name
return TestSuite()



class WasRun(TestCase):
def __init__(self, name):
self.wasRun= None
TestCase.__init__(self, name)

def setUp(self):
self.wasRun= None
self.log = "setUp"

def testSetUp(self):
self.setUp()

def tearDown(self):
self.wasRun = None
self.log += " tearDown"

def testMethod(self):
self.wasRun= 1
self.log += " testMethod"

def testBrokenMethod(self):
raise Exception


class TestResult(TestCase):
def __init__(self):
self.runCount = 0
self.errorCount = 0
def testStarted(self):
self.runCount += 1
def testFailed(self):
self.errorCount += 1
def summary(self):
return "%d run, %d failed" %(self.runCount, self.errorCount)


class TestSuite(object):
def __init__(self):
self.tests = []

def add(self, test):
self.tests.append(test)

def run(self, result):
for test in self.tests:
test.run(result)


class TestFailedSetUp(TestCase):
def setUp(self):
self.log = "setUp"
raise Exception
def testRun(self):
self.log += "can't be here"
def tearDown(self):
self.log += " tearDown"

class TestFailedRun(TestCase):
def setUp(self):
self.log = "setUp"
def testRun(self):
self.log += " can be here"
raise Exception
def tearDown(self):
self.log += " tearDown"

class TestCaseTest(TestCase):
def setUp(self):
self.result = TestResult()

def testTemplateMethod(self):
test = WasRun("testMethod")
test.run(self.result)
assert("setUp testMethod tearDown" == test.log)

def testResult(self):
test = WasRun("testMethod")
test.run(self.result)
assert("1 run, 0 failed" == self.result.summary())

def testFailedResult(self):
test = WasRun("testBrokenMethod")
test.run(self.result)
assert("1 run, 1 failed" == self.result.summary())

def testSuite(self):
suite = TestSuite()
suite.add(WasRun("testMethod"))
suite.add(WasRun("testBrokenMethod"))
suite.run(self.result)
assert("2 run, 1 failed" == self.result.summary())

def testFailedResultFormatting(self):
self.result.testStarted()
self.result.testFailed()
assert("1 run, 1 failed" == self.result.summary())

def testFailedSetUp(self):
test = TestFailedSetUp("testRun")
test.run(self.result)
assert("setUp tearDown" == test.log)

def testTearDownFailedMethod(self):
test = TestFailedRun("testRun")
test.run(self.result)
assert("setUp can be here tearDown" == test.log)

def testCreateSuite(self):
suite = self.createSuite("One Test")
suite.add(WasRun("testMethod"))
suite.run(self.result)
assert("1 run, 0 failed" == self.result.summary())

suite = TestCase("TestCase").createSuite("Test For All")
suite.add(TestCaseTest("testTemplateMethod"))
suite.add(TestCaseTest("testResult"))
suite.add(TestCaseTest("testFailedResult"))
suite.add(TestCaseTest("testFailedResultFormatting"))
suite.add(TestCaseTest("testSuite"))
suite.add(TestCaseTest("testFailedSetUp"))
suite.add(TestCaseTest("testTearDownFailedMethod"))
suite.add(TestCaseTest("testCreateSuite"))
result = TestResult()
suite.run(result)
print(result.summary())

posted on 2011-12-14 18:26  Mnid  阅读(619)  评论(0编辑  收藏  举报