Unittest源码分析系列-----(四)loadTestsFromTestCase()

如果想要运行某个测试用例类的所有测试用例,可通过TestLoader类中的loadTestsFromTestCase()。

用法:loadTestsFromTestCase(类名)

源码:

def loadTestsFromTestCase(self, testCaseClass):
    """Return a suite of all test cases contained in testCaseClass"""
    if issubclass(testCaseClass, suite.TestSuite):
        raise TypeError("Test cases should not be derived from TestSuite." \
                            " Maybe you meant to derive from TestCase?")
    testCaseNames = self.getTestCaseNames(testCaseClass)
    if not testCaseNames and hasattr(testCaseClass, 'runTest'):
        testCaseNames = ['runTest']
    loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))
    return loaded_suite

代码分析1:

if issubclass(testCaseClass, suite.TestSuite):
    raise TypeError("Test cases should not be derived from TestSuite." \
                        " Maybe you meant to derive from TestCase?")

issubclass()方法:判断传入的参数testCaseClass 是不是unittest.TestSuite类的子类,如果是,则提示传入的参数类型上有错误。。。
正确传入的应该是测试用例类

代码分析2:

testCaseNames = self.getTestCaseNames(testCaseClass)

调用getTestCaseNames(),该方法,主要功能就是筛选出测试用例,以一个list的形式返回。

def getTestCaseNames(self, testCaseClass):
    """Return a sorted sequence of method names found within testCaseClass
    """
    def isTestMethod(attrname, testCaseClass=testCaseClass,
                        prefix=self.testMethodPrefix):
        return attrname.startswith(prefix) and \
            hasattr(getattr(testCaseClass, attrname), '__call__')
    testFnNames = filter(isTestMethod, dir(testCaseClass))
    if self.sortTestMethodsUsing:
        testFnNames.sort(key=_CmpToKey(self.sortTestMethodsUsing))
    return testFnNames

filter(isTestMethod, dir(testCaseClass)) :将测试用例类中所有属性和方法,作为参数传入到,isTestMethod方法中,筛选出符合isTestMethod的测试用例方法,得到一个list。
isTestMethod方法,就是筛选出以test开头测试用例。
testFnNames.sort(key=_CmpToKey(self.sortTestMethodsUsing)) 负责测试用例以一个什么样的顺序执行的?通过ASCII码,这段的代码分析

self.sortTestMethodsUsing = cmp 
testFnNames.sort(key=_CmpToKey(self.sortTestMethodsUsing)) 
->通过源码,from functools import cmp_to_key as_CmpToKey
testFnNames.sort(key = cmp_to_key(cmp)) ,testFnNames是个list,里面的元素是测试用例类中的test测试用例
cmp_to_key(cmp)这函数的功能是啥,有待分析,后续填坑

代码分析3:

if not testCaseNames and hasattr(testCaseClass, 'runTest'):
     testCaseNames = ['runTest']

判断testCaseNames 有没有值 和对象testCaseClass有没有’runTest’这个属性或者方法

代码分析4:

 loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))
 分析:suiteClass = suite.TestSuite
 loaded_suite = suite.TestSuite(map(testCaseClass, testCaseNames))

通过map() ,将测试用例类与测试用例映射,并实例化成为一个suite对象

总结:
loadTestsFromTestCase(testCaseClass) 就是将测试用例类与测试用例对应起来,返回一个测试套件suite对象。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值