端到端测试

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

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

今天的博客涵盖了另一种实践,我也认为这是次优的。 在这种情况下,开发人员使用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合作伙伴 Roger Hughes的“ 端到端测试的滥用-测试技术2”

相关文章 :

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

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

端到端测试

端到端测试_端到端测试的滥用–测试技术2相关推荐

  1. 大数据综合能力测试_如何完成大数据测试?资深测试从功能测试角度为你分析分析...

    大数据,已经成为了这个时代的代名词.当今的互联网属于大数据时代,大数据时代的到来,颠覆了以往对数据的惯性思考方式,要保证数据执行,软件质量,测试质量,数据使用场景等,都需要重新变换一个新的角度,对软件 ...

  2. java 压力测试_使用 JMeter 完成常用的压力测试

    讲到测试,人们脑海中首先浮现的就是针对软件正确性的测试,即常说的功能测试.但是软件仅仅只是功能正确是不够的.在实际开发中,还有其它的非功能因素也起着决定性的因素,例如软件的响应速度.影响软件响应速度的 ...

  3. 移动端大图缩放模糊_关于移动端小图标模糊问题的解决方法

    前言 之前给大家讲到图片和文字垂直方向不对齐的问题,其中举的小例子中用到了一个小图标,这个小图标我用的是背景图来显示: .del .icon{ display: inline-block; width ...

  4. 移动端网页打印代码_安卓移动端直接打印文档方法,无需开电脑

    2.安卓手机一台,安装好EPSON iprint程序. 3.手机安装安卓版WPS. 实现方式:目前手机端安卓版基本上没有windows系统上的"打印"概念,但是绝对会有发送/分享. ...

  5. 支付宝wap端支付php对接_支付宝WAP端的支付配置教程

    之前的教程有误,导致大家一直没有配置成功, 今天在石头的配合下.才找出了大家一直以来配置不成功的问题根源. alipay_public_key.pem rsa_private_key.pem 配置非常 ...

  6. 多个微服务的接口依赖如何测试_微服务测试之接口测试和契约测试

    日常开发过程中,项目的接口通常由服务提供方约定和提供,微服务模式下接口被多个消费者调用更是常态,那么提供方接口的变更如何快速.高效.无遗漏的通知给消费者呢?另外,当一个service同时被多个使用者调 ...

  7. 大数据ab 测试_在真实数据上进行AB测试应用程序

    大数据ab 测试 Hello Everyone! 大家好! I am back with another article about Data Science. In this article, I ...

  8. 型人格 disc测试_什么是压抑型人格,如何测试筛查压抑型人格?

    一. 什么是压抑型人格 压抑型人格是一种非常病态的社会人格,在面对挫折和困难的时候,压抑型人格者不能很好的疏解自己内心的不良情绪,他们会将这种负面情绪压抑起来,而不是将其释放出来.虽然这种压抑可以短暂 ...

  9. u盘读写测试_关于闪迪u盘cz880速度测试

    此文数据仅代表本人自用电脑测试结果: 大家都知道目前一款很火爆的固态级u盘:闪迪cz880 cz880官宣读写数据 官方称写速高达380M/s,接下来请看仔细了,这个隐性前提条件是: 1⃣️支持nvm ...

  10. python代码覆盖率测试_利用coverage工具进行Python代码覆盖率测试

    Coverage是一种用于统计Python代码覆盖率的工具,通过它可以检测测试代码对被测代码的覆盖率情况. Coverage安装 1.安装命令:pip install coverage 2.查看cov ...

最新文章

  1. Spring Cloud应用开发(七:使用Git存储方式实现分布式配置管理 )
  2. Visual Studio 2019更新到16.1.6
  3. (Mark)JS中的上下文
  4. java实现redis客户端_windows下java swt实现操作redis的客户端工具
  5. RabbitMQ和Kafka的显著差异(6)
  6. 新书问答:Agile Management
  7. Atitit 游戏引擎---物理系统(1)------爆炸效果
  8. 查找java实现_常见查找算法Java实现
  9. 简易的Python小游戏
  10. SetTimer函数和 KillTimer函数
  11. 视频教程-Excel函数教程(下)-Office/WPS
  12. Win7系统安装的方法,电脑重装系统win7
  13. AppLocker绕过之路
  14. 数据库保存时间为什么用long最好
  15. Reactor模式!
  16. latex tips latex 大括号 \left\{ \right\}
  17. 57个机器人流程自动化应用场景:RPA深入指南[2019更新]
  18. 我所理解的高通UEFI之display的流程和移植
  19. 打开SQL2000安装包没有弹出安装界面
  20. 医院自助机和分诊那个php,一种医院分诊用自助查询分诊机的制作方法

热门文章

  1. selenium以及chromdrive安装
  2. 银行营业网点管理系统——implt包(BranchesDaoImpl )
  3. JS函数中的arguments
  4. React类里面能写的东西
  5. 四种常见的 POST 提交数据方式对应的content-type取值
  6. webpack打包发布
  7. 手机app 服务器 网页同步,手机app接入云服务器
  8. mysql级联复制转换成一主两从_一主两从转级联复制
  9. mybatis_user_guide(8) 日志
  10. tomcat(8)载入器