单元测试
单元测试基于最小单元,也就是程序的基本部件,比如函数、类等,在隔离测试各部件,确保底层正确的前提下,在行组合向上完成套件测试。
测试驱动开发(TDD)要求在编写代码之前,先构建测试,但这并不容易。多数时候,需求和架构的不成熟会导致算法剧烈变化,这样很难先行将测试确定下来。可以考虑和编码同步,在重构过程中剥离出测试用例。两厢对照,还可要求代码必须具备可测试性。
请注意,测试用例要检查的是错误,而非目标正确返回。另外,单个用例要足够简单,仅测试一项功能,否则其本身就难以维护。可将复杂功能分解以测试套件的方式进行打包。另外,还应避免测试目标的私有成员,这会导致过高的耦合,让代码重构变得困难。同样第三方库也不是测试目标,或许有一个基于接口的隔离代理。
性能测试
1.timeit为标准库自带,用于测量少于代码片段的执行时间。其基本算法思路就是执行足够多的次数,从中选取最小平均值,以缩小测量误差。
2.标准库的profile模块用于测量执行过程中函数的执行时间和调用次数
标准库自带两个版本,调用接口基本一致。cProfile以C实现,额外开销小。
profile是纯python实现,开销大,适合编写扩展分析器。
3.获知引发性能问题的函数后,接下来需要进一步分析具体成因。line_profiler可以对函数内的代码逐行进行测量。
4.memory profile用于逐行分析代码内存占用。
当内存占用过多时,可能会引发物理内存不足,或者导致与硬盘的平凡交换,这些会导致严重的性能问题。
5.pympler被用来统计对象实例的内存使用
他的方法summary可以对整个解释器进程内的存活对象做出评估,以查证哪类对象可能存在问题。
tracker可在不同执行点创建跟踪快照,这样通过输出快照的差异,就可能发现嫌疑目s标,以及问题代码的位置。
sizeof找到嫌疑目标之后,我们开始对其进行个体检查,这需要使用asizeof.与sys.getsizeof不同,他递归统计所有成员和属性。
代码调试
pdb
启动方式
1.python -m pdb main.py # 命令行调试
2.import pdb
pdb.set_trace() # 特定位置插入断点,调试
3.pdb.run('test()') # 直接调试
插入断点后,语句就会停在该处,命令行显示pdb语句,输入help可看到pdb的命令。