我不写单元测试,被批了

[敏捷开发实践] 为什么开发人员不愿意写单元测试? 为什么开发人员不愿意写单元测试? 单元测试是专业开发人员确保真正完成编程任务的有效手段之一。但是实际开发中,绝大多数开发人员却非常抵触写单元测试,这又是很残酷的现实。开发人员有100个理由不写单元测试。我观察了超过20个项目的实际开发过程,与项目经理交谈,与开发者交谈后,也很理解在项目开发过程中他们所面临的“囧境”。也许你会反驳我:“这是不可能吧,连学习软件工程专业的大学生都知道编码完成之后,要写单元测试来验证程序是否按照预期的想法工作……”,“这是什么水平的码农,难道他们不知道TDD吗……难道他们不重视 阅读详情

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

当我推广消息推送平台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和概念,推荐下这个教程: www.letianbiji.com/java-mockit…

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

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

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

Mock和Spy都是模拟创建出一个对象,区别在于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单元测试! 为了保证代码质量,在写完代码后,写单测是很有必要的。当然,在大部分情况下,我们可能不会写单测,而是直接把应用部署起来,直接自测,然后再联调。估计很大一部分人,都是用这种方式开发。当然,我之前也是按这个方式来开发,单测覆盖率纯粹是为了满足公司的指标要求,大部分流于形式。 阅读详情

相关推荐

BIM模型轻量化避坑指南:Revit导出GLTF常见问题及解决方案

本文深入探讨了BIM模型轻量化过程中,从Revit导出GLTF格式时遇到的常见问题与解决方案。针对文件体积膨胀、材质丢失、属性信息缺失等核心痛点,提供了从数据预处理、Draco几何压缩、纹理优化到Web端性能调优的全流程实战指南,帮助工程师高效实现BIM模型在WebGL环境中的流畅展示与交互。

wdx012345的博客 171

如何正确编写单元测试?

国内的大多数互联网公司只注重软件功能,却往往忽略了极为重要的软件质量,在一个月以前,我认为遵循了代码规范(阿里规约、sonar)的软件系统已经算是一个质量比较好的软件系统了,但是在我了解单元测试以后,才发现自己以前的想法有多么愚蠢,单元测试的作用远比我想象的要重要许多。经过一段时间的研究,总算对单元测试有了一个大概的了解,然而网上的文章零零散散,大多是讲解一些比较简单的demo,参考价值比较有限,因此我决定写一篇关于单元测试的文章来总结自己这段时间的收获与心得。

敲得码黛 7286

国产系统迁移实战:在银河麒麟V10上搞定Wine32位支持,让老Windows软件跑起来

本文详细介绍了在银河麒麟V10操作系统上构建Wine32位支持的全过程,帮助用户解决Windows应用迁移难题。从系统架构差异分析到Wine环境配置,再到实战应用部署与优化,提供了一套完整的解决方案,确保老Windows软件在国产系统上稳定运行。

weixin_32288959的博客 649

单元测试代码编写

单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。 单元测试不仅仅是作为无错编码一种辅助手段在一次性的开发过程中使用,单元测试必须是可重复的,无论是在软件修改,或是移植到新的运行环境的过程中。因此,所有的测试都必须在整个软件系统的生命周期中进行维护。       多数讲述单元测试的文章都是以Java为例,本文以C++

8479

PEMFC电化学入门:从电流密度到Tafel公式的实战计算指南

本文详细介绍了PEMFC电化学的基础知识,从电流密度计算到Tafel公式的应用,提供了实战计算指南。通过代码示例和常见问题排查,帮助工程师快速掌握燃料电池性能优化的关键参数,如交换电流密度和活化损失计算,适用于汽车动力和分布式发电等领域。

weixin_29229055的博客 552

别再为模糊的3D重建头疼了!手把手教你用3DSlicer处理DICOM数据,搞定医学影像三维可视化

本文详细解析了医学影像三维重建中常见的模糊问题,并手把手教你使用3DSlicer处理DICOM数据,实现精准的三维可视化。从层厚设置到数据格式转换,再到重建算法选择和渲染参数微调,提供了一套完整的优化方案,特别适合临床医生和医学影像处理人员提升工作效率。

weixin_28693447的博客 251

单元测试(Unit Testing) – 对已有代码添加单元测试

我最近接触单元测试比较多,有一些心得,希望能通过写几个专题帮助自己总结一下,这些专题不会花很多篇幅介绍单元测试的基础知识,而是偏重在实际应用中单元测试经常遇到的一些困难。 第一篇我想说说对已有代码添加单元测试的解决方案。虽然其中的代码是类似Delphi的,但是并不难懂,应该不会成为其他程序员阅读的障碍。 对单元测试有了解的朋友知道,单元测试能够尽早的发现程序中的bu

depend的专栏 2212

4.UE数字人工程运行逻辑及程序逻辑

UE数字人工程运行逻辑及程序逻辑

6090

为什么不写单元测试,要被批?

最近在看单元测试的东西,想跟大家聊聊我的感受。单元测试这块说实在的,我并不太熟悉,我几乎不写单元测试,也不太爱写单元测试。 当我推广消息推送平台austin的时候,有过批评我整个项目没有单元测试,也有过让我补上单元测试的。...

YYniannian的博客 151

AI辅助决策支持系统架构设计避坑:5个常见技术选型误区及正确方案

AI辅助决策支持系统(AI-DSS)是指通过人工智能技术(机器学习、自然语言处理、知识图谱等)赋能传统决策支持系统,帮助决策者在复杂业务场景中(如供应链优化、风险控制、医疗诊断、金融投资等)提升决策效率和准确性的系统。与传统BI工具不同,AI-DSS不仅能"展示数据",还能基于数据生成"决策建议"甚至"自动执行决策"。技术选型是AI-DSS架构设计的核心环节,涉及数据处理引擎、模型框架、算力资源、集成接口等关键组件的选择。效果不达标:模型预测精度低、决策建议不可用;成本失控:算力资源浪费、维护成本高企。

