Django框架自动化测试

news2024/11/15 10:28:59

【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客

《Django 5企业级Web应用开发实战(视频教学版)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com)

本节介绍关于Django框架自动化测试的内容,自动化测试是实际项目开发中必不可少的工具。

8.2.1  自动化测试概述

对于使用Django框架的Web开发人员而言,自动化测试是一个非常有用的解决Bug的工具。设计人员可以使用一组测试(一个测试套件)来解决或避免许多问题,具体包括:

(1)在编写新代码时,可以使用测试来验证代码是否按预期进行工作。

(2)重构或修改旧代码时,可以使用测试来确保所做的更改不会意外影响应用程序的行为。

测试Web应用程序是一项复杂的工作,因为Web应用程序通常是由几层逻辑组成的,从HTTP级别的请求处理到表单验证与处理,再到模板渲染等。借助Django的测试执行框架和各种实用程序,可以实现模拟HTTP请求、插入测试数据、检查应用程序的输出,以及验证常规代码是否在执行其应该做的事情。

8.2.2  编写和运行自动化测试

本小节主要分为两个部分,首先是说明如何使用Django框架编写测试,然后解释如何运行这些测试。学习完本小节的内容后,读者会发现Django框架的自动化测试确实很容易。

Django框架的单元测试使用了Python标准库模块unittest,该模块使用基于类的方法来定义测试。这里使用django.test.TestCase子类进行单元测试,django.test.TestCase是unittest.TestCase的子类,在事务中运行每个测试以提供独立的方式。

在编写实际测试用例之前,先简单介绍一下TestCase类的结构。常见的TestCase类由test_func()函数、setUp()函数和tearDown()函数组成。

  • test_func()是指实际编写了测试逻辑的函数。
  • setUp()函数是在test_func()函数之前执行的函数,常用于测试之前的初始化操作。
  • tearDown()函数是在test_func()函数之后执行的函数,常用于测试结束之后的收尾操作。

首先,我们创建一个用于自动化测试的项目MyTestSite,并添加一个应用testapp。然后,创建一个用于测试的模型,具体代码如下:

【代码8-1】(详见源代码MyTestSite项目的testapp/models.py文件)

01  from django.db import models
02  
03  # 在此处创建模型
04  class Students(models.Model):
05      name = models.CharField(max_length=32)
06      age = models.IntegerField()

【代码分析】

在第01行代码中,通过import关键字引入models模块。

在第04~06行代码中,创建了一个学生模型Students,继承自models.Model模型类。详细说明如下:

在第05行代码中,创建了一个CharField类型的name字段属性。

在第06行代码中,创建了一个IntegerField类型的age字段属性。

接下来,我们就可以在tests.py(创建应用时默认已存在)文件中编写自动化测试的代码了,具体如下:

【代码8-2】(详见源代码MyTestSite项目的testapp/tests.py文件)

01  from django.test import TestCase
02  
03  from .models import Students
04  
05  # Create your tests here.
06  class ModelTest(TestCase):
07      def setUp(self):
08          Students.objects.create(name='cici', age=7)
09          pass
10  
11      def test_students_model(self):
12          s = Students.objects.get(name='cici')
13          self.assertEqual(s.name, 'cici')
14          pass
15  
16      def tearDown(self):
17          pass

【代码分析】

在第01行代码中,通过import关键字引入TestCase模块。

在第03行代码中,通过import关键字引入测试代码中需要的Students模型。

在第06~17行代码中,创建了一个测试类ModelTest,继承自TestCase测试类,详细说明如下:

  • 在第07~09行代码中,在setUp()函数中进行了Students模型的初始化操作。在第08行代码中,创建了一条Students模型的学生数据(name='cici', age=7),我们将使用这条数据进行测试  演示。
  • 在第11~14行代码中,定义了一个测试方法test_students_model(),包含一个自身的self参数。注意,方法名称必须以“test”开头。其中,第13行代码通过self调用assertEqual()方法进行测试,判断学生的姓名是否与测试要求一致。
  • 在第16、17行代码中,定义了tearDown()函数,这里没有定义实际的操作代码。

