单元测试(unit testing
,简称UT
)是用于测试源代码不同单元的软件测试方法, 能够有效提高代码质量和可维护性
什么是单元测试 单元测试是由开发人员编写的用于测试程序单元正确性的方法,在面向对象过程中,一个单元通常指一个完整的接口,比如一个类,也可以是一个单独方法
之前实现一个类的时候,总会实现main
函数来测试该类是否能够正确运行,这就是最简单的单元测试,而利用单元测试框架 + 持续集成工具能够有效管理测试用例,加速软件开发
为了能够分离错误,测试用例应该独立运行,不相互依赖;每个测试用例仅用于测试单个程序单元
优点 单元测试的目的就是为了提高代码质量和可维护性。通过编写UT
将程序分离成单元进行测试,一方面易于调试,在开发初期就能够发现潜在错误,另一方面保证基础单元的正确性能够自下而上(bottom-up
)的提高代码质量;同时编写UT
的过程也有利于明确需求,保持程序简洁,提高可维护性
测试用例 编写类Password
,输入密码满足6-16
位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Password (object ): def __init__ (self ): self.password = None def set_password (self, inputs ): assert isinstance (inputs, str ) or isinstance (inputs, int ) length = len (str (inputs)) if 6 <= length <= 16 : self.password = str (inputs) else : raise ValueError('password length is between 6 and 16' )
编写类TestPassword
,测试异常情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 import pytestfrom test.password import Passwordclass TestPassword (object ): def test_exception (self ): """ 测试错误输入是否能够抛出异常 :return: """ password = Password() with pytest.raises(ValueError, match='password length is between 6 and 16' ): password.set_password(2123 ) with pytest.raises(ValueError, match='password length is between 6 and 16' ): password.set_password('123sadfasdfsddddddddddddddddddddddddddddd' ) def test_value (self ): """ 测试正确输入 :return: """ password = Password() assert password.set_password('123456' ) assert password.set_password(1234125 )
执行测试
1 2 3 4 5 6 7 8 9 10 $ pytest ========================================================== test session starts =========================================================== platform linux -- Python 3.7.1, pytest-4 .0.2, py-1 .7.0, pluggy-0 .8.0 rootdir: /home/zj/deeplearning/cs231n/coding/test, inifile: plugins: remotedata-0 .3.1, openfiles-0 .3.1, doctestplus-0 .2.0, arraydiff-0 .3 collected 2 items test_password.py .. [100%] ======================================================== 2 passed in 0.01 seconds ========================================================
需不需要编写单元测试 相对于功能实现,编写UT
是一份额外工作,自己也会考虑需不需要编写UT
,网上有一个讨论 - 单元测试到底是什么?应该怎么做?
经历过大大小小多个项目的开发后,渐渐会感觉到测试对于项目质量和维护的重要性,所有对于是否需要编写单元测试持肯定态度。不过具体到某个项目,也要根据实际场景进行分析:如果项目代码量不大(少于1000
行)并且功能简单,那么看时间安排是否编写UT
;否则,一定要编写UT
。当然,如果对UT
不熟悉,最好还是先在小项目上多练练手
突然想到一个事情:如何判断你在做产品还是做外包?有没有写单元测试!
相关阅读