如果想要运行某个测试用例类的所有测试用例,可通过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对象。