博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django之单元测试
阅读量:7108 次
发布时间:2019-06-28

本文共 2032 字,大约阅读时间需要 6 分钟。

一、什么是单元测试

    单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。如果测试通过则说明我们这个函数或功能能够正常工作,如果失败要么测试用例不正确,要么函数有bug需要修复。

二、如何使用单元测试

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
from 
django.test 
import 
TestCase
from 
app01.models 
import 
*
 
class 
AuthorTestCase(TestCase):
 
    
# 测试开始前的工作
    
def 
setUp(
self
):
        
auths 
= 
Author.objects.
all
().values()
        
print
(auths)
 
    
# 测试结束的收尾工作
    
def 
tearDown(
self
):
        
Author.objects.
filter
(name
=
"Steven"
).delete()
        
auths 
= 
Author.objects.
all
().values()
        
print
(auths)
 
    
# 自己定义的测试方法,必须以"test_"开头
    
def 
test_insert_data(
self
):
        
Author.objects.create(name
=
"Steven"
, hobby
=
"骑行"
)
        
auths 
= 
Author.objects.
all
().values()
        
print
(auths)
         
 
输出:
<QuerySet []>
<QuerySet [{
'name'
'Steven'
'id'
1
'hobby'
'骑行'
}]>
<QuerySet []>

    Django的单元测试实际是基于Python的unittest模块,“setUp”方法是测试开始前的工作,“tearDown”方法是测试结束的收尾动作,这些方法名都是固定的,不允许随意修改,里面内容你也可以不写直接“pass”。“test_insert_data”是我自己定义的测试内容,方法名必须以“test_”开头,可以任意写多个自定义测试方法。

Django单元测试注意点:

    1. 对于每一个测试方法都会讲setUp()和tearDown()方法执行一遍

    2. Django会在数据库中自动新建一个测试数据库来进行数据库方面的测试,默认在测试完成后销毁。所以不用担心它会影响你实际的生成数据库!

三、运行单元测试

1. 测试项目中所有的应用

1
python3 manage.py test

2. 测试项目中单独的应用

1
python3 manage.py test app01

3. 运行项目中某个应用的测试文件中的一个Case

1
python3 manage.py test app01.test2.AuthorTestCase

4. 运行项目中某个应用的测试文件中的一个Case中的其中一个测试方法

1
python3 manage.py test app01.test2.AuthorTestCase.test_insert_data

5. 运行单元测试结束时不自动删除测试数据库(保留测试数据库)

1
python3 manage.py test app01 
-
-
keepdb

# 为什么要有这个呢?如果你有很多测试用例,定义了许多测试方法,那么每次在做数据库操作时都会创建数据库、删除数据库,严重影响执行效率。这样我们就保留测试数据库,记得下次执行测试时也要带上--keepdb,不然会提示你删除上一次的测试数据库

四、指定测试数据库的字符集

    这是我之前踩过的一个坑,之前用Pycharm写过的一个项目执行测试没有任何问题,过几天重新打开执行单元测试,结果报了字符集错误,然后测试数据库没有自动删除。我经过仔细排查,发现自动创建的测试数据库字符集竟然是“latin1”,我数据库表中有中文,所以直接报错了。知道错误原因就好办了,我查询了官方文档,在setting.py文件中强制设置测试数据库字符集是“UTF8”。

1
2
3
4
5
6
7
8
9
10
11
DATABASES 
= 
{
    
'default'
: {
        
'ENGINE'
'django.db.backends.mysql'
,
        
'NAME'
'xxx'
,
        
'USER'
'xxx'
,
        
'PASSWORD'
'xxx'
,
        
'HOST'
: '',
        
'PORT'
: '',
        
'TEST'
: {
'CHARSET'
'utf8'
, },
    
}
}
本文转自戴柏阳的博客博客51CTO博客,原文链接http://blog.51cto.com/daibaiyang119/1983898如需转载请自行联系原作者
daibaiyang119
你可能感兴趣的文章
Windows下无窗口后台运行程序: ShellExecute
查看>>
读《美丽新世界》
查看>>
UIScrollView实现图片循环滚动
查看>>
我的友情链接
查看>>
王垠:怎样写一个解释器
查看>>
解决unicodedecodeerror ascii codec can’t decode byte 0xd7 in position 9 ordinal not in range(128)...
查看>>
Redis和Memcached的区别
查看>>
CSS选择器种类及介绍
查看>>
struts2 + form 表单上传文件
查看>>
Centos7下安装mongodb
查看>>
ES架构及原理
查看>>
Windows7 自动更新时遇到故障
查看>>
我的友情链接
查看>>
spring加载配置属性文件(properties)
查看>>
redis设置
查看>>
android的唯一性
查看>>
深入理解java虚拟机——OutOfMemoryError异常
查看>>
《The way to go》中文版
查看>>
jQuery设置元素是否显示
查看>>
samsung Galaxy S3 i9300 获得root权限
查看>>