DevOps
development, debugging, profiling
typing
用于类型提示,提供类型检查,代码可读性和编辑器自动补全支持。
基础类型:
Tuple[int, int], Tuple[int, ...]
List[str]
Dict[str, int]
Set[str]
Optional[int]
Union[int, str, float]
泛型
TypeVar
Generic
函数签名
Callable
类相关
Type
Protocol
高级类型
Linteral
Final
Annotated
pydoc
import pydoc
test
import test
doctest
python内置的文档测试库.
import doctest
unittest
python内置的单元测试库.
import unittest
Debugging and Profiling
bdb
pdb
timeit
trace
TPL
相关的第三方库
unittest2
unittest2是unittest的升级版.
python3集成了unittest2到unittest,像使用unittest一样使用即可.
# python2.7
$pip install unittest2
import unittest2
# python3
import unittest
unittest也叫pyunit,类似于Junit(java)都是基于Kent Beck和Erich Gamma的XUnit框架.
测试结果:
OK 表示测试通过
FAIL 表示测试没有通过,并引发一个AssertionError异常.
ERROR 表示测试过程引发一个不是AssertionError的异常.
# Python2.7 此处用的是标准库的unittest.
import unittest
import MyClass
classes:
unittest.TestCase: 每个实例就是一个test case. 使用TestCase.assert* 系列方法进行测试.
unittest.TestSuite: 每个实例就是一个test suite. 多个test case放在一起就是一个test suite.
unittest.TestLoader/unittest.defaultTestLoader: 用来加载TestCase到TestSuite.
unittest.TestResult: 用来保存测试的结果.
unittest.TestProgram/unittest.main(): 搜索该模块下所有test开头的测试用例方法并执行.
fixtures对一个测试用例的环境的搭建和销毁,通过重载TestCase的setUp()和teaeDown()方法.
unittest.TextTestRunner: 用来执行测试用例.
unittest.TextTestResult: 用来打印格式化的测试结果.
# unittest.TestCase
# methods:
assertXXX 系列方法.
failXXX 系列方法
fail(self, msg=None) # test立即失败
addCleanup(self, function, *args, **kwargs)
addTypeEqualityFunc(self, typeobj, function)
countTestCases(self)
debug(self)
defaultTestResult() # return unittest.TestResult()
doCleanups(self)
id(self)
run(self, result=None) # 可以在子类覆盖该方法.
shortDescription(self)
skipTest(self, reason)
setUp(self) # 重写之后,每个case运行之前都会调用一次.
tearDown(self) # 同上
# classmethods:
setUpClass(cls) # 通过@classmethod重写,这样所有的case运行之前只调用一次,而不是每个case运行之前都调用.
tearDownClass(cls) # 同上
# data:
failureException = AssertionError
longMessage = False
maxDiff = 640
functions:
findTestCases(module, prefix='test', sortUsing=<built-in function cmp>, suiteClass=<class 'unittest.suite.TestSuite'>)
getTestCaseNames(testCaseClass, prefix, sortUsing=<built-in function cmp>)
installHandler()
makeSuite(testCaseClass, prefix='test', sortUsing=<built-in function cmp>, suiteClass=<class 'unittest.suite.TestSuite'>)
registerResult(result)
removeHandler(method=None)
removeResult(result)
# unittest.case实现了几个函数用来增强unittest.TestCase的方法, 一般当装饰器用.
expectedFailure(func) # 如果这个case失败了,不计入失败的数目.
# @unittest.expectedFailure
skip(reason) # 无条件跳过一个test case.
skipIf(condition, reason) # condition为true就跳过一个test case.
skipUnless(condition, reason) # 和上面相反
examples:
class MyClassTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
print 'Just execute before the first test case start.'
@classmethod
def tearDownClass(cls):
print 'Just execute after all test case end.'
def setUp(self):
"""重载setUp进行测试之前的初始化工作.运行每个test_func之前都会运行该方法"""
print "start"
def tearDown(self):
"""重载tearDown进行测试结束后的清理工作.结束运行每个test_func之后都会运行该方法"""
print "end"
def test_func(self):
"""具体的测试用例,需要用test开头,多个test_func会根据func名字中的数字或字母的顺序来执行,和位置无关.
不是用test开头的方法默认不会被执行"""
self.assertEqual(MyClass.method(args), value, "message")
if __name__ == "__main__":
unittest.main()
# 自动发现和批量执行testcase/testsuite:
def discover_test_case():
test_cases = []
_module = ...
tests.append(unittest.defaultTestLoader.loadTestsFromModule(_module))
unittest.defaultTestLoader.discover()
return tests
def get_test_suite():
"""打包一个testsuite."""
return unittest.TestSuite(discover_test_case())
unittest.TextTestRunner
if __name__ == "__main__":
runner = unittest.TextTestRunner()
result = runner.run(get_test_suite())
mock
https://github.com/testing-cabal/mock
python3集成了mock到unittest模块,导入unittest.mock即可.
# Python2.7
$pip install mock
import mock
# Python3
import unittest.mock
mock就是在测试中对于不容易构造或获取的对象,用一个虚拟的对象来代替以便测试的方法.
# Python2.7 此处用的是第三方库mock
from mock import Mock, patch, PropertyMock, MagicMock
nose2
https://github.com/nose-devs/nose2
nose是unittest/unittest2的升级版.
nose2是nose的升级版.
nose2用于单元测试.
$ pip install nose
import nose
pytest
https://github.com/pytest-dev/pytest/
pytest用于单元测试.推荐使用.
$ pip install -U pytest
import pytest
coverage
分析单元测试的代码覆盖率
https://github.com/nedbat/coveragepy
$ pip install coverage
# 通过命令进行测试,可以集成到其它工具.
$ coverage run --source=<package-name> setup.py test
tox
virtualenv management and test command line tool.
https://github.com/tox-dev/tox
$ pip install tox
# 通过命令进行测试,可以集成unittest, nose2, pytest等工具.
$ tox