端到端测试的滥用–测试技术2

我的上一个博客是有关测试代码方法的一系列博客中的第一篇,概述了使用一种非常常见的模式从数据库检索地址的简单方案:

…并描述了一种非常通用的测试技术: 不编写测试而是手动进行所有操作。

今天的博客涵盖了另一种实践,我也认为这是次优的。 在这种情况下,开发人员使用JUnit编写测试,但是在完成编写代码之后并且没有任何类隔离的情况下编写测试。 这实际上是冒充单元测试的“端到端”(又称集成)测试。

尽管昨天我说过我只测试AddressService类,但是使用此技术的测试首先从数据库中加载一些测试数据,然后抓住AddressController来调用被测方法。 AddressController调用AddressService ,然后再调用AddressDao以获取并返回所请求的数据。

@RunWith(UnitilsJUnit4TestClassRunner.class)
@SpringApplicationContext("servlet-context.xml")
@Transactional(TransactionMode.DISABLED)
public class EndToEndAddressServiceTest {@SpringBeanByTypeprivate AddressController instance;/*** Test method for* {@link com.captaindebug.address.AddressService#findAddress(int)}.*/@Testpublic void testFindAddressWithNoAddress() {final int id = 10;BindingAwareModelMap model = new BindingAwareModelMap();String result = instance.findAddress(id, model);assertEquals("address-display", result);Address resultAddress = (Address) model.get("address");assertEquals(Address.INVALID_ADDRESS, resultAddress);}/*** Test method for* {@link com.captaindebug.address.AddressService#findAddress(int)}.*/@Test@DataSet("FindAddress.xml")public void testFindAddress() {final int id = 1;Address expected = new Address(id, "15 My Street", "My Town","POSTCODE", "My Country");BindingAwareModelMap model = new BindingAwareModelMap();String result = instance.findAddress(id, model);assertEquals("address-display", result);Address resultAddress = (Address) model.get("address");assertEquals(expected.getId(), resultAddress.getId());assertEquals(expected.getStreet(), resultAddress.getStreet());assertEquals(expected.getTown(), resultAddress.getTown());assertEquals(expected.getPostCode(), resultAddress.getPostCode());assertEquals(expected.getCountry(), resultAddress.getCountry());}
}

上面的代码使用Unitils将测试数据加载到数据库中并在Spring上下文中加载类。 我发现Nevers是一个有用的工具,它消除了编写此类测试的繁琐工作,而必须设置如此大规模的测试是一项艰巨的工作。

这种测试必须在代码完成后编写; 它不是测试驱动的开发(从以前的博客中可以看到,我是一个忠实的拥护者),它也不是单元测试。 在代码编写测试的问题之一是必须执行测试的开发人员将其视为琐事而不是开发的一部分,这意味着它通常很匆忙,而不是在编码风格的整洁中完成的。

您还需要一定数量的基础结构才能使用此技术进行编码,因为需要建立数据库,而数据库可能会或可能不在您的本地计算机上,因此您可能必须连接到网络才能运行测试。 测试数据要么保存在测试文件中(如本例所示),然后在运行测试时加载到数据库中,要么永久保存在数据库中。 如果需求变更迫使测试发生变更,则通常需要将数据库文件与测试代码一起进行更新,这迫使您至少在两个位置更新测试。

除了缺乏测试对象隔离之外,这种测试的另一个大问题是它们可能非常慢,有时要花几秒钟来执行。 Shane Warden在他的《敏捷开发的艺术》一书中指出,单元测试的运行速度应为“每秒数百”。 沃登还继续引用迈克尔·费瑟(Michael Feather)的书《有效地使用旧版代码》 ,以明确定义什么单元测试或不可以:

在以下情况下,测试不是单元测试:

  1. 它与数据库对话。
  2. 它通过网络进行通信。
  3. 它涉及文件系统。
  4. 您必须对环境做一些特殊的事情(例如编辑配置文件)才能运行它。

…现在我喜欢。

