我想知道当我们运行 unittest.main()
时,Python 是如何知道 unittest.Testcase
有哪些子类的?
例如,如果我添加一个类 FromRomanBadInput(unittest.TestCase)
,unittest
怎么知道要运行这个?
最佳答案
所以我在我的 Python27/Lib
目录中查看了...
unittest.main
实际上是一个类的别名,unittest.TestProgram
。所以发生的事情是你构造了一个 this 的实例,它的 __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/