我想知道我们何时运行unittest.main()
,Python如何知道unittest.Testcase
的子类?
例如,如果我添加一个FromRomanBadInput(unittest.TestCase)
类,unittest
如何知道要运行它?
最佳答案
所以我环顾了我的Python27/Lib
目录...unittest.main
实际上是类unittest.TestProgram
的别名。因此,发生了什么事,您构造了一个实例,并运行了它的__init__
,进行了大量的检查和配置,包括动态导入您从其调用的模块(它使用__import__
函数,并以__main__
作为名称。默认情况下要导入的模块的数量)。因此,现在它具有self.module
属性,该属性包含一个表示源的模块对象。
最终,它到达了以下代码:
self.test = self.testLoader.loadTestsFromModule(self.module)
其中
self.testLoader
是unittest.TestLoader
的实例。该方法包含以下内容: for name in dir(module):
obj = getattr(module, name)
if isinstance(obj, type) and issubclass(obj, case.TestCase):
tests.append(self.loadTestsFromTestCase(obj))
因此,它使用模块对象的
dir
来获取您定义的所有全局变量的名称(包括类),将其过滤为仅从unittest.TestCase
派生的类(在本地,case.TestCase
是其别名),然后查找这些类中的测试方法以添加到tests
列表中。该搜索的行为类似: def isTestMethod(attrname, testCaseClass=testCaseClass,
prefix=self.testMethodPrefix):
return attrname.startswith(prefix) and \
hasattr(getattr(testCaseClass, attrname), '__call__')
testFnNames = filter(isTestMethod, dir(testCaseClass))
因此它使用该类的
dir
获取要尝试的名称列表,查找具有这些名称的属性,并选择以self.testMethodPrefix
(默认为'test'
)开头且可调用的属性(依次具有__call__
属性) )。 (我很惊讶他们没有在这里使用内置的callable
函数。我想这是为了避免选择嵌套的类。)关于python - Python的unittest模块如何检测测试用例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10099491/