Python3和Django的单元测试示例

news2025/2/4 8:44:22

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能测试(二)—— JMeter元件作用域和执行顺序、JMeter示例、JMeter参数化

目录 一、JMeter元件作用域和执行顺序 1. 元件的基本介绍 2. 元件作用域 3. 元件执行顺序 二、JMeter使用示例 1. JMeter第一个案例 2. 重点组件 2.1 线程组 2.2 HTTP请求 2.3 查看结果树 三、JMeter参数化 1. JMeter参数化常用方式 2. 用户定义的变量 2.1 场景 …

详解OpenCV的线段绘制函数line()

函数line()用于在图像上绘制圆形。 函数line()利用两点确定一条直线的原理在图像中绘制出一条线段。 C原型如下: void cv::line(InputOutputArray img,Point pt1,Point pt2,const Scalar & color,int thickness 1,int lineType LINE_8,int shift 0)Python原…

智能优化算法:人工蜂鸟算法 - 附代码

智能优化算法:人工蜂鸟算法 摘要:人工蜂鸟算法( AHA )是 ZHAO 等 于 2021 年提出的一种新型元启发式优化算法 . 该算法模拟了自然界中蜂鸟轴向飞行、对角飞行、全方位飞行 3 种特殊飞行技能和引导觅食、区域觅食、迁移觅食 3 种智能觅食策略,并通过引入…

【大数据入门核心技术-Spark】(三)Spark 本地模式安装

目录 一、Spark集群三种部署模式 1、 Local模式 2、Spark Standalone模式 3、Spark on YARN模式 二、准备工作 1、Hadoop环境安装 2、下载spark 三、安装spark 1、解压 2、配置环境变量 3、修改配置文件 4、测试安装是否成功 四、运行测试spark 1、读取本地文件 …

【Java|golang】1760. 袋子里最少数目的球---逆向二分法

给你一个整数数组 nums ,其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。 你可以进行如下操作至多 maxOperations 次: 选择任意一个袋子,并将袋子里的球分到 2 个新的袋子中,每个袋子里都有 正整数…

buildroot 升级软件包

因为软件漏洞问题,需要升级软件包,如 ncurses、libpwquality 等; 我目前采用的方法如下: 环境: 下载一个 buildroot 的最新版本: git clone git://git.buildroot.net/buildroot.git 我使用的 linux 环…

深入底层,spring mvc父子容器初始化过程解析

spring mvc父子容器初始化过程解析1、为什么要学习spring mvc底层?2、Java Web应该学什么?1、Tomcat2、servlet3、filter4、listener3、spring mvc容器初始化过程1、以WebApplicationInitializer.onStartup()方法作为入口2、registerDispatcherServlet()…

Java真的不难(五十二)Stream流的深入理解与流式编程

Stream流的深入理解与流式编程: 在今年年初小应学长也写过Stream与Lambda的两篇文章,今天先将两者结合起来进行流式编程 一、关于这两者 Stream与Lambda都是Java8引入的新概念,lambda在Java编程中对于函数式编程的支持,有助于代…

H5 WebSQL每日成语

有一天看到同事发的类似 这种成语填空一样的内容。 惟利( )视 为德( )终 质非文( ) ( )追耗子 烂漫天( ) ( )则改之,无则嘉勉 得( )之作 哀( )如潮 于是就去网上找成语数据库表的 SQL… 哈哈哈 很容易就找到了. 本来打算写个前后端,想了想可以但没…

Codeforces Round #840 (Div. 2) and Enigma 2022 - Cybros LNMIIT题解

这场好难我是废物&#xff0c;掉大分了 A. Absolute Maximization 利用|找最大值和&找最小值即可 #include <bits/stdc.h> using namespace std; // #define int long long #define endl \nvoid solve() {int n;cin >> n;int maxn 0,minn 1023;for(int i …

TCP报文结构、确认应答机制、超时重传机制、连接管理机制

