# -*- test-case-name: twisted.test.test_trial -*-
#
# Twisted, the Framework of Your Internet
# Copyright (C) 2001-2003 Matthew W. Lefkowitz
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of version 2.1 of the GNU Lesser General Public
# License as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
import types
from twisted.python import components, reflect, log, context
class ITestRunner(components.Interface):
def getTestClass(self):
pass
def getMethods(self):
pass
def numTests(self):
pass
def runTest(self, method):
pass
def runTests(self, output):
pass
class SingletonRunner:
__implements__ = (ITestRunner,)
def __init__(self, methodName):
if type(methodName) is types.StringType:
self.testClass = reflect.namedObject('.'.join(methodName.split('.')[:-1]))
self.methodName = methodName.split('.')[-1]
else:
self.testClass = methodName.im_class
self.methodName = methodName.__name__
def __str__(self):
return "%s.%s.%s" % (self.testClass.__module__, self.testClass.__name__,
self.methodName)
def getMethods(self):
return [ self.methodName ]
def numTests(self):
return 1
def runTest(self, method):
assert method.__name__ == self.methodName
method()
def runTests(self, output):
testCase = self.testClass()
testCase.setUpClass()
method = getattr(testCase, self.methodName)
output.reportStart(self.testClass, method)
tester = unittest.Tester(self.testClass, testCase, method, self.runTest)
results = tester.run()
output.reportResults(self.testClass, method, *results)
testCase.tearDownClass()
class TestClassRunner:
__implements__ = (ITestRunner,)
methodPrefixes = ('test',)
def __init__(self, testClass, stats=None):
self.testClass = testClass
self.methodNames = []
for prefix in self.methodPrefixes:
self.methodNames.extend([ "%s%s" % (prefix, name) for name in
reflect.prefixedMethodNames(testClass, prefix)])
# N.B.: --random will shuffle testClasses but not our methodNames[]
self.methodNames.sort()
if stats is not None:
self.stats = stats
def __str__(self):
return "%s.%s" % (self.testClass.__module__, self.testClass.__name__)
def getTestClass(self):
return self.testClass
def getMethods(self):
return self.methodNames
def numTests(self):
return len(self.methodNames)
def runTest(self, method):
assert method.__name__ in self.methodNames, "Method %s is not a test method!" % (method.__name__,)
method()
def runTests(self, output):
self.testCase = self.testClass()
self.testCase._resultReporter_ = output
self.testCase.setUpClass()
for methodName in self.methodNames:
log.msg("--> %s.%s <--" % (self.testCase.__class__, methodName))
method = getattr(self.testCase, methodName)
output.reportStart(self.testClass, method)
results = unittest.Tester(self.testClass, self.testCase,
method, self.runTest).run()
output.reportResults(self.testClass, method, *results)
self.testCase.tearDownClass()
def runTest(method):
# utility function, used by test_trial to more closely emulate the usual
# testing process. This matches the same check in util.extract_tb that
# matches SingletonRunner.runTest and TestClassRunner.runTest .
method()
class PerformanceTestClassRunner(TestClassRunner):
methodPrefixes = ('benchmark',)
def runTest(self, method):
assert method.__name__ in self.methodNames
fullName = "%s.%s" % (method.im_class, method.im_func.__name__)
method.im_self.recordStat = lambda datum: self.stats.__setitem__(fullName,datum)
method()
class PerformanceSingletonRunner(SingletonRunner):
def __init__(self, methodName, stats):
SingletonRunner.__init__(self, methodName)
self.stats = stats
def runTest(self, method):
assert method.__name__ == self.methodName
fullName = "%s.%s" % (method.im_class, method.im_func.__name__)
method.im_self.recordStat = lambda datum: self.stats.__setitem__(fullName, datum)
method()
import unittest
syntax highlighted by Code2HTML, v. 0.9.1