不写单元测试的我,被批了 ,怎么说?

news2024/11/26 7:50:58

我是凡哥,一年CRUD经验用十年的markdown程序员👨🏻‍💻常年被誉为职业八股文选手

最近在看单元测试的东西,想跟大家聊聊我的感受。单元测试这块说实在的,我并不太熟悉,我几乎不写单元测试,也不太爱写单元测试。

当我推广消息推送平台austin的时候,有过批评我整个项目没有单元测试,也有过让我补上单元测试的。

01、单元测试(UNIT TEST)

我有个前同事进了外企,他说进了外企以后学习了很多新名词,刚进去时都不知道他们讲的是什么...

他问我:UT你知道是什么意思吗?

我说:不知道啊。

他说:UT是Unit Test,单元测试

我说:你们现在都要写单元测试吗?

他说:是啊

后来,我在群里闲聊的时候,发现有个企鹅上班的大哥也不知道UT是什么意思,那我就放心了。

02、测试类型有什么

测试类型对于我们开发人员来说,或许可以归纳分为三类:

1、单元测试:对某个类中的代码进行测试,查看是否正常

2、集成测试:跨模块测试查看代码是否正常

3、端到端测试:以用户的角度把系统作为一个整体看功能是否正常

所以,在我们程序员里谈单元测试的时候,可能会是纯单元测试,也可能是集成测试,毕竟这块大概率都应该是我们干的。

03、为什么要单元测试

对于我这种不怎么写单元测试的,也不爱写单元测试的,在我的嘴里自然就编不出要写单元测试的理由了,倒是不写单元测试的理由是一堆堆的。

说到单元测试,就不得不提起另一个词,TDD(Test-Driven Development)测试驱动开发:在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码

测试驱动开发虽然饱受争议,不过有这种方法论的推出并有不少的同行在践行,起码能够说明测试的重要性

1、当我们想测试部分代码逻辑是否正常的时候,我们可能会直接psvm来构造数据进而调试。那如果有一种东西能把我们psvm统一放到某个地方呢?

2、当我们在一个系统里边修改了很多代码时,又不确定改动是否影响在核心逻辑时。那如果有一种东西能在编译的时候,顺便自动跑一遍逻辑做回归呢?无论是重构还是正式提测前,都提高了自己写代码的信心。

3、当我们很容易一不小心时就把代码写成一坨屎,那如果有一种东西能让我们在编码的时候就注重自己的代码设计呢?

4、当我们这个季度什么都没干,但是系统没发生过故障,那如果有一种东西能让我们在KPI上添上浓墨的一笔呢?

5、....欢迎补充

没错,这东西就是单元测试

04、单元测试怎么写?

很长一段时间里,怎么写单元测试我的知识就停留在Junit上。后来,跟我那个进外企的小伙伴以及群里的滴滴哥交流了以后,发现他们都会用Mockito这个框架去写单元测试

在这个过程中, 我看了些关于Mockito单元测试的文章,但总会有专业术语给我劝退,到这里我就很明白,我要边写边看了。

1、SpringBoot环境下使用Mockito只需要引入spring-boot-starter-test就好了,默认内置了Mockito相关的依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
</dependency>

2、我们单元测试是写在对应的test目录下的,想想都知道会有插件可以帮我们通过主类成为出对应的测试类,是不需要我们手动去建包和建测试类的。

于是,我找到了squaretest插件

3、看几篇Mockito相关的教程,了解其API和概念,推荐下这个教程: https://www.letianbiji.com/java-mockito/mockito-mock.html

4、亲自动手写一个单元测试,了解其编写过程和感受体验

有的人可能看到这里就要问了:为什么要用Mockito这种测试框架而不是纯用Junit? 在我的看来,答案就是:我们在测试时对象可能是Spring下的,我们不能直接new,又或是new出来的对象成本很大(还得解决依赖等问题)

这时候,我们就需要Mock对象出来模拟我们创建了这个对象,而在学习Mockito测试框架在这个过程中,其实就是对Mock/Stub/Spy概念的理解以及他们的使用。

MockSpy都是模拟创建出一个对象,区别在于Spy模拟创建出的对象是会真实调用方法的,而Mock模拟创建出的对象是不会真实调用方法的

