单元测试很难么?

news2024/11/22 19:33:41
前言

你可能会用单元测试框架,python的unittest、pytest,Java的Junit、testNG等。

那么你会做单元测试么!当然了,这有什么难的?

test_demo.py

  1. def inc(x):

  2. return x + 1

  3. def test_answer():

  4. assert inc(3) == 4

inc() 是定义的一个被测函数,test_anserver() 用于测试上面的一段代码。

通过pytest运行上面的代码:

  1. > pytest test_demo.py

  2. ====================== test session starts ======================= platform win32 -- Python 3.7.1, pytest-5.0.1, py-1.8.0, pluggy-0.12.0

  3. rootdir: D:\vipcn\demo

  4. plugins: cov-2.7.1, forked-1.0.2, html-1.20.0, metadata-1.8.0, ordering-0.6, parallel-0.0.9, rerunfailures-7.0, xdist-1.28.0, seleniumbase-1.23.10

  5. collected 1 item

  6. test_demo.py . [100%]

  7. ==================== 1 passed in 0.08 seconds ====================

单元测试不就是这么单嘛!


那么Web项目中的单元测试如何做?

我们以Django Web框架为例,它是MTV开发模式。接下来会围绕着这个模式介绍如何做测试。

模型测试
  • M 指models,用于定义ORM,即对象关系映射,是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。

models.py 中的代码是这样的:

  1. from django.db import models

  2. class Question(models.Model):

  3. question_text = models.CharField(max_length=200)

  4. pub_date = models.DateTimeField(auto_now=True)

这里定义了两个类,这两个类即没有入参,也没有return返回值。如何测试呢?

测试代码如下:

  1. from django.test import TestCase

  2. from myapp.models import Question

  3. class QuestionTestCase(TestCase):

  4. def setUp(self):

  5. Question.objects.create(id=1, question_text="你会做单元测试么?")

  6. def test_question(self):

  7. """查询id=1的问题"""

  8. question = Question.objects.get(id=1)

  9. self.assertEqual(question.question_text, '你会做单元测试么?')

不知道你是否看懂了这段代码,django模型我们可以看作是数据库表,那么对于表的操作就是增删改查,这里先创建一条数据,再查询出这条数据,然后判断其字段是否正确。

视图测试
  • V 指views,用于接收前端发来的请求,可能需要调用数据库,把对应的数据处理之后,和HTML页面一同返回给前端。

views.py 代码如下:

  1. from django.shortcuts import render

  2. from .models import Question

  3. def index(request):

  4. latest_question_list = Question.objects.order_by('-pub_date')[:5]

  5. context = {'latest_question_list': latest_question_list}

  6. return render(request, 'polls/index.html', context)

index() 视图函数确实有入参,request包含的是客户端信息,比如请求的方法,请求的host,请求头Header等,这些客户端数据如何构造? return返回的是HTML页面,以及查询数据库的数据,如何针对这些数据写断言呢?

测试代码如下:

  1. from django.test import TestCase

  2. from myapp.models import Question

  3. class IndexTestCase(TestCase):

  4. def setUp(self):

  5. Question.objects.create(id=1, question_text="你会做单元测试么?")

  6. def test_index(self):

  7. """测试index视图"""

  8. response = self.client.get("/index")

  9. self.assertEqual(response.status_code, 200)

  10. self.assertTemplateUsed(response, "polls/index.html")

这里假定当浏览器访问 http://127.0.0.1:8000/index 时调用到index视图,返问题列表页面。

self.client.get() 可以模拟客户端浏览器发送 request GET 请求。拿到服务端的response,判断状态码是否为 200。 self.assertTemplateUsed() 断言返回的页面是否正确。

模板测试
  • T 指Teamplate,主要是HTML页面。用户在浏览器中输入URL地址,最终会得到一个HTML页面。

index.html代码如下:

  1. {% if latest_question_list %}

  2. <ul>

  3. {% for question in latest_question_list %}

  4. <li><a name="q" href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>

  5. {% endfor %}

  6. </ul>

  7. {% else %}

  8. <p>No polls are available.</p>

  9. {% endif %}

这里面的代码连个方法都没有,更别提入参和返回值了,请问怎么对HTML代码进行测试?