TCP报文结构、确认应答机制、超时重传机制、连接管理机制一、TCP报文结构二、确认应答机制三、超时重传机制四、连接管理机制4.1 三次握手建立连接4.2 四次挥手断开连接一、TCP报文结构 可靠传输是TCP中最最核心的特性&#xff01;&#xff01;&#xff01; 上篇博客我们已经介…

企事业单位如何做好服务器数据防泄露,防病毒工作

目前现状 无论是中小企业还是大型企事业单位&#xff0c;均有属于自己的内网或公有云服务器。这些服务器有的是专门的SVN、GIT代码服务器&#xff0c;有的是文档存储服务器&#xff0c;有的是应用服务器。服务器是企业的核心命脉&#xff0c;所有知识产权及多年心血都集中汇总…

【学习笔记】JDK源码学习之HashMap(附带面试题)

最近发布 AND 其他好文 &#xff1a;地址 什么是 HashMap &#xff1f;它和 Map 之间又有什么样的关系呢&#xff1f;我们是否能拿它在并发中使用呢&#xff1f; 带着以上问题&#xff0c;让我们一同走入这让人着迷的 HashMap 。 1、什么是HashMap&#xff1f; HashMap 基于…

DOM算法系列005-获取给定节点所属的window对象

UID: 20221220091217 aliases: tags: source: cssclass: created: 2022-12-20 我们知道&#xff0c;在一个HTML页面中&#xff0c;可以包含很多个框架或框架集&#xff0c;那么&#xff0c;当给定一个节点&#xff0c;我们如何获取这个节点所属的window对象呢&#xff1f; 首先…

【填坑向】Linux获取Java程序resource下的文件路径(这次的坑好像没填住……

​╮(&#xffe3;▽&#xffe3;"")╭没错&#xff0c;就是那个传说中的FileNotFoundException&#xff0c;文件找不到了 一开始&#xff0c;特别单纯的俺是把文件直接放在项目根目录的&#xff0c;获取文件地址的位置就只写了一个文件名&#xff08;相对路径&…

Nature子刊:生命的最初几个小时内可快速学习音位辨别—基于fNIRS研究

摘要 人类新生儿可以区分音素&#xff0c;但这种能力背后的神经机制尚不清楚。新生儿的大脑可以学会区分自然&#xff08;前&#xff09;元音和逆向&#xff08;后&#xff09;元音&#xff08;在子宫中学习不到的&#xff09;。利用功能近红外光谱&#xff0c;我们检测了出生…

工控CTF之协议分析2——MMS

协议分析 流量分析 主要以工控流量和恶意流量为主&#xff0c;难度较低的题目主要考察Wireshark使用和找规律&#xff0c;难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律&#xff0c;难可以难得五花八门 常见的工控协议有&#xff1a;Modbus、MMS、MQTT、CoA…

关于3D可视化的几个知识点

3D可视化&#xff0c;运用三维仿真技术实现信息感知、智能调度以及主动式运营维护&#xff0c;把复杂抽象的数据信息&#xff0c;以合适的人们视觉元素及视角用3D立体方式进行一比一还原呈现&#xff01; 近些年&#xff0c;将繁琐的信息通过可视化的图表视觉化展现出来的应用场…

惠普Elite蜻笔记本系统损坏怎么U盘重装教学

惠普Elite蜻笔记本系统损坏怎么U盘重装教学&#xff0c;有用户使用的惠普Elite蜻笔记本系统受到了其他恶意程序的损坏&#xff0c;导致无法正常的开启使用。所以想要去进行电脑系统的重装。那么如何U盘重装电脑系统&#xff0c;一起来看看详细的重装步骤吧。 准备工作&#xff…

有哪些实用的软件开发项目管理工具?

给大家介绍下&#xff0c;目前最新的免费项目管理工具&#xff0c;希望对大家有所帮助。 1、 Co-Project智能项目管理工具 智能项目管理平台&#xff0c;是CoCode旗下的软件开发全生命周期的项目管理平台&#xff0c;涵盖了从需求、计划、设计、开发、测试再到交付的整个项目周…