下面,我们通过命令行指令python manage.py test app进行自动化测试,效果如图8.1所示。

图8.1  MyTestSite项目自动化测试(1)

图8.1显示的是测试成功的情况,如果测试时发现错误会是什么情况呢?下面我们对【代码8-2】稍加修改,加入一些错误测试,具体代码如下:

【代码8-3】(详见源代码MyTestSite项目的testapp/tests.py文件)

01  from django.test import TestCase
02  
03  from .models import Students
04  
05  # Create your tests here.
06  class ModelTest(TestCase):
07      def setUp(self):
08          Students.objects.create(name='cici', age=7)
09          pass
10  
11      def test_students_model(self):
12          s = Students.objects.get(name='cici')
13          self.assertEqual(s.name, 'cici')
14          self.assertEqual(s.age, 8)
15          pass
16  
17      def tearDown(self):
18          pass

【代码分析】

在第14行代码中,通过self调用assertEqual()方法进行测试,判断学生的年龄是否与测试要求一致。

下面,我们再次通过命令行指令python manage.py test app进行自动化测试,效果如图8.2所示。初始化学生的年龄为7,当我们测试年龄值是否等于8时,给出了错误提示信息(很清楚提示了“7 != 8”)。

图8.2  MyTestSite项目自动化测试(2)

8.2.3  数据库自动化测试

本小节基于前一小节介绍的Django项目(MyTestSite)介绍数据库自动化测试的过程。

首先,完善一下用于测试的模型,具体代码如下:

【代码8-4】(详见源代码MyTestSite项目的testapp/models.pym文件)

01  from django.db import models
02  
03  # 在此处创建模型
04  class Teachers(models.Model):
05      name = models.CharField(max_length=32)
06      pass
07  
08  class Clazz(models.Model):
09      name = models.CharField(max_length=16)
10      teachers = models.ManyToManyField(Teachers)
11      pass
12  
13  class Students(models.Model):
14      name = models.CharField(max_length=32)
15      age = models.IntegerField()
16      clazz = models.ForeignKey(Clazz, on_delete=models.CASCADE)
17      pass

【代码分析】

在第01行代码中,通过import关键字引入models模块。

在第04~06行代码中,创建了一个教师模型Teachers,继承自models.Model模型类,详细说明如下:

  • 在第05行代码中,创建了一个CharField类型的name字段属性。

在第08~11行代码中,创建了一个班级模型Clazz,继承自models.Model模型类,详细说明如下:

  • 在第09行代码中,创建了一个CharField类型的name字段属性。
  • 在第10行代码中,创建了一个与教师模型Teachers多对多关系的字段属性teachers。

在第13~17行代码中,创建了一个学生模型Students,继承自models.Model模型类,详细说明如下:

  • 在第14行代码中,创建了一个CharField类型的name字段属性。
  • 在第15行代码中,创建了一个IntegerField类型的age字段属性。
  • 在第16行代码中,创建了一个班级模型Clazz的外键字段属性clazz。

然后,我们就可以在tests.py(创建应用时默认已存在)文件中编写自动化测试的代码了,具体如下:

【代码8-5】(详见源代码MyTestSite项目的testapp/tests.py文件)

