Pyunit源码笔记之五 开始执行testsuit的run及迭代

来源:互联网 发布:jquery.dialog.js 编辑:程序博客网 时间:2024/06/16 12:57

在runner.py的 def run(self, test):

startTestRun()是所有testsuite执行之前的,目前没具体操作内容。

    def run(self, test):        ........        with warnings.catch_warnings():            if self.warnings:                ........               .........            startTime = time.time()            startTestRun = getattr(result, 'startTestRun', None)            if startTestRun is not None:                startTestRun()            try:                test(result)            finally:                stopTestRun = getattr(result, 'stopTestRun', None)                if stopTestRun is not None:                    stopTestRun()            stopTime = time.time()
test(result)的 test是testsuit, 执行suite.py中的__call__(self, *args, **kwds)

def __call__(self, *args, **kwds):        return self.run(*args, **kwds)

接着执行run(self, result, debug=False),

_isnotsuite(test)判断是否不为 testsuite, 如果是suite,中

    def run(self, result, debug=False):        topLevel = False        if getattr(result, '_testRunEntered', False) is False:            result._testRunEntered = topLevel = True        for index, test in enumerate(self):            if result.shouldStop:                break            if _isnotsuite(test):                self._tearDownPreviousClass(test, result)                self._handleModuleFixture(test, result)                self._handleClassSetUp(test, result)                result._previousTestClass = test.__class__                if (getattr(test.__class__, '_classSetupFailed', False) or                    getattr(result, '_moduleSetUpFailed', False)):                    continue            if not debug:                test(result)            else:                test.debug()            if self._cleanup:                self._removeTestAtIndex(index)        if topLevel:            self._tearDownPreviousClass(None, result)            self._handleModuleTearDown(result)            result._testRunEntered = False        return result

for index, test in enumerate(self)第一次,test是testsuite,

<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<__main__.MyTest testMethod=testmul>, <__main__.MyTest testMethod=testsum>]>]>

到下面的test(result)时,递归继续调用这个run(),

提一下:_isnotsuite(test)判断是否不为 testsuite, 如果是suite,就忽略。

for index, test in enumerate(self)第二次,test还是testsuite, 再次递归。

<unittest.suite.TestSuite tests=[<__main__.MyTest testMethod=testmul>, <__main__.MyTest testMethod=testsum>]>

for index, test in enumerate(self)第三次,test就是testcase:、

testmul (__main__.MyTest)
testsum (__main__.MyTest)


阅读全文
1 0