单元测试编写_为什么要编写单元测试-测试技巧8

单元测试编写

我对最近的博客“您应该测试什么”有很多React,有些人出于各种原因与我达成一致,另一些人则认为建议某些类可能不需要单元测试是完全危险的。 已经处理了什么测试,今天的博客涉及为什么要编写单元测试,而今天的示例代码是基于一个真实的故事:只有姓名,日期和事实已经改变。

一位客户最近请求紧急释放一些代码,以出于法律原因在其网站的相应页面上在屏幕上显示一条消息。

方案是,如果数据库中存在一条信息,则应在屏幕上显示该信息–这是一个非常简单的方案,可以通过几行简单的代码行就可以覆盖。 但是,在急于编写代码的过程中,开发人员没有编写任何单元测试,并且代码中包含一个直到补丁到达UAT才发现的错误。 您可能会问到错误是什么,这是我们在职业生涯中某个时候都已经完成的事情:添加不需要的分号';'。 到一行的结尾。

我将使用我以前的“测试技术”博客中使用的AddressService场景来演示代码的重新编写的特技双重版本,如下UML图所示:

在此演示中,功能已更改,但是逻辑和示例代码结构基本上保持不变。 在AddressService领域中 ,逻辑运行如下:

  1. 从数据库获取地址。
  2. 如果地址存在,则将其格式化并返回结果字符串。
  3. 如果地址不存在,则返回null。
  4. 如果格式化失败,请不要担心,并返回null。

重新编写的AddressService.findAddress(…)看起来像这样:

@Component
public class AddressService {private static final Logger logger = LoggerFactory.getLogger(AddressService.class);private AddressDao addressDao;public String findAddressText(int id) {logger.info("In Address Service with id: " + id);Address address = addressDao.findAddress(id);String formattedAddress = null;if (address != null);try {formattedAddress = address.format();} catch (AddressFormatException e) {// That's okay in this business case so ignore it}logger.info("Leaving Address Service with id: " + id);return formattedAddress;}@Autowired@Qualifier("addressDao")void setAddressDao(AddressDao addressDao) {this.addressDao = addressDao;}
}

您发现错误了吗? 当我查看代码时,我没有……为了以防万一,我在下面注释了一个屏幕截图:

演示一个琐碎的错误(任何人都可以犯的一个简单错误)的目的是强调编写一些单元测试的重要性,因为单元测试可以发现问题并节省大量的时间和费用。 当然,每个组织都不同,但是发布上面的代码会导致以下事件序列:

  • 该应用程序已部署到开发,测试和UAT。
  • 测试团队检查了修改后的屏幕是否可以正常工作并通过了更改。
  • 其他屏幕经过回归测试,发现不正确。 记录所有失败的屏幕。
  • 提出了紧急的错误报告。
  • 该报告通过各个管理级别。
  • 该报告已传递给我(我想念午餐),以调查可能的问题。
  • 该报告将发送给团队的其他三名成员进行调查(四双眼睛比一只更好)
  • 找到并修复了有问题的分号。
  • 该代码在dev中进行了重新测试,并签入到源代码管理中。
  • 该应用程序已构建并部署到开发,测试和UAT。
  • 测试团队检查修改后的屏幕是否可以正常工作并通过更改。
  • 其他屏幕经过回归测试并通过。
  • 紧急修复程序已通过。

上述一系列事件显然浪费了大量的工时,浪费了大量现金,不必要地增加了人们的压力水平,并破坏了我们在客户中的声誉: 所有这些都是编写单元测试的很好理由。

为了证明这一点,我编写了三个缺失的单元测试,只花了我额外的15分钟开发时间,与浪费的工时相比,这似乎是开发人员时间的一种很好的利用。

@RunWith(UnitilsJUnit4TestClassRunner.class)
public class WhyToTestAddressServiceTest {private AddressService instance;@Mockprivate AddressDao mockDao;@Mockprivate Address mockAddress;/*** @throws java.lang.Exception*/@Beforepublic void setUp() throws Exception {instance = new AddressService();instance.setAddressDao(mockDao);}/*** This test passes with the bug in the code* * Scenario: The Address object is found in the database and can return a* formatted address*/@Testpublic void testFindAddressText_Address_Found() throws AddressFormatException {final int id = 1;expect(mockDao.findAddress(id)).andReturn(mockAddress);expect(mockAddress.format()).andReturn("This is an address");replay();instance.findAddressText(id);verify();}/*** This test fails with the bug in the code* * Scenario: The Address Object is not found and the method returns null*/@Testpublic void testFindAddressText_Address_Not_Found() throws AddressFormatException {final int id = 1;expect(mockDao.findAddress(id)).andReturn(null);replay();instance.findAddressText(id);verify();}/*** This test passes with the bug in the code* * Scenario: The Address Object is found but the data is incomplete and so a* null is returned.*/@Testpublic void testFindAddressText_Address_Found_But_Cant_Format() throws AddressFormatException {final int id = 1;expect(mockDao.findAddress(id)).andReturn(mockAddress);expect(mockAddress.format()).andThrow(new AddressFormatException());replay();instance.findAddressText(id);verify();}
}

最后,冒着自鸣得意的风险,我不得不承认,尽管在这种情况下该错误不是我的,但在我学会编写单元测试之前,我过去曾将类似的错误发布到野外……
可从GitHub上获得源代码:

git://github.com/roghughe/captaindebug.git

参考: 为什么要编写单元测试–来自JCG合作伙伴 Roger Hughes的测试技巧8 ,在Captain Debug's Blog中 。

相关文章 :

