测试技巧–不编写测试

对此没有太多疑问,测试代码的方式是一个有争议的问题。 不同的测试技术因各种原因(包括企业文化,经验和总体心理观点)而受到不同开发人员的青睐。

例如,您可能更喜欢编写经典的单元测试,通过检查返回值来单独测试对象的行为。 您可能会喜欢经典存根或伪造的物品; 或者您可能喜欢使用模拟对象模拟角色,甚至使用模拟对象作为存根。 这个博客以及我接下来的几篇博客都采用了一种非常非常通用的设计模式,并研究了可以采用的不同测试方法。

我正在使用的设计模式显示在下面的UML图中,这是我以前使用过的,主要是因为它是如此普遍。 您可能不喜欢它-它的设计更像是“问不说”而不是“告诉不问”,但是它适合这个简单的演示。

在此示例中,上面的普遍模式将用于从数据库中检索和验证地址。 该示例代码可从我的GitHub存储库中获得 ,它以一个简单的Spring MVC webapp为起点,并使用一个小型MySQL数据库来存储地址,其原因无非是我已经在笔记本电脑上本地运行了服务器。

就测试而言,博客将集中于测试服务层组件AddressService:

@Component
public class AddressService {private static final Logger logger = LoggerFactory.getLogger(AddressService.class);private AddressDao addressDao;/*** Given an id, retrieve an address. Apply phony business rules.* * @param id*            The id of the address object.*/public Address findAddress(int id) {logger.info("In Address Service with id: " + id);Address address = addressDao.findAddress(id);businessMethod(address);logger.info("Leaving Address Service with id: " + id);return address;}private void businessMethod(Address address) {logger.info("in business method");// Do some jiggery-pokery here....}@Autowiredvoid setAddressDao(AddressDao addressDao) {this.addressDao = addressDao;}}

…如上面的代码所示,您可以看到它非常简单:它具有findAddress(…)方法,该方法将单个地址的ID(或表主键)作为输入。 它调用数据访问对象(DAO),并假装在将Address对象返回给调用者之前进行一些业务处理。

public class Address {private final int id;private final String street;private final String town;private final String country;private final String postCode;public Address(int id, String street, String town, String postCode, String country) {this.id = id;this.street = street;this.town = town;this.postCode = postCode;this.country = country;}public int getId() {return id;}public String getStreet() {return street;}public String getTown() {return town;}public String getCountry() {return country;}public String getPostCode() {return postCode;}
}

如上所述,我将介绍测试该代码的不同策略,其中一些我保证您会讨厌。 第一个仍然被许多开发人员和组织广泛使用的是……

不要写任何测试

令人难以置信的是,某些人和组织仍在这样做。 他们编写代码,将其部署到Web服务器并打开一个页面。 如果页面打开,则他们将发送代码;如果页面未打开,则他们将修复代码,对其进行编译,重新部署,重新加载Web浏览器并重新测试。

我见过的关于该技术的最极端的例子:几年前,在一个著名的政府项目中,更改代码,部署到服务器,运行代码,发现错误并再次循环。 我猜想,为了节省资金,分包商从“离岸”公司引进了一批廉价且缺乏经验的程序员,并且没有足够的经验丰富的程序员来指导他们。 所讨论的模块是一个基于Spring的简单消息驱动Bean,它从一个队列中获取消息,应用了一些业务逻辑,然后将其推入另一个队列:简单队列。 最初的作者通过编写一些测试开始,然后将代码传递给其他没有经验的团队成员。 当代码更改并且测试失败时,他们只是关闭了所有测试。 测试包括将MDB部署到EJB容器(Weblogic),将消息推送到系统的前端,观察来自另一端的消息并调试整个过程中的日志。 您可能会说这样的端到端测试还不错,但是部署MDB和运行测试只花了一个小时:在一个工作日内,这是8个代码更改。 发展不完全Swift!

我的工作? 修复过程和代码。 解决方案? 编写测试,运行测试并重构代码。 该模块从零测试变成了大约40个单元测试和一些集成测试,并且经过改进并最终交付。 做完了

大多数人会对这种技术有自己的看法,而我的看法是:它产生了不可靠的代码; 使用此技术需要花费更长的时间编写和交付代码,因为您花费大量时间等待服务器启动,部署WAR / EJB等。并且,通常由经验不足的程序员使用,或者没有使用过此功能的程序员通常会使用它技术–您确实遭受了痛苦。 我可以说我从事的项目是编写测试的项目,而其他开发人员则不在。 测试团队在我的代码中发现的bug很少,而其他开发人员正在修复大量的bug,并疯狂地努力按时完成任务。 我是一个出色的程序员,还是编写测试能带来收益? 根据经验,如果您使用此技术,则会有很多其他错误要修复,因为您无法轻松,重复地测试与您开发的故事相伴的多种场景。 这是因为它花费的时间太长,您必须记住每种情况,然后手动运行它们。

我确实想知道,不写测试技术是否比1960年代的计算技术昂贵时留下的宿醉,您必须手动在打Kong卡或纸带上编写程序,然后使用“真值表”进行目视检查。 当您对自己的代码工作感到满意后,便将其发送到计算机室并运行您的代码-我还不算老,无法记住60年代的计算。 机器时间昂贵的事实意味着自动化测试是不可能的。 尽管计算机的速度越来越快,但这种过时的范例仍在继续,退化为一种模式,您错过了勤奋的精神检查,只是运行了代码,如果代码破了,您就将其修复。 这种退化的范式仍在学校,学院和书籍中教授,直到近几年才受到挑战。

这就是为什么很难说服人们改变他们的习惯吗?

该技术的另一个主要问题是项目可能会陷入瘫痪状态。 就像我在上面说的那样,使用这种技术,您的错误数将很高,并且给项目经理带来不好的印象,使他们认为代码会发臭并强制执行以下想法:除非绝对必要,否则不要更改代码,因为这可能会破坏某些东西。 经理常常对授权代码更改不满意,他们通常不信任开发人员并对其进行微观管理。 确实,开发人员自己对添加代码更改非常犹豫,因为破坏某些内容会使他们看起来很糟糕。 他们所做的更改尽可能的小,并且没有任何重构。 随着时间的流逝,这会加剧混乱,并且代码的退化甚至会变得更大。

虽然我认为您应该加载并查看页面以确保所有功能都正常运行,但是只有在有大量测试告诉您代码可以正常运行时,才应该在故事的结尾进行操作。

我希望当我总结这种方法很糟糕的时候(尽管时间会证明一切)时,我不会引起争议。 您可能还想知道为什么要包含它,原因是要指出它很烂,并在下面的博客中提供了一些替代方法。

参考: 测试技术–第1部分–不通过JCG合作伙伴 在Captain Debug博客上 编写测试 。

相关文章 :

