[Django]的单元测试(TestCase|Client|测试数据库配置等)

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' # 用于单元测试的数据库
        # }
    }
}

这样也行

猜你喜欢

转载自blog.csdn.net/kzl_knight/article/details/103878950