AIGC应用创新大全的博客 1384

halcon与QT联合:(5.1)瓶盖检测以及QT界面搭建

halcon实现瓶盖检测与定位代码: dev_close_window() dev_open_window(0, 0, 1024, 1024, 'black', WindowHandle) list_image_files('C:/Users/TIMI/Desktop/picture/circle', 'default', [], ImageFiles) for J := 1 to 4 by 1 *read image read_image(halconImage, ImageFil

m0_37957160的博客 1044

单元测试用例编写总结

单元测试用例编写总结 1 背景 测试是开发的一个非常重要的方面,可以在很大程度上决定一个应用程序的命运。良好的测试可以在早期捕获导致应用程序崩溃的问题,但较差的测试往往总是导致故障和停机。 单元测试用于测试各个代码组件,并确保代码按照预期的方式工作。单元测试由开发人员编写和执行。大多数情况下,使用JUnit或TestNG之类的测试框架。测试用例通常是在方法级别写入并通过自动化执行。

2万+

人工智能训练师三级考试备考全攻略|报名条件+真题+补贴申领一站式通关(2026版)

本专栏是人工智能训练师三级考证最完整的备考指南,共77篇文章,覆盖从职业认知、报名实操、AI基础知识、数据标注、模型训练测试部署、考前冲刺到考后进阶的全链路。本导读按模块整理了全部文章链接,帮你快速定位所需内容。人工智能训练师是国家认定的正式职业,证书可在osta.mohrss.gov.cn查询,三级证书可申领最高3120元技能补贴。

白话机器学习 1810

不写单元测试的我,被批了

最近在看的东西,想跟大家聊聊我的感受。单元测试这块说实在的,我并不太熟悉,我几乎不写单元测试,也不太爱写单元测试。当我推广消息推送平台austin的时候,有过批评我整个项目没有单元测试,也有过让我补上单元测试的。

kk_lzvvkpj的博客 935

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

我是凡哥,一年CRUD经验用十年的markdown程序员👨🏻‍💻常年被誉为职业八股文选手最近在看单元测试的东西,想跟大家聊聊我的感受。单元测试这块说实在的,我并不太熟悉,我几乎不写单元测试,也不太爱写单元测试。当我推广消息推送平台austin的时候,有过批评我整个项目没有单元测试,也有过让我补上单元测试的。

m0_70618214的博客 285

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

3y开发都不的不写单元测试,然后被被批了

他是3y,一年CRUD经验用十年的markdown程序员👨🏻‍💻常年被誉为职业八股文选手最近在看单元测试的东西,想跟大家聊聊我的感受。单元测试这块说实在的,我并不太熟悉,我几乎不写单元测试,也不太爱写单元测试。当我推广消息推送平台austin的时候,有过批评我整个项目没有单元测试,也有过让我补上单元测试的。

阿里大叔说测试的博客 634

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

该怎么写单元测试呢

然后掌握mock的技巧,写新方法的时候,尝试设计完接口后,先写下单测,慢慢的你就会有感觉了,在写单测时,你自然而然的会考虑到诸多边界值的处理,你写的代码质量也会提高,渐渐地就会感受到单测的好处。还有一点也很重要,其实我们写单测的时候,不应该过多的关注内部的逻辑,举个非常简单的加法例子,我们单测只关心add(1,1)的结果是2,我管你里面是的实现到底是位运算还是啥运算?好吧,这里需要强调一下,逻辑简单的类,其实没必要写单测,一般只是领导要求纯粹的追求覆盖率的时候,才会把这种简单的类补上去。...

LoveSummer 3万+

为什么国内程序员不喜欢写单元测试?

写到这里,已经近万字了。回顾我这些年的经历,从抵触单元测试到拥抱单元测试,从个人实践到团队推广,我深深感受到这条路的漫长和艰难。国内程序员不喜欢写单元测试,不是因为我们技术水平不够,也不是因为我们不够专业。而是因为我们面临的环境、压力、约束确实不一样。但我相信,随着行业的成熟,技术的进步,以及新一代程序员的成长,这种状况会逐步改善。我们这一代人可能改变不了整个行业,但至少可以在自己的项目中、自己的团队中,播下质量的种子。也许十年后,当我们回头看今天的讨论时,会觉得这些问题都不是问题。

码到成功 1169

如何写好单元测试:Mock脱离数据库+不使用@SpringBootTest

目录 1、一般的单元测试写法 2、单元测试步骤 3、对一般的单元测试写法分析优化 4、最佳的单元测试写法:Mock脱离数据库+不启动Spring+优化测试速度+不引入项目组件 一、普遍的单元测试方法 作为一个Java后端程序员,肯定需要写单元测试。我先提供一个典型的错误的单元测试例子: @RunWith(SpringRunner.class) @SpringBootTest(cla...

FromNowOnUntilTheEnd 4万+

程序员为什么不写单元测试?

一、为了单元测试而写单元测试     最近笔者曾经做过一次“程序员在项目开发中编写单元测试的情况”的调查。      调查结果显示: 1. 几乎没有严格在项目中执行TDD(,TDD)。 2. 为大部份业务方法编写单元测试,并保证方法测试通过,占16.6%。 3. 偶尔编写单元测试,一般情况下不写单元测试,占58.3%。 4. 为了应付项目检查而写单

每天都有新发现 4429
上一篇: “68道 Redis+168道 MySQL”精品面试题(带解析),你背废了吗?
下一篇: 手把手带领小伙伴们写一个分布式事务案例!
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值