什么是单元测试?
程序开发过程中,写代码是为了实现需求。当我们的代码通过了编译,只是说明它的语法正确,功能能否实现则不能保证。 因此,当我们的某些功能代码完成后,为了检验其是否满足程序的需求。可以通过编写测试代码,模拟程序运行的过程,检验功能代码是否符合预期。
单元测试就是开发者编写一小段代码,检验目标代码的功能是否符合预期。通常情况下,单元测试主要面向一些功能单一的模块进行。
举个例子:一部手机有许多零部件组成,在正式组装一部手机前,手机内部的各个零部件,CPU、内存、电池、摄像头等,都要进行测试,这就是单元测试。
在Web开发过程中,单元测试实际上就是一些“断言”(assert)代码。
断言就是判断一个函数或对象的一个方法所产生的结果是否符合你期望的那个结果。 python中assert断言是声明布尔值为真的判定,如果表达式为假会发生异常。单元测试中,一般使用assert来断言结果。
断言方法的使用:
断言语句类似于:
if not expression: raise AssertionError AssertionError
1 2 3 |
|
常用的断言方法:
1 2 3 4 5 6 |
|
如何测试?
简单的测试用例:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,
1 2 3 4 5 6 7 8 9 |
|
单元测试的基本写法:
首先,定义一个类,继承自unittest.TestCase
1 2 3 |
|
其次,在测试类中,定义两个测试方法
1 2 3 4 5 6 7 8 9 10 |
|
最后,在测试类中,编写测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
登录测试
- 被测试的代码逻辑
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
@app
.route(
'/login'
, methods
=
[
'POST'
])
def
login():
username
=
request.form.get(
'username'
)
password
=
request.form.get(
'password'
)
# 判断参数是否为空
if
not
all
([username, password]):
result
=
{
"errcode"
:
-
2
,
"errmsg"
:
"params error"
}
return
jsonify(result)
# a = 1 / 0
# 如果账号密码正确
# 判断账号密码是否正确
if
username
=
=
'skylark'
and
password
=
=
'python'
:
result
=
{
"errcode"
:
0
,
"errmsg"
:
"success"
}
return
jsonify(result)
else
:
result
=
{
"errcode"
:
-
1
,
"errmsg"
:
"wrong username or password"
}
return
jsonify(result)
- 单元测试代码
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 32 33 34 35 36 37 38 |
|
数据库测试:
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 |
|
import json
import unittest
from demo1_login import app
class LoginTest(unittest.TestCase):
"""为登录逻辑编写测试案例"""
def setUp(self):
app.testing = True
self.client = app.test_client()
def test_empty_username_password(self):
"""测试用户名与密码为空的情况[当参数不全的话,返回errcode=-2]"""
response = app.test_client().post('/login', data={})
json_data = response.data
json_dict = json.loads(json_data)
self.assertIn('errcode', json_dict, '数据格式返回错误')
self.assertEqual(json_dict['errcode'], -2, '状态码返回错误') # TODO 测试用户名为空的情况
# TODO 测试密码为空的情况
def test_error_username_password(self):
"""测试用户名和密码错误的情况[当登录名和密码错误的时候,返回 errcode = -1]"""
response = app.test_client().post('/login', data={"username": "aaaaa", "password": "12343"})
json_data = response.data
json_dict = json.loads(json_data)
self.assertIn('errcode', json_dict, '数据格式返回错误')
self.assertEqual(json_dict['errcode'], -1, '状态码返回错误') # TODO 测试用户名错误的情况
# TODO 测试密码错误的情况
if __name__ == '__main__':
unittest.main()