我们确实没有办法直接对HTML代码进行测试。不过,可以借助Selenium来做UI自动化测试,从而保证页面的正确性。

  1. from django.contrib.staticfiles.testing import StaticLiveServerTestCase

  2. from selenium import webdriver

  3. class MySeleniumTests(StaticLiveServerTestCase):

  4. @classmethod

  5. def setUpClass(cls):

  6. super().setUpClass()

  7. cls.selenium = webdriver.Chrome()

  8. cls.selenium.implicitly_wait(10)

  9. @classmethod

  10. def tearDownClass(cls):

  11. cls.selenium.quit()

  12. super().tearDownClass()

  13. def test_index_page(self):

  14. self.selenium.get('%s%s' % (self.live_server_url, '/index'))

  15. question_list = self.selenium.find_elements_by_name("q")

  16. for q in question_list:

  17. print(q.text)

Django封装了StaticLiveServerTestCase,让你在运行UI测试时会自动启动Django服务。 所以,你可以直接使用self.live_server_url 访问django启动的服务地址。

本文是否刷新了你对项目中单元测试的理解?那么问题来了,我上面的写的哪部分代码属于 单元测试?

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

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

相关文章

【计算机毕业设计】211校园约拍微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

行为树行为树行为树

行为树由一个个节点组成 结构&#xff1a;树状结构运行流程&#xff1a;从根节点开始自顶向下往下遍历&#xff0c;每经过一个节点就执行节点对应的功能。 我们规定&#xff0c;每个节点都提供自己的excute函数&#xff0c;返还执行失败/成功结果。 然后根据不同节点的执行结…

从0到1使用vite搭建react项目保姆级教程(持续更新中)

一、vite创建react项目 要使用Vite创建一个React项目&#xff0c;你需要按照以下步骤操作&#xff1a; 1、确保你已经安装了Node.js&#xff08;建议使用最新的稳定版本&#xff09;。 2、 使用npm命令安装Vite CLI工具&#xff0c;再来创建项目 npm create vitelatest my-vi…

【pytorch01】简单回归问题

1.梯度下降&#xff08;Gradient Descent&#xff09; y x 2 ∗ s i n ( x ) yx^{2}*sin(x) yx2∗sin(x) y ′ 2 ∗ x ∗ s i n ( x ) x 2 ∗ c o s ( x ) y2*x*sin(x) x^{2}*cos(x) y′2∗x∗sin(x)x2∗cos(x) 求最小值要求导 梯度下降定义&#xff1a;梯度下降要迭代计…

矿用行程位移传感器传感器ZE0701-06CU

矿用行程传感器概述 矿用行程传感器是一种专为煤矿等特定环境设计的传感器&#xff0c;用于监测和测量设备或部件的位移量。它们通常用于液压支架、千斤顶、掘进机等矿山设备中&#xff0c;帮助监测和控制设备的运动状态&#xff0c;以确保安全和高效的生产。 定义和功能 矿用…

异构集成封装类型2D、2.1D、2.3D、2.5D和3D封装技术

异构集成封装类型&#xff1a;2D、2.1D、2.3D、2.5D和3D封装详解 简介随着摩尔定律的放缓&#xff0c;半导体行业越来越多地采用芯片设计和异构集成封装来继续推动性能的提高。这种方法是将大型硅芯片分割成多个较小的芯片&#xff0c;分别进行设计、制造和优化&#xff0c;然后…

算法金 | 再见!!!梯度下降(多图)

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 接前天 李沐&#xff1a;用随机梯度下降来优化人生&#xff01; 今天把达叔 6 脉神剑给佩奇了&#xff0c;上 吴恩达&#xff1a;机器…

Python接口测试实战之搭建自动化测试框架

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一.数据分离:从Excel中读取数据 之前的用例中&#xff0c;数据直接写在代码文件里&#xff0c;不…

OpenAI新模型发布,免费开放GPT-4o!但只开放一点点...

GPT-4o 中的“o”代表“omni”——指的是 GPT-4o 的多模态。 该模型将向免费客户开放&#xff0c;这意味着任何人都可以通过 ChatGPT 访问 OpenAI 最先进的技术。 GPT-4o 是 OpenAI 昨天晚上发布的新旗舰模型&#xff0c;可以实时推理音频、视觉和文本。 据官方介绍&#xff0…

椭圆的标准方程与协方差矩阵的特征值和特征向量的关系