01  from django.test import TestCase
02  
03  from .models import Teachers, Clazz, Students
04  
05  # Create your tests here.
06  class ModelTest(TestCase):
07      def setUp(self):
08          t1 = Teachers.objects.create(name='liu')
09          t2 = Teachers.objects.create(name='guan')
10          t3 = Teachers.objects.create(name='zhang')
11          c = Clazz.objects.create(name='A1')
12          c.save()
13          c.teachers.add(t1)
14          c.teachers.add(t2)
15          c.teachers.add(t3)
16          c.save()
17          Students.objects.create(name='cici', age=7, clazz=c)
18          pass
19  
20      def test_teachers_model(self):
21          t1 = Teachers.objects.get(name='liu')
22          self.assertEqual(t1.name, 'liu')
23          t2 = Teachers.objects.get(name='guan')
24          self.assertEqual(t2.name, 'guan')
25          t3 = Teachers.objects.get(name='zhang')
26          self.assertEqual(t3.name, 'zhang')
27          pass
28  
29      def test_clazz_model(self):
30          t1 = Teachers.objects.get(name='liu')
31          t2 = Teachers.objects.get(name='guan')
32          t3 = Teachers.objects.get(name='zhang')
33          c = Clazz.objects.get(name='A1')
34          self.assertEqual(c.name, 'A1')
35          self.assertIn(t1, c.teachers.all())
36          self.assertIn(t2, c.teachers.all())
37          self.assertIn(t3, c.teachers.all())
38          pass
39  
40      def test_students_model(self):
41          s = Students.objects.get(name='cici')
42          self.assertEqual(s.name, 'cici')
43          c = Clazz.objects.get(name='A1')
44          self.assertEqual(s.clazz, c)
45          pass
46  
47      def tearDown(self):
48          pass

【代码分析】

在第07~18行代码中,在setUp()函数中分别对Teachers模型、Clazz模型和Students模型进行了初始化操作。

在第20~27行代码、第29~38行代码和第40~45行代码中,分别定义了一组测试方法test_teachers_model()、test_clazz_model()和test_students_model(),具体说明如下:

  • 在第35~37行代码中,分别通过self调用assertIn()方法进行测试,用于判断3个教师模型对象t1、t2和t3是否包含在班级模型Clazz的教师字段teachers里。
  • 在第44代码中,通过self调用assertEqual()方法进行测试,判断学生模型Students的外键clazz是否与班级模型Clazz的字段c一致。

下面,我们通过命令行指令python manage.py test app进行自动化测试,效果如图8.3所示。

图8.3  MyTestSite项目数据库自动化测试(1)

图8.3显示的是测试成功的情况,下面我们对【代码8-6】稍加修改,加入一些错误测试,具体代码如下:

【代码8-6】(详见源代码MyTestSite项目的testapp/tests.py文件)

01  from django.test import TestCase
02  
03  from .models import Teachers, Clazz, Students
04  
05  # Create your tests here.
06  class ModelTest(TestCase):
07      def setUp(self):
08          t1 = Teachers.objects.create(name='liu')
09          t2 = Teachers.objects.create(name='guan')
10          t3 = Teachers.objects.create(name='zhang')
11          c = Clazz.objects.create(name='A1')
12          c.save()
13          c.teachers.add(t1)
14          c.teachers.add(t2)
15          c.teachers.add(t3)
16          c.save()
17          Students.objects.create(name='cici', age=7, clazz=c)
18          pass
19  
20      def test_teachers_model(self):
21          t1 = Teachers.objects.get(name='liu')
22          self.assertEqual(t1.name, 'liu')
23          t2 = Teachers.objects.get(name='guan')
24          self.assertEqual(t2.name, 'guan')
25          t3 = Teachers.objects.get(name='zhang')
26          self.assertEqual(t3.name, 'zhang')
27          pass
28  
29      def test_clazz_model(self):
30          t1 = Teachers.objects.get(name='liu')
31          t2 = Teachers.objects.get(name='guan')
32          t3 = Teachers.objects.get(name='zhang')
33          c = Clazz.objects.get(name='A1')
34          self.assertEqual(c.name, 'A1')
35          self.assertIn(t1, c.teachers.all())
36          self.assertIn(t2, c.teachers.all())
37          self.assertNotIn(t3, c.teachers.all())
38          pass
39  
40      def test_students_model(self):
41          s = Students.objects.get(name='cici')
42          self.assertEqual(s.name, 'cici')
43          c = Clazz.objects.get(name='A1')
44          self.assertEqual(s.clazz, c)
45          pass
46  
47      def tearDown(self):
48          pass

【代码分析】

在第37行代码中,将通过self调用的assertIn()方法修改为assertNotIn()方法进行测试,判断教师模型对象t3是否不包含在班级模型Clazz的教师字段teachers里。

