加载测试用例到suite中,有很多种方法,此次通过源码,分析通过TestSuite类中addTest()或者addTests()方法,将测试用例加载到suite中。
步骤
先实例化TestSuite:suite = unittest.TestSuite()
再通过addTest()或者addTests(), 添加测试用例到suite中
1. addTest()----添加单个测试用例
用法 : suite.addTest(类名(‘测试case名’))
def addTest(self, test):
# sanity checks
if not hasattr(test, '__call__'):
raise TypeError("{} is not callable".format(repr(test)))
if isinstance(test, type) and issubclass(test,
(case.TestCase, TestSuite)):
raise TypeError("TestCases and TestSuites must be instantiated "
"before passing them to addTest()")
self._tests.append(test)
分析
isinstance(test, type) #判断参数test是不是类
issubclass(test,(case.TestCase, TestSuite)) #判断参数是不是case.TestCase或者TestSuite的子类
如果test是个类,并且是case.TestCase或者TestSuite的子类,则会上报错误提示:在调用addTest()时,传入的参数必须是个实例化对象
对于unittest下的类、实例对象、与普通类、实例对象的,isinstance,issubclass用法。
import unittest
class Test():
def test_1(self):
print 11111
class Test2(unittest.TestCase):
def test_2(self):
print 222222
suite = unittest.TestSuite()
print type(unittest.TestSuite) #<type 'type'>
print type(suite) #<class 'unittest.suite.TestSuite'>
test=Test()
print type(test) #<type 'instance'>
print type(Test) #<type 'classobj'>
总结:如果传入的参数是个测试用例类的实例化对象,(即:类名(‘测试case名’) ),append 到self._tests中。
如果通过loadTestsFromModule() ->…->再调用到addTest(),则最开始传入实参case的可能个TestSuite的实例化对象。type(test) # <class ‘unittest.suite.TestSuite’> ,不过通过递归调用,最终传入的参数是测试用例类实例化对象。 type(test) # <class ‘main.ModuleTest2’>
2. addTests()----添加多个测试用例
用法:suite.addTests(cases) ,其中cases是个list ,tuple,set。
如果cases是个list, cases = [类名1(‘测试case名1’), 类名1(‘测试case名1’), 类名1(‘测试case名1’)]
eg: cases=[demo_fortest(‘test1’),demo_fortest(‘test2’),…demo_fortest(‘test3’)]
源码
def addTests(self, tests):
if isinstance(tests, basestring):
raise TypeError("tests must be an iterable of tests, not a string")
for test in tests:
self.addTest(test)
分析:
对传入的实参cases,通过for循环遍历,依次调用addTest() 方法,将测试用例 一 一 append到self._tests列表中。
if isinstance(tests, basestring):
raise TypeError("tests must be an iterable of tests, not a string")
isinstance()方法,告诉了我们,传入的实参必须是个可迭代对象,不应该为字符串。