Mock模拟创建出来的对象不会调用真实方法,但我们又想验证其流程怎么办?

比如,我在写service层的单元测试,我认为dao层的代码是正常的,但是service是需要dao的对象访问数据库的,这时候我Mock出dao的模拟对象,去调用方法。

所以我会假定调用dao层的某方法时它的返回值是什么,这个过程就是Stub

05、集成测试怎么写

在刚刚,我们使用Mockito的时候,是没有依赖Spring环境的,对象都是Mock出来的,速度杠杠的,非常快。但我们很多时候可能是需要依赖Spring环境跨模块去调试功能是否正常。

这时候,我们就要使用 @SpringTest来修饰测试类指明我这个是需要Spring环境的。既然有了Spring环境,那 @Autowire之类的注解都是可以用的。

在web模块下启动的话,你会发现它就真的启动了应用相关的环境,然后专门跑了这个测试方法。

05、为什么我不爱写单元测试

我是写完了业务代码,然后再回过头来写单元测试。单元测试是我自己写的,我Mock出来模拟对象再Stub,整个过程中我都是认为我写的代码是正确的。

写完了以后,看到绿色的条框我并不意外,毕竟我是对着我的业务代码写的单元测试。而集成测试都把Spring环境相关的依赖都整进去了,我直接在本地启动服务也能自己调呀。

(我相信看到这篇文章绝大多数人都不是TDD模式开发,应该都是对着自己写好的业务代码写单元测试)

写单元测试的代码也是代码,也是要花时间的呀

我也去问了腾讯/滴滴/阿里/字节的朋友,发现他们也不爱写单测,很多时候写单测就是为了通过编译,为了业务的覆盖率,能绕开就绕开了。

为什么没有问京东/拼多多/美团/网易等等的?别问,问就是还没太熟。

看到这篇文章的同行肯定是有在团队推行写单元测试的,不妨在评论区写下理由拯救一下我们这些迷途不爱写单元测试的羔羊

如果想学Java项目的,我还是强烈推荐我的开源项目消息推送平台Austin,可以用作毕业设计,可以用作校招,可以看看生产环境是怎么推送消息的。



如果你对自己的基础知识并不自信,我是建议再系统性的学习一下,为了帮助大家提高学习效率,我已经整理好了一套软件测试进阶学习笔记。

接下来我将分享一下这些年来,我对于技术一些归纳和总结,和自己对作为一名 高级测试工程师需要掌握那些技能的笔记分享,希望能帮助到有心在技术这条道路上一路走到黑的朋友!

一、Linux必备知识

linux作为现在最流行的软件环境系统,一定需要掌握,目前的招聘要求都需要有linux能力。

二、Shell脚本

掌握shell脚本,包括shell基础与应用、shell逻辑控制、shell逻辑函数等。

三、互联网程序原理

自动化必由之路:前端开发基础知识以及互联网网络必备知识。

 四、Mysql数据库

软件测试工程师必备Mysql数据库知识,不仅仅停留在基本的“增删改查”。

 五、抓包工具

Fiddler、Wireshark、Sniffer、Tcpdump各种抓包工具适用于各种项目,总有一款适合你。

 六、接口测试工具

接口测试神器,你绕不开的强大工具:Jmeter。小巧灵活:Postman。

 七、Web自动化测试Java&Pyhton

了解自动化的目的,熟练掌握testng&unittest自动化框架,以及断言与日志处理。

 八、接口自动化与手机自动化

专业接口调用、测试解决方案。组建完整的web和接口自动化框架,Appium整体使用。

 九、敏捷测试&TestOps构建

揭开TestOps的神秘面纱,持续集成Jenkins框架烂熟于心。

 十、性能测试&安全测试

软件测试的彼岸:性能测试和安全测试,选对方向,努力爬坑吧!

上面就是我为大家整理出来的一份软件测试工程师发展方向知识架构体系图。希望大家能照着这个体系,完成这样一个体系的构建。可以说,这个过程会让你痛不欲生,但只要你熬过去了。以后的生活就轻松很多。正所谓万事开头难,只要迈出了第一步,你就已经成功了一半,古人说的好“不积跬步,无以至千里。”等到完成之后再回顾这一段路程的时候,你肯定会感慨良多。