下面,我们再次通过命令行指令python manage.py test app进行自动化测试,效果如图8.4所示。因为教师模型对象t3包含在班级模型Clazz的教师字段teachers里,所以使用assertNotIn()方法进行测试时给出了相应的错误提示信息。

图8.4  MyTestSite项目数据库自动化测试(2)

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

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

相关文章

2024.8.27(Dokerfile的应用、私有仓库)

一、Dockerfile应用 1、通过dockerfile创建⼀个在启动容器时,就可以启动httpd服务的镜像 [rootdocker ~]# mkdir httpd0 [rootdocker ~]# cd httpd0 [rootdocker httpd0]# vim abc.sh [rootdocker httpd0]# ls abc.sh [rootdocker httpd0]# echo " httpd serv…

C语言重难点总结(2)-指针操作与结构体、动态内存

本节学习内容 1.指针操作与结构体 2.函数(递归函数) 3.动态内存 一、指针操作与结构体 指针可以作为结构体的内部成员使用,也可以使用结构体指针操作结构体空间。 二、函数 1.指针函数 (1)什么是指针函数&#x…

企业家必看的十种让利的商业模式解析!

在当今的商业领域,众多创业者正面临前所未有的挑战。市场竞争激烈,价格战频繁,吸引投资者和推广产品都变得异常艰难。然而,问题的关键在于对“人心”的洞察。人们天生追求利益,因此,掌握如何点燃市场需求和…

运维有必要学编程吗?应该学哪种编程语言?

在以往的观念中,运维的工作内容是不涉及编程、开发的,因此以前也没用学编程的需求。然而随着互联网的发展和变化,现如今,运维也需要开始接触开发,接触编程了。 当然有很多运维朋友,本身是不认可的。可&…

IDE之vscode:连接远程服务器代码(亲测OK),与pycharm链接服务器做对比(亲自使用过了)。

文章目录 前言一、链接服务器vscode和pycharm的对比1、pycharm2、vscode3、总结 二、VS Code的安装与下载三、链接远程服务器1、安装远程插件:Remote-SSH2、写ssh配置文件3、链接服务器4、登录成功,打开文件夹 前言 大模型开发肯定要在服务器了&#xff…

使用PyTorch AlexNet预训练模型对新数据集进行训练及预测

在 https://blog.csdn.net/fengbingchun/article/details/112709281 中介绍了AlexNet网络,这里使用PyTorch中提供的AlexNet预训练模型对新数据集进行训练,然后使用生成的模型进行预测。主要包括三部分:新数据集自动拆分、训练、预测 1.新数据…

C++竞赛初阶L1-14-第六单元-数组(31~33课)543: T456473 年龄与疾病

题目内容 某医院进行一项研究,想知道某项疾病是否与年龄有关。因此对以往的诊断记录进行整理,统计 0-18 、 19-35 、 36-60、 61 及以上这四个年龄段的患者人数占总患者人数的比例。 输入格式 输入共 2 行。 第一行包含一个整数 N(0<n≤100),表示总患者人数。 第二…

OpenCV绘图函数(1)绘制带箭头的直线函数arrowedLine()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 绘制一个从第一个点指向第二个点的箭头线段。 cv::arrowedLine 函数在图像中绘制一个从 pt1 到 pt2 的箭头。另见 line 函数。 函数原型 void c…

Android Auto推出全新Google助手设计

智能手机与汽车的无缝整合已成为现代驾驶的重要组成部分&#xff0c;而 Android Auto 一直在这一领域处于领先地位。谷歌通过不断推出新功能和更新&#xff0c;体现了其致力于提升 Android Auto 体验的决心。最近&#xff0c;Android Auto 引入了 Google助手的全新设计。 当系…

vue3 使用vue-masonry加载更多,重新渲染

在使用 van-list做上拉加载更多&#xff0c;加载下一页的时候&#xff0c;会出现瀑布图重叠&#xff0c;原因是布局没有重新更新&#xff0c;所以需要 调用 vue-masonry更新布局的方法。 看了源码才知道可以这样用&#xff0c;api都没写&#xff0c;隐藏太深了。。。 vue3中通…