…尽管我不一定同意第三点。 良好的单元测试代码的主要租户之一是可读性。 传递给被测对象的方法参数有时会很大,尤其是在使用XML时。 在这种情况下,我认为支持测试的可读性并将这种大小的数据存储在数据文件中而不是将其作为私有的静态最终String更为实用,因此在可行的情况下,我只坚持第3点。

可以使用第一个首字母缩写来总结单元测试:快速,独立,可重复,自我验证和及时,而Roy Osherove在他的《单元测试的艺术》一书中总结了一个很好的单元测试:“自动代码调用方法或类,然后检查有关该方法或类的逻辑行为的一些假设。 单元测试几乎总是使用单元测试框架编写的。 它可以轻松编写并快速运行。 它是完全自动化的,可信赖的,可读的和可维护的”。

端到端测试的好处是,他们确实会与其他对象和周围环境一起测试您的测试主题,而这在交付代码之前确实是必须要做的。 这意味着完成后,您的代码应包含数百个单元测试,但仅包含数十个“端到端”测试。

鉴于此,当我说技术是“次优”时,我的介绍性前提并不严格。 “端到端”测试没有任何问题,每个项目都应该有一些测试以及一些普通的集成测试,但是这类测试不能替代或称为单元测试,通常是这种情况。

确定了单元测试的内容后,我的下一个博客将调查您应测试的内容以及原因……

参考: Captain Debug博客上的 JCG合作伙伴 的“ 端到端测试的滥用-测试技术2”

相关文章 :

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

翻译自: https://www.javacodegeeks.com/2011/11/misuse-of-end-to-end-tests-testing.html

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

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

相关文章

那些年困扰我们的Linux 的蠕虫、病毒和木马

虽然针对Linux的恶意软件并不像针对Windows乃至OS X那样普遍,但是近些年来,Linux面临的安全威胁却变得越来越多、越来越严重。个中原因包括,手机爆炸性的普及意味着基于Linux的安卓成为恶意黑 客最具吸引力的目标之一,以及使用Lin…

(转)FPGA异步时序和多时钟模块

http://bbs.ednchina.com/BLOG_ARTICLE_3019907.HTM 第六章 时钟域 有一个有趣的现象,众多数字设计特别是与FPGA设计相关的教科书都特别强调整个设计最好采用唯一的时钟域。换句话说,只有一个独立的网络可以驱动一个设计中所有触发器的时钟端口。虽然…

怎么检测不到我的音频_Linux 上的最佳音频编辑工具推荐 | Linux 中国

在 Linux 上,有很多种音频编辑器可供你选用。不论你是一个专业的音乐制作人,还是只想学学怎么做出超棒的音乐的爱好者,这些强大的音频编辑器都是很有用的工具。-- Ankush Das(作者)在 Linux 上,有很多种音频编辑器可供你选用。不论…

具有GlassFish和一致性的高性能JPA –第3部分

在我的四部分系列的第三部分中,我将解释将Coherence与EclipseLink和GlassFish结合使用的第二种策略。 这就是通过EclipseLink使用Coherence作为二级缓存(L2)的全部内容。 一般的做法 这种方法将Coherence数据网格应用于依赖于无法完全预加载到…

精选30道Java笔试题解答(转)

都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底, 老手们就不用进来了,免得笑话我们这些未出校门的孩纸们,但是I…

list取值_Redis中List及quicklist实现-2

上一篇中看了List的使用方式、quicklist中的各个结构体,这一篇来看看quicklist里面的几个核心函数,quicklistCreate函数、quicklistCreateNode函数、quicklistPush函数、quicklistPop函数。接下来我们通过源码看一下quicklist中是如何借鉴STL中deque的这…

通过示例休眠–第1部分(删除孤儿)

所以我想做一系列的冬眠例子,展示冬眠的各种特征。 在第一部分中,我想展示有关删除孤儿功能及其在故事情节中的使用方法。 因此,让我们开始:) 先决条件 : 为了尝试以下示例,您将需要以下提到的JAR文件: …

Win10手记-IIS部署网站问题解决

