1 啥是单元测试
写好了一个项目之后,要确定各个模块是不是稳定运行,有没有bug,比如一个项目有100个路由,可以手动一个一个URL的输入,查看响应有没有毛病,但这样不符合程序员的逼格。
由此,诞生了单元测试与集成测试。
2 单元测试的配置
2.1 数据库的配置
由于单元测试可能测试模型类的增删改查,就免不了要往里面添加一些数据,但又不希望测试的数据影响现有的数据库造成影响,所以Django可以让我们配置一个测试数据库。
比如说:
DATABASES = {
'default': {
'ENGINE' : 'django.db.backends.mysql',
'HOST': 'localhost',
'PORT': '3306',
'NAME': 'django_db1', # 真实的数据库
'USER': 'root',
'PASSWORD': '12345',
'TEST':{
'NAME':'django_db_test' # 用于单元测试的数据库
}
}
}
2.2 单元测试的py文件
在每个APP里面,都有一个test.py文件,可以在里面去定义测试类,并可以直接运行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bWC9FQzu-1578390196685)(_v_images/20200107173157406_12605.png)]
from django.test import TestCase,Client
from .models import User
# Create your tests here.
class UserTestCase(TestCase):
# 相当于初始化方法
def setUp(self):
pass
# 测试模型类
def test_models(self):
# 添加一个user对象
User(
account='account1',
username='name1',
gender=0
).save()
# 测试,self.asserEqual接收3个参数
# (被测试对象,正确的测试结果,如果不正确输出什么)
# 如果第一个参数的返回值不等于第二个参数,输出第三个参数
self.assertEqual(
User.objects.filter(account='account1').count(),
1,
'没有插入成功'
)
# 测试首页的访问
def test_index(self):
# 创建一个客户端
client = Client()
# 模拟客户端访问首页
response = client.get('/')
# 测试首页返回的状态码
self.assertEqual(
response.status_code,
200,
'index的状态码不为200'
)
if __name__ == '__main__':
userTestCase = UserTestCase()
userTestCase.test_models()
userTestCase.test_index()
运行效果:
测试开始的时候,先创建数据库
测试完成后,删除数据库
2.3 如果单元测试有错误,会怎么显示?
这里
- 把User.objects.filter(account=“account1”).count()的测试正确结果定义为2
- 把首页返回的状态码的测试正确结果,定义为400
from django.test import TestCase,Client
from .models import User
# Create your tests here.
class UserTestCase(TestCase):
# 相当于初始化方法
def setUp(self):
pass
# 测试模型类
def test_models(self):
# 添加一个user对象
User(
account='account1',
username='name1',
gender=0
).save()
# 测试,self.asserEqual接收3个参数
# (被测试对象,正确的测试结果,如果不正确输出什么)
# 如果第一个参数的返回值不等于第二个参数,输出第三个参数
self.assertEqual(
User.objects.filter(account='account1').count(),
2,
'没有插入成功'
)
# 测试首页的访问
def test_index(self):
# 创建一个客户端
client = Client()
# 模拟客户端访问首页
response = client.get('/')
# 测试首页返回的状态码
self.assertEqual(
response.status_code,
400,
'index的状态码不为200'
)
if __name__ == '__main__':
userTestCase = UserTestCase()
userTestCase.test_models()
userTestCase.test_index()
3 简化代码
测试数据库可以不预先创建,也可以不配置,即:
DATABASES = {
'default': {
'ENGINE' : 'django.db.backends.mysql',
'HOST': 'localhost',
'PORT': '3306',
'NAME': 'django_db1',
'USER': 'root',
'PASSWORD': '12345',
# 'TEST':{
# 'NAME':'django_db_test2' # 用于单元测试的数据库
# }
}
}
这样也行