1.单元测试的重要性
测试是为了保证交互高质量代码,而单元测试就是其中一个基石。
当你雄心勃勃的写一个大工程的时候,请在你的checklist里写下三个词语:功能函数化,模块化,单元测试。同时建立一个模块或者文件叫test,所有的单元测试可以放在这里
2.单元测试的原则
单元测试时伴随在开发过程的自我测试,开发完一个函数,单元测试一下;开发完模块,单元测试一下;所以当你写完你的任务时,交给测试人员测试的时候,你心里是充满自信的
如果你等完成了所有的开发,再来测试,要么来不及测试,要么测一个大概的流程,结果是测试人员无休止的找你。
单元测试原则:
- 一致性:每次执行的单元测试的结果都是一样的
- 原子性:单元测试的结果要么成功,要么失败
- 单一原则:针对单一场景和行为进行测试,多个分支建立多个场景进行单独测试
- 隔离性:不依赖外部环境,如数据库
3.python如何写单元测试
python内置了一个单元测试模块unittest
,我们来看下使用例子
class Func(object):
def add(self,a,b):
return a+b
def sub(self,a,b):
return a-b
import unittest
class FuncTest(unittest.TestCase):
def setUp(self):
print("running set up")
self.func = Func()
def tearDown(self):
print("running teardown")
self.func = None
def testAdd(self):
self.assertEqual(self.func.add(-1,7), 6)
def testSub(self):
self.assertEqual(self.func.sub(10,2), 8)
# add test
suite = unittest.TestSuite()
suite.addTest(FuncTest("testAdd"))
suite.addTest(FuncTest("testSub"))
# run test
runner = unittest.TextTestRunner()
runner.run(suite)
# ..
# running set up
# running teardown
# running set up
# running teardown
# ----------------------------------------------------------------------
# Ran 2 tests in 0.003s
# OK
# <unittest.runner.TextTestResult run=2 errors=0 failures=0>
上面的例子,我们要测试类的Func的功能函数,FuncTest
为一个测试案例(unittest.TestCase
),每个测试案例都有setUp和tearDown来初始化和回收资源,并为需要测试的功能编程Test,具体为:
- setUp tearDown分别是初始化和回收资源
- 测试方法通常以test开头
- func.add(-1,7)为测试对象输出,6为预期输出,assertEqual为判断是否符合预期(是否相等)
- 将测试case加入TestSuite
- 利用TextTestRunner执行case
当然,你可以不需要unittest这个包,但请你创建test文件夹,创建testXXX.py来测试你的功能。