随心笔记--测试报告

项目名称 随心笔记 版本号 / 发布类型 正式发布 测试负责人 ** 测试完成日期 2024.8. 联系方式 130576**** 评审人 批准人 评审日期 批准日期 1.项目背景 设计“随心笔记”这个项目的初衷是为了提供一个便捷、个性化的博客管理平台&#xff0c;满足用户记录生…

yarn vite脚手架 react+ts搭建项目

创建react 1、确保你已经安装了Node.js&#xff08;建议使用最新的LTS版本&#xff09;。 2、安装Yarn&#xff08;如果尚未安装&#xff09;: npm install -g yarn 3、创建新项目: yarn create vite 根据提示安装 vite脚手架&#xff0c;如果已安装无提示信息 直接填写项目名…

人脸表情识别数据集分享(内含处理过的AffectNet等数据集)

前言&#xff1a; 人脸表情识别有三大主流数据集rafdb、affectnet、ferplus&#xff0c;之前跑rafdb精度挺正常的&#xff0c;但是另外两个数据集复现不出来精度&#xff0c;经过几个月的踩坑&#xff0c;我发现其实是数据集的原因。 我在官方找的AffectNet数据集有几十个G&…

SQL 高阶 (sql优化)

批量插入&#xff1a; sql 批量插入&#xff1a; INSERT INTO users(name, age) VALUES (Tom, 20), (Jerry, 22), (Bob, 19); -- 该方式 适合 500条以内。多线程插入批量插入&#xff0c;能够大幅提升插入速度。 经过测试&#xff1a;系统性能&#xff0c;8核16G 插入10w条数…

Leetcode 1108. IP地址无效化 C++实现

Leetcode 1108. IP 地址无效化 问题&#xff1a;给你一个有效的 IPv4 地址address&#xff0c;返回这个 IP 地址的无效化版本。 所谓无效化 IP 地址&#xff0c;其实就是用 "[.]" 代替了每个 "."。 方法1&#xff1a;对字符串挨个进行判断&#xff0c;如…

java程序优化

Java程序的性能优化是一个复杂但非常重要的过程&#xff0c;它涉及多个方面。首先&#xff0c;我们需要识别性能瓶颈的具体位置&#xff0c;这通常可以通过性能分析工具&#xff08;如JProfiler, VisualVM等&#xff09;来完成。以下是一些通用的优化策略&#xff1a; 代码层面…

进程的创建与使用(win32-API)

一、前言 进程可以被视作操作系统中运行程序的一个实例&#xff0c;是系统资源分配和调度的基本单位。每一个进程都拥有自己独立的地址空间、一组状态信息&#xff08;如打开的文件、内存映射等&#xff09;&#xff0c;以及一个或多个线程来执行代码。进程之间的隔离性确保了…

飞睿智能家居人体微动感知雷达模组,宠物喂食器、LED灯控连续波雷达感应开关原理

在智能家居的浪潮中&#xff0c;飞睿智能人体微动感知雷达模组犹如一位“隐形守护者”&#xff0c;以其独特的连续波雷达感应开关原理&#xff0c;为我们带来更为智能、便捷的生活体验。今天&#xff0c;就让我们一起走进这一前沿科技&#xff0c;探索它是如何改变我们的生活。…

IOS 13 网络请求和Moya框架

允许HTTP请求 从iOS9开始&#xff0c;推荐使用HTTPS&#xff0c;如果使用的HTTP&#xff0c;默认情况下会出现如下错误&#xff1a; The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. 这是因为iOS9引…

中俄联袂 助力前行 点燃希望——助残义诊在杭州邦尔骨科医院顺利举行

8月26日&#xff0c;由杭州市残疾人联合会主办、临平区残疾人联合会承办&#xff0c;杭州市邦尔骨科医院协办的“中俄联袂 助力前行 点燃希望”助残义诊活动在该院1号楼门诊大厅顺利进行。此次活动得到了俄罗斯伊里扎洛夫中心医院和杭州市邦尔骨科医院专家的大力支持。 本次义诊…