Django 入门:tests.py

本文详细介绍了使用Django框架进行单元测试的方法,包括测试环境搭建、数据创建、查询测试、首页访问测试及POST请求测试等核心操作。通过具体示例,深入解析了如何确保应用程序的各个部分按预期工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tests.py单元测试

本笔记,仅记录本人常用方法及模块
注:结合models.py查看

from django.test import TestCase, Client
from .models import Student


class 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_show
        self.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.pyDATABASES决定。
  • 只要把models.py写好,通过tests.py即可开始测试,并不需要再执行python manage.py makemigrationspython 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下的解决办法:

  1. 修改MySQL默认安装目录C:\ProgramData\MySQL\MySQL Server 5.7下的my.ini文件
  2. 加上内容default-character-set=utf8character-set-server=utf8
  3. 重启MySQL服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值