Python之单元测试
典型的单元测试步骤
- 创建测试计划
- 编写测试用例,准备测试数据
- 编写测试脚本
- 编写被测代码,代码完成后执行测试脚本
- 修正代码缺陷,重新测试直到代码修正结束
让测试驱动开发
一、Python的单元测试框架PyUnit(unittest)
1. 测试固件(test fixtures)
- 测试相关的准备工作和清理工作
- setUp():完成初始化工作
- tearDown():资源释放
class MyClass(object):
def add(self, a, b):
return a+b
def sub(self, a, b):
return a-b
import unittest
from myClass import MyClass
class MyClassTest(unittest.TestCase):
def setUp(self):
print("Runnging setUp")
self.myclass = MyClass()
def tearDown(self):
print("Running tearDown")
self.mycalss = None
def testAdd(self):
self.assertEqual(self.myclass.add(1, 3), 4)
def testSub(self):
self.assertEqual(self.myclass.sub(1, 3), -2)
执行结果
2. 测试用例(test case)
上述实验就是一个测试用例
3. 测试用例集(test suite)
将多个测试用例组织,放在TestSuite中,自动在一次测试中全部完成
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(MyClassTest("testAdd"))
suite.addTest(MyClassTest("testSub"))
4. 测试运行器(test runner)
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(MyClassTest("testAdd"))
suite.addTest(MyClassTest("testSub"))
runner = unittest.TextTestRunner()
runner.run()
执行结果
缺点
- setUp()和tearDown()只是在TestCase层面上提供,每个测试用例执行,都会运行一遍,如果模块很多时,创建环境和清理环境会带来大量工作
- 没有插件机制进行扩展,比如增加测试覆盖统计特性就很困难
二、 nose
1. 优点
- 定义了插件机制,默认自带coverage插件
- 会自动发现测试用例,并执行
- 与unittest测试用例兼容
- 配置和清理函数可以放在__init__.py、模块、测试用例中,解决了不同层次的测试需要的配置和清理需求
- 与setuptools的集成更友好,提供了Nose.collector作为通过的测试套件,可针对不同项目编写不同套件
2. 使用
因为是第三方库,需要先安装
pip install nose
简单样例:
import nose
def test_nose():
pass
if __name__ == "__main__":
nose.runmodule()
执行结果
3. 缺点
- gitlab上上一次维护是2016年了,作为第三方库,emmm。。。
- nose2继承nose,但是node2不支持nose的全部功能
三、pytest
1. 优点
- assert断言失败时会输出详细信息
- 能自动发现测试模块和函数
- 完全兼容unittest,基本兼容nose
- 插件丰富,且可自定义扩展
- 入门简单,各种文档也比较多
|