最近在自己的Win10电脑上尝试部署ASP.NET网站时出现了问题,经过多方查找定位到IIS为问题来源。 开始之前 先描述下技术环境: 1.Windows 10 PC 2.Windows 自带的IIS 7 3.ASP.NET Web API项目网站 4.VS 2015 问题描述 首先我们为PC安装IIS,按照…

CentOS 7 安装记录

由于centos6.4版本有点老,所以换到centos7。 1.安装 CentOS 7.0系统安装配置图解教程 2.linux设置网卡开机启动 实质linux是看一个网卡文件的配置,就是/etc/sysconfig/network-scripts/ifcfg-eth0 (这个文件名看你网卡名称而异,具体你到该目录…

通知栏发送消息Notification(可以使用自定义的布局)

一个简单的应用场景:假如用户打开Activity以后,按Home键,此时Activity 进入-> onPause() -> onStop() 不可见。代码在此时机发送一个Notification到通知栏。当用户点击通知栏的Notification后,又重新onRestart() -> onSt…

退出页面删除cookie_Cookie 机制

欢迎关注公众号 学习资料不会少01「HTTP 协议是无状态的」对于浏览器的每一次请求,服务器都会独立处理,不与之前或之后的请求发生关联。这个过程如图 11-1 所示,3次“请求/响应”之间没有任何关系。即使是同一个浏览器发送了3个请…

Oracle WebLogic Java云服务–幕后花絮。

在开放世界方面,发生的一件大事可能是出乎意料的消息,那就是Oracle最终支持云计算发展并提供自己的公共云服务 。 除了官方公告之外,Aquarium上( 此处和此处 )的内容或多或少都没有多少内容,您找不到很多信…

QT子窗口及停靠实现

Demo的效果 头文件中的变量声明 //退出动作QAction* exit;//菜单栏菜单QMenu* filemenu;QMenu* actiona;//在状态栏的标签控件QLabel* label;//两个停靠窗口QDockWidget *dockwidget;QDockWidget *dockwidget_textbox; CPP源文件中的对象定义 //创建初始化按钮,将要放到第一个窗…

Html转Word文档,解决无法保存网络图片的问题

最近项目中需要这个功能,网上有很多word转html的方法,但是html转word的方法很少,因为html中的图片转换到本地比较麻烦; 开始的时候只能转换不带图片的html内容,但是不符合要求,将html页面中的图片改成绝对路…

Android实现推送方式解决方案

Android实现推送方式解决方案 本文介绍在Android中实现推送方式的基础知识及相关解决方案。推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息。这种推…

java基础知识系列---垃圾收集

1 为什么要使用垃圾回收机制? “垃圾收集”暗示程序不再需要的对象就是垃圾,可以被丢弃。更精确,更新的说法是“内存回收”。 1.1 新对象的使用 当一个对象不再被程序所引用时,他所使用的堆空间可以被回收,以便于被后续…

如何部署Zabbix服务端

部署环境 RHEL 6.7 Zabbix-server 2.2.14 安装zabbix官方源 # wget http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm # rpm -ivh zabbix-release-2.2-1.el6.noarch.rpm 安装zabbix-server # yum install zabbix zabbix-server-mysql zab…

Oracle JRockit Mission Control 4.1发布

Oracle发布了以前的仅JRockit专用工具Mission Control Suite(JRMC)的新版本。 4.1版本是次要版本升级,直接遵循4.0.1(该版本发布于2010年中期)。 但是,即使版本号表明是次要的升级,您仍然可以在…

pe安装usb3.0驱动_电脑店U盘启动盘制作工具下载安装须知

电脑店U盘启动盘制作工具集成最全面的硬件驱动,精心挑选的系统维护工具,加上独有人性化的设计,具备较强的兼容性、稳定性和安全性。能够完美兼容台式机、品牌机及笔记本等新老机型,且安全无毒,电脑店一键U盘启动盘制作…

python ATM购物程序

需求: 模拟实现一个ATM 购物商城程序 额度 15000或自定义实现购物商城,买东西加入 购物车,调用信用卡接口结账可以提现,手续费5%每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5…