单元测试

单元测试(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
# -*- coding: utf-8 -*-

# @Time : 19-7-31 下午7:44
# @Author : zj


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
# -*- coding: utf-8 -*-

# @Time : 19-7-31 下午7:52
# @Author : zj

import pytest

from test.password import Password


class 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不熟悉,最好还是先在小项目上多练练手

突然想到一个事情:如何判断你在做产品还是做外包?有没有写单元测试!

相关阅读