  • 端到端测试的滥用–测试技术2
  • 您应该对什么进行单元测试? –测试技术3
  • 常规单元测试和存根–测​​试技术4
  • 使用模拟的单元测试–测试技术5
  • 为旧版代码创建存根–测试技术6
  • 有关为旧版代码创建存根的更多信息–测试技术7
  • 为什么要编写单元测试–测试技巧8
  • 一些定义–测试技术9
  • 使用FindBugs产生更少的错误代码
  • 在云中开发和测试

翻译自: https://www.javacodegeeks.com/2011/11/testing-techniques-not-writing-tests.html

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

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

相关文章

Ubuntu镜像下载地址

https://mirrors.aliyun.com/ubuntu-releases/ 用迅雷下载速度挺快的

Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum (离线树状数组+前缀xor)

题目链接:http://codeforces.com/contest/703/problem/D 给你n个数,m次查询,每次查询问你l到r之间出现偶数次的数字xor和是多少。 我们可以先预处理前缀和Xor[i],表示1~i的xor和。因为num^num0,所以Xor[r] ^ Xor[l - 1…

九齐51单片机使用注意事项:不要用float

在使用ADC计算电压值时用了float,NY8B072A堆栈直接炸了,用32机习惯了,一直想不通,查了手册才知道。 手册是:《NYC_NY8_UM_v1.5_SC.pdf》 链接:https://www.nyquest.com.tw/cn/support/download/Nyquest_SW…

go 基准测试 找不到函数_基于Golang做测试

本文在实习期间完成并完善,无任何公司机密,仅做语言交流学习之用。持续更新。1.Golang的单元测试Go语言提供了丰富的单测功能。在Go中,我们通常认为函数是最小的可执行单元。本例中使用两个简单的函数:IsOdd和IsPalindrome来进行G…

九齐NY8B072A单片机使用笔记(三)模拟串口RX

因为这款单片机没有硬件串口,所以需要我们自己做软件模拟串口。 用PA3作为RX,因为PA3可以作为外部输入中断EXTI1。 本人首先用轮询的方式查PA3是否从高电平跳变到低电平(起始信号),但是因为还有别的业务逻辑&#xf…

[LindCode] Binary Tree Postorder Traversal

Binary Tree Postorder Traversal Given a binary tree, return the postorder traversal of its nodes values. Example Given binary tree {1,#,2,3}, 1\2/3return [3,2,1]. Challenge Can you do it without recursion? SOLUTION 1: recursion: 分治法解决之&am…

金山毒霸垃圾清理

金山毒霸-垃圾清理-单文件封装,清洁洁癖的爱好! 实话,金山的软件确实不错。展望金山可以在软件行业,做出让世界都使用的。为国人扛起一片天 下载地址: http://pan.baidu.com/s/1dFa7GdV转载于:https://www.cnblogs.com/xiaochina/…

python-break循环中断

Python break语句,就像在C语言中,打破了最小封闭for或while循环。 break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。 break语句用在while和for循环中。 如果您使用嵌套循环&am…

asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(二)—— easyui的简单实用

下面开始在UserManager.Web中利用easyUI构建web。 1. 先删除自带的controllers、models和views(里面的shared和web.config可以保存)下面的文件 2. 要利用easyUI,首先去网上下载jquery-easyui-1.3.2.zip,同时下载一份EasyUI-1.3.2.…

adc如何获取周期_LOL:千珏拥有ADC最需要的位移和无敌能力,为什么没人用她打下路?...

— 点击蓝字 关注我们 —英雄联盟自国服上线以来,已经陪伴玩家走过了9个年头,目前英雄联盟中的英雄数量已经达到了151位,每一位都各具特色。千珏是一位深受玩家们喜爱的英雄,其在官方英雄的定位中,属于打野英雄&#x…

android surfaceview 大小_Android 使用Camera2 API采集视频数据

Android 视频数据采集系列的最后一篇出炉了,和前两篇文章想比,这篇文章从系统API层面进行一些探索,涉及到的细节更多。初次接触 Camera2 API 会觉得它的使用有些繁琐,涉及到的类有些多,不过就像第一次使用Activity, Fr…

使用Java VisualVM分析您的应用程序

当您需要发现应用程序的哪个部分消耗更多的CPU或内存时,必须使用探查器执行此操作。 默认情况下,Sun JDK中附带的一个探查器是Java VisualVM。 这个事件探查器非常简单易用,功能强大。 在这篇文章中,我们将看到如何安装它并使用它…

ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接

ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接 原文:ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接安装ArcSDE for SQL Server,最后一步成功后的界面如下:在ArcMap中创建ArcSDE连接,截图如下:posted on 2016-08-0…

python调用c函数传字符串参数_Python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数...

在Python语言中,可以使用ctypes模块调用其它如C语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件的功能及应用领域,减少重复编写代码、…

沁恒CH554 KEIL环境搭建

首先下载WCHISPTool_Setup.exe http://www.wch.cn/products/CH554.html 123这三个可下载的都下吧,后面开发都要用的 安装好后运行,菜单栏上,功能->添加WCH MCU到KEIL器件库 这时候在KEIL安装目录里面的UV4文件夹下可以看到wch.cdb的文件…

【CV论文阅读】Rank Pooling for Action Recognition

这是期刊论文的版本,不是会议论文的版本。看了论文之后,只能说,太TM聪明了。膜拜~~ 视频的表示方法有很多,一般是把它看作帧的序列。论文提出一种新的方法去表示视频,用ranking function的参数编码视频的帧序列。它使用…

VS2019 WPF制作OTA上位机(一)新建工程

首先创建新项目,文件 -> 新建 -> 项目 下拉菜单选择C#和Window,选择WPF应用程序,下一步 输入项目名,下一步 这里选择.NET 5.0,也可以选择其他的,个人习惯.NET,点击创建 这时候出现初始…

户籍恢复需要体检吗_脑梗死后脚麻能恢复吗?需要多久能恢复呢?

脑梗死之后脚部麻木,这个有一部分是能够恢复的,但是相对而言,恢复的时间比较长,在临床当中出现脚麻主要是因为梗死破坏了患者的感觉神经中枢从而造成。脚部感觉麻木,瘙痒或者是有蚂蚁在上面爬的感觉。而且有的更加严重…

Alpha版本测试报告

一、测试计划 Alpha版本即将发布,我们组织队员进行这一版本的测试。 测试主要针对两方面:浏览器兼容性和功能完善性。 测试分兼容性测试与功能完善性两部分,兼容性测试分Windows操作系统、Linux系操作系统、Mac OS X操作系统以及手机端Androi…

VS2019 WPF制作OTA上位机(二)获取bin文件路径

OTA升级是通过无线通信远程把bin文件内容传输到单片机,完成升级。 因此上位机需要获取bin文件的路径,读取bin文件内容,将内容分割依次发送(因为单片机的接收缓存不会开得和bin文件一样大(十几K甚至几十K)&a…