python unittest是怎样运行测试的
2019-12-30 本文已影响0人
假程序员
import unittest
import unittest.suite as suite
import unittest.loader as loader
import unittest.runner as runner
class MyTest(unittest.TestCase):
def test_001(self):
print(id(self))
def test_002(self):
print(id(self))
if __name__ == '__main__':
suite = suite.TestSuite() # create Test Suite
tests = loader.TestLoader().loadTestsFromTestCase(MyTest) # get tests from Test Class
suite.addTests(tests) # add tests to Test Suite
runner.TextTestRunner().run(suite) # run Test Suite by TextTestRunner
上述代码是一个自己创建testsuite,并运行testsuite中test的demo。

根据运行结果截图,可以发现,test_001和test_002中的self不是同一个,即两个测试方法对应两个不同的实例。

第56行代码就是产生该结果的代码,map函数则根据测试方法的名称来创建一个个的测试实例,在本段代码中,实际是将testCaseNames中的方法名一个个取出来,然后MyTest(testMethod),而MyTest的初始化方法是使用的unittest.TestCase的初始化方法。

到此,如何产生测试实例已完全清晰。

该run方法对应着demo中的最后一行代码。test(result)不太直观,可以修改成suite(result),这样就比较直观了。suite对应着suite.TestSuite()。
TestSuite中没有找到能提供这种用法的方法,找TestSuite的super类 BaseTestSuite,果然在其中找到了call方法

在call方法中,通过self.run(*args, **kwds),从而将测试交给了run方法执行。run方法中"for test in self"也比较有趣,BaseTestSuite实现了iter,所以可以通过迭代的方式访问。接着执行"test(result)",这对应着testMethod(result) (一个示例:test_001(result)),这也意味着,unittest.TestCase中应该存在call方法

到此,unittest如何执行测试也已清晰。