tests.py单元测试
本笔记,仅记录本人常用方法及模块
注:结合models.py查看
from django.test import TestCase, Client
from .models import Studentclass StudentTestCase(TestCase):"""def setUp(self):用来初始化环境,包括创建初始数据,或做一些其他准备工作def test_xxx(self):xxx可以是任何东西,以test_开头的方法,都会被django认为是需要测试的方法,跑测试时会被执行。注:每个需要被测试的方法都是相互独立的def tearDown(self):跟setUp相对,用来清理测试环境和测试数据(在django中可以不关心这个)"""def setUp(self):print('setUp')Student.objects.create(name='stu1',sex=1,email='test1@qq.com',qq='333',phone='111',)# 测试数据创建以及sex字段的正确展示def test_create_and_sex_show(self):print('test_create_and_sex_show')student = Student.objects.create(name='huyang',sex=1,email='test2@qq.com',profession='t1',qq='123',phone='test2123',)# django提供了get_xxx_display方法,可以替换sex_showself.assertEqual(student.sex_show, '男', '性别字段内容跟展示不一样')# self.assertEqual(student.get_sex_display, '男', '性别字段内容跟展示不一样')# 测试查询是否可用def test_filter(self):print('test_filter')Student.objects.create(name='huyang',sex=1,email='testfilter@qq.com',profession='t2',qq='222',phone='22322',)name = 'stu1'students = Student.objects.filter(name=name)self.assertEqual(students.count(), 1, '应该只存在一个名称为{}的记录'.format(name))# 测试首页的可用性def test_get_index(self):print('test_get_index')client = Client()response = client.get('/')self.assertEqual(response.status_code, 200, 'status code must be 200!')# 测试post请求def test_post_student(self):print('test_post_student')client = Client()data = dict(name='test_for_post',sex=1,email='333@dd.com',profession='t2',qq='2323',phone='3222')response = client.post('/', data)self.assertEqual(response.status_code, 302, 'status code must be 302!')response = client.get('/')with open('temp.html', 'wb') as f:f.write(response.content)self.assertTrue(b'test_for_post' in response.content,'response content must contain `test_for_post`')
备注
tests.py
会自动创建临时临时数据库,数据库类型由settings.py
的DATABASES
决定。- 只要把
models.py
写好,通过tests.py
即可开始测试,并不需要再执行python manage.py makemigrations
和python manage.py migrate
如果用的是MySQL数据库,运行
tests.py
时报类似以下错误:
django.db.utils.OperationalError: (1366, “Incorrect string value: ‘\xE5\xAD\xA6\xE5\x91\x98…’ for column ‘name’ at row 1”)
则需要修改MySQL的默认字符集为UTF8,修改方法网上资料很多。
在此仅介绍Windows下的解决办法:
- 修改MySQL默认安装目录
C:\ProgramData\MySQL\MySQL Server 5.7
下的my.ini
文件- 加上内容
default-character-set=utf8
、character-set-server=utf8
- 重启MySQL服务