作为一位过来人也是希望你们少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。需要的朋友,可以关注我的公众号【软件测试凡哥】免费获取!

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

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

相关文章

k8s 的 Deployment控制器

1. RS与RC与Deployment关联 RC&#xff08;Replication Controller&#xff09;主要作用就是用来确保容器应用的副本数始终保持在用户定义的副本数。即如果有容器异常退出&#xff0c;会自动创建新的pod来替代&#xff1b;而如果异常多出来的容器也会自动回收。K8S官方建议使用…

JDBC BasicDAO详解(通俗易懂)

目录 一、前言 二、BasicDAO的引入 1.为什么需要BasicDAO&#xff1f; 2.BasicDAO示意图 : 三、BasicDAO的分析 1.基本说明 : 2.简单设计 : 四、BasicDAO的实现 0.准备工作 : 1.工具类 : 2.JavaBean类 : 3.BasicDAO类 / StusDAO类 : 4.测试类 : 一、前言 第七节内容…

一文读懂物联网平台如何搞定80%以上的物联网项目

太卷了&#xff01;一套物联网平台就能搞定80%以上的项目&#xff1f;&#xff01; 在刚刚结束的AIRIOT4.0物联网平台发布会上&#xff0c;航天科技控股集团股份有限公司智慧物联事业部总经理田淼给出答案。 在主题演讲环节&#xff0c;田总以【80%的物联网项目服务商都会面临…

分组函数group by使用技巧

一、需求&#xff1a;获取销售版本组合 颜色&#xff08;属性名&#xff09; (黑色&#xff0c;白色…) 属性值集合 Datapublic static class ItemSaleAttrsVo{private Long attrId;private String attrName;//当前属性有多少种版本&#xff1a;黑色,白色,蓝色&#xff0c;这里…

奇妙敏捷之旅·青岛站,真的太酷啦!

高手的世界里&#xff0c;一块小小的积木&#xff0c;也能立刻感受敏捷的乐趣&#xff01; 2023奇妙敏捷之旅青岛站&#xff0c;希望将理论知识、实践应用融入互动过程&#xff0c;实现思维的交流、碰撞以及面对面的沟通。因此&#xff0c;大家看到的奇妙敏捷之旅的现场&#…

Linux:课后习题及其答案

第一章 Linux系统初步了解 Q1&#xff1a;简述Linux系统的应用领域 Linux服务器、嵌入式Linux系统、软件开发平台、桌面应用 Q2&#xff1a;Linux系统的特点 开放性、多用户、多任务、良好的用户界面、设备独立性、丰富的网络功能、可靠的系统安全、良好的可移植性 Q3&#…

oracle19c rac、nfs部署教程

本文基于19c进行部署&#xff0c;使用centos7.9,nfs做共享存储 一、首先进行网络规划和配置 该实验一共三台机器一台是nfs,另外两台做rac 1.每台机器至少2块网卡,网卡名字必须一样&#xff08;publicip和VIP使用的是同一张网卡&#xff0c;privilegeip是另外一张网卡改ip 仅做r…

C语言中断言库与断言函数assert()的用法总结

断言库与断言函数的相关使用总结&#xff01; 断言函数的使用断言函数及断言库总结#define NDEBUG 断言函数在实现常见算法中的使用 断言函数的使用 话不多说&#xff0c;先来个例子感受一番断言函数assert()到底有什么功能。 由上面例子可知&#xff0c;assert()函数中在z的…

快速开发框架:一招解锁企业流程化管理!

在流程化管理时代&#xff0c;什么样的平台可以帮助企业实现高效率发展&#xff1f;在信息化爆炸式发展的今天&#xff0c;有很多企业期望能通过专用的快速开发框架实现提质增效发展。目前&#xff0c;低代码技术平台是较为盛行的平台&#xff0c;拥有易操作、灵活、增效等优势…

AntDB数据库灾备方案介绍

