Python3和Django的单元测试示例

1. unittest

unittest是python自带的单元测试框架,unittest框架是受到 JUnit 的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。
unittest 通过面向对象的方式支持的重要概念,包括TestFixture、TestCase、TestSuite、TestRunner

  • 测试脚手架(test fixture)
    为了开展测试所需要进行的准备工作,以及所有相关的清理操作。举个例子,包括创建临时或代理的数据库、目录,或者启动一个服务器进程。
  • 测试用例(TestCase)
    一个测试用例是一个独立的测试单元。它检查输入特定的数据时的响应。
  • 测试套件(test suite)
    测试套件是一系列的测试用例。它用于归档需要一起执行的测试。
  • 测试运行器(test runner)
    test runner 是一个用于执行和输出测试结果的组件。这个运行器可能使用图形接口、文本接口,或返回一个特定的值表示运行测试的结果。

更多:unittest — 单元测试框架 — Python 3.10.2 文档 (yali.edu.cn)

2. django.test.TestCase

django.test.TestCase是在unittest.TestCase基础上的二次封装,并且提供Client类用于模拟多种请求的发送测试。
testcase

3. Django测试示例

本测试只关心后台接口,不结合Selenium测试前台代码逻辑。
数据库层涉及到mysql和redis,http方法涉及到post、get和header头信息。
django框架的tests.py代码,示例中测试了model和views的list方法,代码如下:

tests.py

import json

from django.test import TestCase
from django.test import Client
from django.urls import reverse

from redis_util import redis_conn
from .models import WebSiteModel
from user.models import SysUser


class MyWebsiteTests(TestCase):
    my_ip = '192.168.1.79'
    client = None
    login_token = '1234567890abcdef'

    def setUp(self):
        # user init
        SysUser.objects.create(id=1, username='admin', password='123123123123abcabcabcabc'
                               email='test@baidu.com')

        # HTTP headers in the request are converted to META keys by converting all characters to uppercase,
        # replacing any hyphens with underscores and adding an HTTP_ prefix to the name.
        self.client = Client(HTTP_Authorization=self.login_token)
        # set redis chache
        val = '{{"id":{}, "username": "{}"}}'.format(1, 'admin')
        redis_conn.set('{}'.format(self.login_token), val, 60)

        # web site init
        WebSiteModel.objects.create(id=1, ip=self.my_ip)

    def test_models(self):
        qs = WebSiteModel.objects.filter(ip__contains=self.my_ip)
        self.assertEqual(qs.count(), 1, 'model is ok')

    def test_login(self):
        # 如果有图片验证码,可以直接做缓存
        img_key = 'img_code_123123'
        img_code = 'abc123'
        redis_conn.set(img_key, img_code, 60)
        # post login
        res = self.client.post('/api/login/', data={'username': "admin", 'password': "123qwe",
                                                    'image_code': img_code, 'image_key': img_key})
        self.assertEqual(res.status_code, 200)
        json_dict = json.loads(res.content.decode('utf-8'))
        self.login_token = json_dict.get('token', '')
        print(self.login_token)
        self.assertNotEqual(self.login_token, None)

    def test_views_list(self):
        # reverse url 格式:basename-method
        res = self.client.get(reverse('website-list'))
        self.assertEqual(res.status_code, 200)
        json_dict = json.loads(res.content.decode('utf-8'))
        self.assertEqual(json_dict.get('count'), 1)

views.py(部分代码)

from rest_framework.viewsets import ModelViewSet

class WebSiteViewSet(ModelViewSet):
    queryset = WebSiteModel.objects.all()

    def filter_queryset(self, queryset):
        return queryset

    def list(self, request, *args, **kwargs):
        return super().list(request, *args, **kwargs)

urls.py

from rest_framework.routers import DefaultRouter
from .views import WebSiteViewSet

router = DefaultRouter()
router.register(r'website', WebSiteViewSet, basename='website')
urlpatterns = [
    url(r'', include(router.urls)),
]

4. 执行测试

python manage.py test --keepdb

result

5. 附录reverse用法

django
url的name属性,对该url进行别名,通过别名可以获取到该别名的url。
使用reverse(“app_create”)即可获取uri: http://localhost:8000/app/create

django rest-framework
与django类似,通过basename属性进行别名.
使用reverse(“App-list”)可以动态获取uri: http://localhost:8000/app/,可以获取所有app的list数据。

如果想要获取单个数据,需要在uri后面添加id。
reverse(“App-detail”, [1]),获取uri:http://localhost:8000/app/1/。

reverse用法原文链接:https://blog.csdn.net/qq_22918243/article/details/90200863

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值