python - Python 的 unittest 模块如何检测测试用例?

标签 python unit-testing

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

相关文章:

python - n 函数的乘法

java - 使用 robolectric get Resources$NotFoundException 运行单元测试

java - 为单元测试创​​建对象 MockHttpServletResponse 时出错

javascript - 如何监视原生 JavaScript 函数?比如.find()?

python - 尝试使用 str.contains 和 boolean 掩码,但仅针对 Pandas 中的两个单值实例

python matplotlib 增加条形标签字体大小

python - 使用 Python 从 Plotly 获取 &lt;script&gt; 和 <div> 标签

php - 是否可以对程序(非 oo)函数使用模拟?

python - 从 matplotlib `ax` 对象中提取刻度参数

python - 多级列和行索引和乘法