椭圆的标准方程与协方差矩阵的特征值和特征向量的关系 flyfish 单位圆 &#xff1a;单位圆表示在标准正交基下的分布。 椭圆 &#xff1a;通过协方差矩阵的特征向量和特征值变换得到的椭圆&#xff0c;表示数据在新的坐标系下的分布。 特征向量 &#xff1a;红色箭头表示特征…

【C语言】一维数组(详解)

目录 1. 数组的概念 2. 一维数组的创建和初始化 3. 一维数组的使用 4. 一维数组在内存中的存储 5. sizeof 计算数组元素个数 正文开始—— 1. 数组的概念 数组是一组相同类型元素的集合。 数组中存放的是1个或者多个数据&#xff0c;但是数组元素个数不能为0。…

运算放大器(运放)同相放大器电路

设计目标 输入电压ViMin输入电压ViMax输出VoMin输出VoMax电源Vcc电源Vee-1V1V-10V10V15V–15V 设计说明 这种设计将输入信号 Vi 放大&#xff0c;信号增益为 10V/V。输入信号可能来自高阻抗源&#xff08;例如 MΩ&#xff09;&#xff0c;因为该电路的输入阻抗由运算放大器…

vue3delete请求报403forbidden,前后端解决方式,cookie无效问题

在做开发时&#xff0c;前期已经在Controller类加上CrossOrigin(origins "*")&#xff0c;发送get和post请求都没问题&#xff0c;但遇到delete请求时&#xff0c;又报出跨域问题 一.前端添加proxy代理服务器&#xff08;未能解决&#xff09; 在vue.config.js中使…

PHP转Go系列 | 字符串的使用姿势

大家好&#xff0c;我是码农先森。 输出 在 PHP 语言中的输出比较简单&#xff0c;直接使用 echo 就可以。此外&#xff0c;在 PHP 中还有一个格式化输出函数 sprintf 可以用占位符替换字符串。 <?phpecho 码农先森; echo sprintf(码农:%s, 先森);在 Go 语言中调用它的输…

pikachu靶场之XSS漏洞测试

一、环境配置 1.pikachu官网下载 下载地址&#xff1a;https://github.com/zhuifengshaonianhanlu/pikachu 2.百度网盘&#xff08;里面含有pikachu跟phpstudy&#xff09; 链接&#xff1a;pikachu下载 密码&#xff1a;abcd 配置&#xff1a;pikachu下载及安装-图文详解…

14K屏FPGA通过MIPI接口点亮

一、屏参数 屏分辨率为13320*5120&#xff0c;MIPI接口8 LANE。 二、驱动接口电路 屏偏置电压5.5V&#xff0c;逻辑供电1.8V。8 LANE MIPI&#xff0c;2 PORT。 三、MIPI DSI规范 DCS (Display Command Set)&#xff1a;DCS是一个标准化的命令集&#xff0c;用于命令模式的显…

基于单片机的智能窗户控制系统的设计

摘 要&#xff1a; 根据单片机技术和现代传感器技术 &#xff0c; 本文主要针对基于单片机的智能窗户控制系统的设计进行探讨 &#xff0c; 仅供参考 。 关键词&#xff1a; 单片机 &#xff1b; 智能窗户 &#xff1b; 控制系统 &#xff1b; 设计 在现代科学技术持续发展的带…

融资融券两融利率最低多少?两融利率最低账户怎么申请?

融资融券账户余额理财技巧 融资融券账户不支持货币基金申赎、逆回购等业务&#xff0c;投资者可以将资金大于维保比例300%的部分通过银证转账转出再转入到普通账户&#xff0c;参与证券公司现金理财或逆回购等业务。 融券卖出和还券技巧 融券卖出所得的资金仅能用于买券还券&…

Linux操作系统学习:day05

内容来自&#xff1a;Linux介绍 视频推荐&#xff1a;[Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试]( 目录 day0530、删除用户31、添加和删除用户组创建用户组删除用户组 32、修改密码33、使用tar工具进行压缩和解压缩压缩解压缩 34、使用zip u…

▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch4 值迭代 与 策略迭代 【动态规划 算法】

PPT 截取必要信息。 课程网站做习题。总体 MOOC 过一遍 1、视频 学堂在线 习题 2、过 电子书 补充 【下载&#xff1a; 本章 PDF 电子书 GitHub】 [又看了一遍视频。原来第一次跳过了好多内容。。。] 3、总体 MOOC 过一遍 习题 学堂在线 课程页面链接 中国大学MOOC 课程页面链…