Unittest源码分析系列-----(三)addTest()/addTests()分析

加载测试用例到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()方法,告诉了我们,传入的实参必须是个可迭代对象,不应该为字符串。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值