我想知道我们何时运行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.testLoaderunittest.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/

10-12 23:24