1.目的
让代码更健壮,尤其是在进行重构和业务增加的时候,跑通单元测试则意味着新加入的代码或者修改是没有问题的
2.配置数据库
对于SQLite数据库,django会帮我们创建一个基于内存的测试数据库用于测试,因此测试过程中产生的数据对开发环境或线上环境是没有影响的
但对于mysql,django会直接用配置的数据库用户名和密码创建一个测试数据库
测试数据库将使用默认的字符集,如果测试数据中包含中文,需修改数据库的默认字符集:
https://blog.csdn.net/weixin_43667990/article/details/102691522
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'USER': 'root',
'PASSWORD': '****',
'NAME': 'student_sys',
'HOST': '****',
'PORT': 3306,
'TEST': {
'NAME': 'test_student_sys', # 自定义的测试数据库 库名
}
}
}
3.测试代码:各个应用中的tests.py
from django.test import TestCase, Client
from .models import Student
class StudentTestCase(TestCase):
# 初始化方法,用来创建初始化数据或准备其他工作
def setUp(self):
Student.objects.create(
name='kzzf',sex=1,email='123@qq.com',
profession='test1',qq='3333',phone='1234',
)
# 以test_开头的为测试方法,均独立运行
def test_create_and_sex_show(self):
student = Student.objects.create(
name='sk',sex=1,email='1223@qq.com',
profession='test',qq='33334',phone='12345',
)
# 检查输出是否正确
# sex_show为模型中定义的属性方法,返回性别
# 第一个是输出结果,第二个是期望值,第三个是错误时提示的信息
self.assertEqual(student.sex_show, '男', '性别字段展示错误')
# 检查视图响应是否正常
def test_post_student(self):
client = Client()
data = dict(name='test_for_post', sex=1, phone=1234, email='123@qq.com', profession='docker', qq='123')
response = client.post('/', data)
# 提交数据后将会重定向到首页,测试状态码是否正确
self.assertEqual(response.status_code, 302, 'status code must be 302')
response = client.get('/')
# 首页会显示所有用户信息,此处测试响应内容中是否有刚提交的用户名
# response.content的内容是bytes类型的
self.assertTrue(b'test_for_post' in response.content, '响应的数据中必须有test_for_post的信息')
4.运行测试用例
python manage.py test # 运行所有的测试用例
python manage.py test app_name # 运行指定app的测试用例
python manage.py test --keepdb # 不清空上次的测试数据库
pycharm中直接运行测试文件