IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python3和Django的单元测试示例 -> 正文阅读

[Python知识库]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

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 11:04:55  更:2022-12-25 11:07:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 8:25:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码