怎样编写测试类测试分支_测试技巧–不编写测试

怎样编写测试类测试分支

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

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

我正在使用的设计模式显示在下面的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部分–不通过Captain Debug博客从我们的JCG合作伙伴 编写测试 。

相关文章 :

  • 端到端测试的滥用–测试技术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/358659.shtml

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

相关文章

linux文件权限umask,linux系统中UMASK权限的用法讲解

原标题:linux系统中UMASK权限的用法讲解umask一般是用在你初始创建一个目录或者文件的时候赋予他们的权限。这里要说明两点:1、针对目录来说x权限代表可以进入该目录,所以说对于这个权限初始赋值是没什么问题的;2、针对文件的x的权限代表执行…

怎么样才算高级java工程师

高级水平: 1.能对需求进行架构设计,选择框架以适应最合适的业务,作为某个项目的领导,带领团队完成项目。 2.有自己的开源项目,可以写出自己的组件,对开源的框架能够进行二次编写,java核心技术有…

Win32+API学习笔记:创建基本的窗口控件

创建一个标签 CreateWindowEx(0, "static", "姓名:", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 12, // xpos …

Autorize插件的使用方法

在Proxy或者Repeater有Request请求包后,要ctrlA全选,然后再右键发送到Autorize插件中: 如果只是像这样空白的发送是不会发送过去的:

粉丝提问:求问大神您会查exif吗?

无需下载安装任何软件,直接上传图片即可查看EXIF。支持JPEG、TIFF、CR2、NEF、XMP等多种图片格式破解Canon、

linux和windows的分区区别,Linux分区与Windows分区的区别

打开开始-管理工具-计算机管理,如下图所示:在Windows系统中,计算机的分区是用磁盘0,磁盘1,磁盘2,磁盘3来表示多块硬盘的,比如磁盘0表示第一块硬盘,磁盘2表示第二块硬盘,以…

《构建之法》--阅读(第13章-第17章)

第13章 软件测试 1.名词解释 Bug &#xff1a;软件的缺陷 Test Case &#xff1a;测试用例。测试用例描述了一个完整的测试过程&#xff0c;包括测试环境、输入、期望的结果等 Test Suite &#xff1a;测试用例集。即一组相关的测试用例 2.Bug解释与实例 <1>、Bug可以分解…

一个用于伪造IP地址进行爆破的BurpSuite插件:BurpFakeIP

BurpFakeIP介绍 一个用于伪造ip地址进行爆破的BurpSuite插件&#xff0c;burpsuite伪造ip可用于突破waf及进行安全规则绕过等场景&#xff1b;昨天我们分享了《BurpSuite IP代理扩展&#xff0c;使用AWS API网关动态更改请求&#xff1a;IPRotate_Burp_Extension》有同学也发现…

学习Spring-Cloud –编写微服务

继续我的Spring-Cloud学习历程&#xff0c; 之前我已经介绍了如何编写典型的基于Spring-Cloud和Netflix OSS的微服务环境的基础架构组件–在此特定实例中&#xff0c;有两个关键组件&#xff0c;用于注册和发现服务的Eureka和Spring Cloud用于维护服务配置集中式配置库的配置。…

CSS页面DEMO

层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;标准通用标记语言的一个应用&#xff09;或XML&#xff08;标准通用标记语言的一个子集&#xff09;等文件样式的计算机语言。CSS不仅可以静态地修饰网页&#xff0c;还可以配合各种脚本…

linux内核配置usb虚拟串口,Linux USB虚拟串口设备

Linux内核中usb设备侧驱动程序分成3个层次&#xff1a;UDC驱动程序、Gadget API和Gadget驱动程序。UDC驱动程序(USB控制器)直接访问硬件&#xff0c;控制USB设备和主机间的底层通信&#xff0c;向上层提供与硬件相关操作的回调函数。Gadget API是UDC驱动程序回调函数的简单包装…

linux 内核移植和根文件系统的制作【转载】

原文地址&#xff1a;http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html1.1 Linux内核基础知识 在动手进行Linux内核移植之前&#xff0c;非常有必要对Linux内核进行一定的了解&#xff0c;下面从Linux内核的版本和分类说起。 1.1.1 Linux版本 Linux内核的版本…

Chunked coding converter插件的使用方法

burp插件----Chunked coding converter url下载&#xff1a;https://github.com/zxl2605/chunked-coding-converter 安装步骤&#xff1a;BurpSuite -> Extender -> Extensions -> Add -> Extension Type: Python -> Select file: chunked-coding-converter.0.…

linux 提升cpu权限,CPUlimit有效防止Linux系统CPU过载

最近使用Nginx服务器测试 pagespeed 的加速效果时&#xff0c;发现这货会造成 CPU 占用过高&#xff0c;Nginx 经常 100%&#xff0c;尽管使用的是静态缓存&#xff0c;总是触发主机商的CPU占用上限&#xff0c;不停的被强制关机。发现 CPULimit 这款工具刚好可以解决这个问题&…

什么是CSS?你真的理解?

什么是 CSS? CSS 指层叠样式表 (Cascading Style Sheets)样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加到 HTML 4.0 中&#xff0c;是为了解决内容与表现分离的问题外部样式表可以极大提高工作效率外部样式表通常存储在 CSS 文件中多个样式定义可层叠为一个 样…

大数据公司

合肥盈云科技信息有限公司 中润普达&#xff08;集团&#xff09;公司转载于:https://www.cnblogs.com/hugh2006/p/4587232.html

domain hunter pro插件的使用方法

bilibili教程&#xff1a;https://www.bilibili.com/video/BV1eA411P7xC/ 安装 获取软件的Jar包&#xff0c;由于该软件是基于BurpSuite的插件程序。需要与BurpSuite一起使用。 安装后的界面效果 项目管理 创建一个新的项目&#xff0c;也可以打开已有的项目文件&#xf…

qt linux opensource ,QT opensource embedded linux 编…

建立自己的编译链文件夹 mkdir linux-mick-omap拷贝别的文件夹下&#xff0c;譬如linux-arm-g中的qmake.conf qplatformdefs.h到linux-mick-omap修改qmake.conf, 把arm-linux-gcc 和 arm-linux-g改成自己的arm-none-linux-gnueabi-gcc 和 arm-none-linux-gnueabi-g只需要修改前…

CSS基本语法?

CSS 实例 CSS 规则由两个主要的部分构成&#xff1a;选择器&#xff0c;以及一条或多条声明: 选择器通常是您需要改变样式的 HTML 元素。 每条声明由一个属性和一个值组成。 属性&#xff08;property&#xff09;是您希望设置的样式属性&#xff08;style attribute&#x…

java中远程连接忽略证书_忽略Java中的自签名证书

java中远程连接忽略证书我在职业生涯中遇到过几次问题&#xff0c;就是我们有时希望允许自签名证书用于开发或测试目的。 Google的快速搜索显示了多年来无数Java开发人员遇到的麻烦。 根据确切的证书问题&#xff0c;您可能会收到类似以下内容之一的错误&#xff0c;尽管我几乎…