  • 测试技巧–不编写测试
  • 端到端测试的滥用–测试技术2
  • 您应该对什么进行单元测试? –测试技术3
  • 常规单元测试和存根–测​​试技术4
  • 使用模拟的单元测试–测试技术5
  • 为旧版代码创建存根-测试技术6
  • 有关为旧版代码创建存根的更多信息–测试技术7
  • 一些定义–测试技术9

翻译自: https://www.javacodegeeks.com/2011/12/why-you-should-write-unit-tests-testing.html

单元测试编写

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

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

相关文章

webapi get请求 FromUri list参数传递

今天做项目调用第三方的webapi时,发现get请求竟然用的是FromUri list参数,汗... 这里简单记录下请求传参的方式(但不推荐大家使用get FromUri list参数 来定义webapi的功能): 1        HttpClient hClient new…

51cto 检测ip地址冲突_在Linux中发现IP地址冲突的方法

IP冲突,是不会像Windows那样,在右下角弹出冲突提示的。博主就出过一次糗,记得当时是在VM虚拟机里面安装了4个4个Redhat都是VM克隆出来的、完全一致的原来,是那台频繁掉线的虚拟系统和其他部门的办公电脑出现了IP冲突,由…

在计算机网络中可用于信息传输的介质,在计算机网络中,双绞线、同轴电缆及光纤等用于传输信息的载体被称为______介质。...

函数ReadDat()的功能是实现从文件ENG49.IN中读取一篇英文文章,存入到字符串数组xx中。请编制函数encryptChar(),按给定的替代关系对数组xx中所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文…

7个顶级资源网站,不知道就很可惜

说起搜索资源,大家肯定先想到百度,的确“度娘”很万能,能帮我们解决很多问题,但毕竟百度资源有限,用的人多了就造成重复的问题,接下来,小编给大家分享7个顶级资源搜索网站,能满足你很…

使用ab对站点进行压力测试

测试指令: window下: E:\wamp\bin\apache\Apache2.2.21\bin> .\ab -V //查看是否按照了ab:(V 大写) E:\wamp\bin\apache\Apache2.2.21\bin> .\ab -n1000 -c100 http://www.harris.com linux 下: #ab -n1000 -c100 http://www.harris.…

通过Pax考试对JBoss Fuse 6.x进行集成测试,第一部分

JBoss Fuse是一个功能强大的分布式集成平台,具有内置功能,用于集中集成的微服务部署的集中式配置管理,服务发现,版本控制,API网关,负载平衡,故障转移等。 JBoss Fuse 6.x构建在Fabric8 1.x开源项…

【APICloud系列|3】开发APP对UI的一般性要求

以前用APICloud平台开发过一款APP,已经上线,现在担任CTO对UI普及一下常识。 总结 UI图:640*960、1280*720 图标大小:200*200、64*64 图片的格式:png 底部导航栏:两种图片不同颜色。 说明:

浙江大学计算机研究生分数线初试单科学科,计算机考研|这两所自划线,单科没过线也能复试?!...

东南、浙大!单科没过线也能复试!1.东南大学:统考考生(不含报考苏州联合研究生院考生和管理类联考考生)总分超过报考专业复试线20分以上,单科(限一门)可降2分。2.浙江大学:分数线(管理类联考除外)满足以下情况视同上线&…

python中改变参数值的方法_Python实现partial改变方法默认参数

Python实现partial改变方法默认参数时间:2020-11-18 06:19:00 作者:背锅熊 阅读:114次撤稿申请下边就看下简易的运用检测案例。实际编码以下:#!/usr/bin/env python# -*- coding: utf-8 -*-#python2.7x#partial.py#authror: orang…

量子计算机专业大学排名,世界十大新科技排名,量子计算机排第一名(2)

4、从空气中收集净水详细介绍:这项科技对于缺少水资源的国家地区来说会有很大的帮助,而且不需要耗费过多的资源。来自MIT和加州大学伯克利分校的研究团队通过一类新型多孔晶体——金属有机骨架,在空气湿度低至20%的环境下成功收集净水&#x…

java 拉起服务_技术开发者应该如何构建小团队的微服务方案?

作者 | 徐鹏责编 | 刘静出品 | CSDN(ID:CSDNnews)我们的产品是Linkflow,企业运营人员使用的客户数据平台(CDP)。产品的一个重要部分类似企业版的”捷径”,让运营人员可以像搭乐高积木一样创建企业的自动化流程,无需编程即可让数据…

【APICloud系列|4】APP设计统一图标大小的方法

当我们想要在整理设计稿中出现的图标,整理除了汇总之外,还需要重新调整一下图标的大小,使他们看起来“差不多大”。想要弄成一致性和统一性,非常的麻烦和耗时。 最后在谷歌的Material Design找到了一种规定的方式。 举例&#x…

Spicy Spring:动态创建自己的BeanDefinition

当我们有一个Spring托管的应用程序时,我们想让Spring管理所有的bean。 除了使用已知解决方案(例如带注释的bean,Java配置和XML配置)创建bean的常规方法之外,还有一种方法可以用来创建自己的BeanDefinition 。 使用Bea…

【APICloud系列|5】一键生成APP所有图标

图标尺寸一般为:16*16px、512*512px、1024*1024px. 生成APP常见的图标尺寸的办法有2种: 第一种:自己根据设计出来的APP图标尺寸自己调整图标icon尺寸大小。 第二种:借助第三方神器和在线生成图标icon工具来完成。 1.网址&#xff…

台式计算机调整显示亮度,台式电脑显示器屏幕亮度怎么调节?

电脑屏幕过高会对眼睛造成伤害,在晚上用电脑工作时尤其如此。那么,台式电脑显示器屏幕亮度该怎么调节呢?一 利用屏幕按键调节电脑显示器上带有几个按键,通过它可以调节屏幕亮度。这个很简单,除了一个是关闭屏幕亮度的按…

html排序按钮_插件分享 | 可进行排序扫描任务的Task Queue

前言:在以往hvv场景中使用Goby的过程总是存在一个痛点:时间短,目标多,只能盯着扫描进度结束后才能手动返回到初始界面开启下一个扫描任务(内心极度狂躁)。本次Goby更新后又开放了新的插件入口点以及API,使添加扫描任务…

RabbitMQ如何做到不丢不重

目录 MQTT协议 如何保证消息100%不丢失 生产端可靠性投递 ​编辑 RabbitMQ的Broker端投 (1)消息持久化 (2)设置集群镜像模式 (3)消息补偿机制 消费端 ACK机制改为手动 总结 MQTT协议 先来说下MQTT…

【LESS系列】简介和使用

LESS —— 一个CSS预编译框架,它在CSS的语法基础之上,引入了变量、Mixin(混入)、运算以及函数等功能,大大简化了CSS的编写,并且降低了CSS的维护成本,就像它的名称所说的那样,LESS可以…

掌握 React 与 React Native

今天面试被人问到React 与 React Native ,废话不多说,直接上干货。 React Native官网:https://reactnative.cn/ React Native App 页面布局直接通过 HTML 和 CSS 的前端基础技术进行布局与开发,大大降低了学习成本。 你如果早就在心里有开发一个自己 App 的想法,而刚…

计算机仿真在机械应用,浅谈计算机仿真在机械的应用.doc

浅谈计算机仿真在机械的应用浅谈计算机仿真在机械上的应用李思宏(重庆交通大学,重庆402247)摘要:如今计算机仿真技术在机械上有着广泛的应用,计算机仿真已然成为热门。本文用综述的形式简要介绍了计算机仿真的概念、机械生产现状及计算机仿真…