AntDB灾备方案(双中心方案) AntDB数据库节点分布于两个机房&#xff0c;并使用 patroni etcd 组件进行HA管理&#xff0c;主节点故障时能自动切换。切换时优先选择同机房的同步slave节点选举为new master。 部署图中相关组件说明&#xff1a; ⚫patroni&#xff1a;通过参…

Revit中楼梯该怎么画?包教包会!

绘制楼梯是室内装修中必不可少的一部分&#xff0c;因为楼梯的安装不仅仅是为了连接不同楼层&#xff0c;更是装饰整个室内空间的重要组成部分。 在楼梯的绘制过程中&#xff0c;需要结合实际情况进行设计&#xff0c;包括楼层高度、楼梯数量、台阶宽度、扶手高度等因素&#…

AntDB数据冷热分离方案

数据冷热分离 数据的存在价值&#xff0c;在于其被使用的程度&#xff0c;即被查询或更新的频率。在不同的业务系统中&#xff0c;人们对处于不同时期的数据有着不同的使用需求。比如&#xff0c;在网络流量行为分析系统中&#xff0c;客户会对最近一个月公司发生的安全事件和…

树莓派系统卸载桌面环境及系统瘦身

在我们刚入门树莓派时使用都是带桌面环境的系统&#xff0c;系统自带了非常多的实用软件&#xff0c;在学习和使用了一段时间后&#xff0c;我发现已经完全用不到桌面环境了&#xff0c;平时几乎都是通过 ssh 远程工具进行交互&#xff0c;并以命令形式来对系统进行操作。 Ras…

PHP日期时间函数date() 详解

**date()函数是我们在php开发中常碰到并且会使用到的一个日期函数&#xff0c;下面我来给大家介绍date()函数的一些基本扮靓和方法&#xff0c;有需要了解的朋友可进入参考. 日期时间函数是PHP 的核心组成部分。无需安装即可使用这些函数。下面来详细说说date函数的具体用法&a…

Python(request)爬虫有多强大?

requests是Python中的一种HTTP客户端库&#xff0c;用于发送HTTP请求并获取服务器响应。使用requests库可以轻松地进行常见的HTTP操作&#xff0c;如GET、POST、PUT、DELETE等&#xff0c;支持HTTPS和HTTP连接以及摘要验证、基本认证等身份验证方式。 因此&#xff0c;Python的…

嵌入式QT 树形浏览 - navListView

目录 1、什么是树形浏览 2、示例 3、树形浏览设计依赖文件 4、navListView 使用过程 4.1 添加文件 4.2 QListView提升为树形浏览 4.3 树形浏览设计 4.4 树形浏览功能实现 4.5 界面切换 4.6 树形浏览实现界面切换 1、什么是树形浏览 像下图这种左侧带有可以点击切换…

“小白“如何理解数据库

目录 前言 1.什么是数据库 2.数据库的用处 2.1数据库与文件的对比 3.使用数据库 3.1建立数据库 3.2建立表 3.3存储数据 4.服务器&#xff0c;数据库&#xff0c;表关系 5.数据库的分类 5.1MySQL架构 5.2SQL分类 5.3存储引擎 5.3.1什么是存储引擎 5.3.2如何查看存…

Lucene(9):Lucene优化

1 解决大量磁盘IO config.setMaxBufferedDocs(100000); 控制写入一个新的segment前内存中保存的document的数目,设置较大的数目可以加快建索引速度。 数值越大索引速度越快, 但是会消耗更多的内存 indexWriter.forceMerge(文档数量); 设置N个文档合并为一个段 …

easyexcel多行不同的表头导出

easyexcel多行不同的表头导出&#xff08;多表格不同表头&#xff09; 一、效果展示 二、代码 /*** 导出月度报表数据信息*/ApiOperation(value "导出月度报表数据信息")Log(title "导出月度报表", businessType BusinessType.EXPORT)RequestMapping(…

linux 下 sqlserver 连接 与开发准备

最近需要再linux下开发一个服务链接SQLserver。但是没有相关经验&#xff0c;然后参考了网上的一些博客。有点心得记录如下。 主要参考了这个&#xff1a;linux连接到sqlserver命令行,Linux 下连接sqlserver (上)_廖俊涛的博客-CSDN博客linux连接到sqlserver命令行,Linux 下连…