Python Unitest 源码阅读:概述
来源:互联网 发布:手机建筑图纸软件 编辑:程序博客网 时间:2024/06/08 13:24
最近学习python 的单元测试,好奇之下阅读了一下unittest模块的源码。稍作记录作为梳理,帮助自己加深理解和回忆
一,用法
unittest模块的用法很简单,定义个 TestCase的子类,然后根据需要重载Setup()和TearDown()两个方法。并且在类中定义一些测试用例条目的“方法” ,以test开头命名即可
例如,下面这一段代码(来自:http://blog.chinaunix.net/uid-22334392-id-3887031.html,也是我第一次用unittest参考的博文)
import kkimport unittestclass ProductTestCase(unittest.TestCase): def setUp(self): print 'units test begin'+'#'*20 def tearDown(self): print 'unittest end'+'#'*20 def testxx(self): print 'this is just test' def testIntegerProduct(self): for x in xrange(-10,10): for y in xrange(-10,10): p = kk.product(x,y) self.failUnless(p == x*y,'integer multiplication failture') def testFractalProduct(self): for x in xrange(-10,10): for y in xrange(-10,10): x = x/10.0 y = y/10.0 p = kk.product(x,y) self.failUnless(p == x*y,'fractal multiplication failture')if __name__ == '__main__': unittest.main()其中kk为被测模块
注意到代码中的testIntegerProduct(self) 及 testFractalProduct(self) 两个以test开头命名的方法即是测试用例条目,整个类为TestCase的子类,unittest通过这两个信息(红色标注部分)来识别测试用例和用例下的条目。
通过调用unitest.main()方法来启动单元测试。
二.unittest 模块流程概述
首先明确unittest中对测试用例的封装,即TestSuit 是 TestCase类的一个“集合”:
源码中作者对TestSuit的注释:
class TestSuite(object): """A test suite is a composite test consisting of a number of TestCases. For use, create an instance of TestSuite, then add test case instances. When all tests have been added, the suite can be passed to a test runner, such as TextTestRunner. It will run the individual test cases in the order in which they were added, aggregating the results. When subclassing, do not forget to call the base class constructor. """往TestSuit内增加TestCase的代码片段为:
def addTest(self, test): # sanity checks if not hasattr(test, '__call__'): raise TypeError("the test to add must be callable") if isinstance(test, type) and issubclass(test, (TestCase, TestSuite)): raise TypeError("TestCases and TestSuites must be instantiated " "before passing them to addTest()") self._tests.append(test) def addTests(self, tests): if isinstance(tests, str): raise TypeError("tests must be an iterable of tests, not a string") for test in tests: self.addTest(test)
其中形参test 是TestCase的实例。
明确这一点后,unittest的大体流程其实是比较好理解的:
1.调用unittest.main()
调用unittest中的main方法其实是创建TestProgram类的实例
main = TestProgram############################################################################### Executing this module from the command line##############################################################################if __name__ == "__main__": main(module=None)TestProgram类“实施”了unittest的全部流程(创建测试用例,执行测试用例,输出结果):
2.解析参数和构造TestSuit
unittest支持命令行参数,TestProgram通过调用parseArgs()方法完成参数的解析
并且根据传入参数来对TestSuit进行构建,传递的参数可以包含到具体的测试用例或测试条目 例如支持这样的命令:python Myunittest.py Mytestcase.testsomething 等
所以paresArgs()方法会根据不同的参数调用不同的加载测试用例的方法:有loadTestFromMoudle() 、loadTestFromName()、loadTestFromCase()等,这些方法都属于TestLoader类。
需要提前知道的是,这些Load测试用例的方法返回的都是TestSuit类。
def parseArgs(self, argv): import getopt long_opts = ['help','verbose','quiet'] try: options, args = getopt.getopt(argv[1:], 'hHvq', long_opts) for opt, value in options: if opt in ('-h','-H','--help'): self.usageExit() if opt in ('-q','--quiet'): self.verbosity = 0 if opt in ('-v','--verbose'): self.verbosity = 2 if len(args) == 0 and self.defaultTest is None: self.test = self.testLoader.loadTestsFromModule(self.module)# 通过调用loadTestFromModule加载测试用例 return if len(args) > 0: self.testNames = args else: self.testNames = (self.defaultTest,) self.createTests()#若指定测试用例参数,则执行createTest(),即调用loadTestFromName except getopt.error as msg: self.usageExit(msg) def createTests(self): self.test = self.testLoader.loadTestsFromNames(self.testNames, self.module)
def runTests(self): if isinstance(self.testRunner, type): try: testRunner = self.testRunner(verbosity=self.verbosity) except TypeError: # didn't accept the verbosity argument testRunner = self.testRunner() else: # it is assumed to be a TestRunner instance testRunner = self.testRunner self.result = testRunner.run(self.test) if self.exit: sys.exit(not self.result.wasSuccessful())
随后将分为“加载测试用例” “执行测试用例”记录对unittest的理解
0 0
- Python Unitest 源码阅读:概述
- python unitest 的使用
- Python unitest 的使用
- PYTHON unitest模块
- python之Unitest框架
- Log4j源码阅读- 0 概述
- Spring 源码阅读-Spring概述
- Python代码测试 - unitest\doctest\nose
- Python 源码阅读:对象
- caffe源码阅读5-各种layer概述
- 基于python unitest架构的接口自动化监控
- python利用unitest生成的报告如何输出为html
- Struts2源码阅读(一)_Struts2框架流程概述
- Struts2源码阅读(一)_Struts2框架流程概述
- Struts2源码阅读(一)_Struts2框架流程概述
- Struts2源码阅读(一)_Struts2框架流程概述 .
- Struts2源码阅读(一)_Struts2框架流程概述
- Struts2源码阅读(一)_Struts2框架流程概述
- nyoj 525 一道水题【字符串(分割)】
- OptionMenu和ContextMenu使用介绍
- SQL配置文件实例 Sql_Map.xml
- SQL Server 查询数据库中所有的表名及行数
- JNI编程指南-第四章 字段和方法
- Python Unitest 源码阅读:概述
- voltDB 查询语句解析过程 初步分析
- sql语句中where、group by、having、order by 是否可以使用别名
- 关于C++中的显示调用explicit
- mysql常用语句
- leetcode Linked List Cycle II
- Android Fragment嵌套
- Selenium 使用方法小结
- iOS thread1:exc_bad)access(code=exc_1386_gpflt) 调试方案