2013年测试基于Web的Spring应用程序(第1部分)

2013年测试基于Web的Spring应用程序(第1部分)

LJCer和TDD / BDD的一位拥护者最近开始使用广受欢迎的Spring堆栈开发应用程序,他就如何最好地在这种情况下实施测试驱动的方法向我提出了建议。 我开始回覆一封电子邮件作为回应,但后来我突然想到这也可能对其他人有用……所以在这里–我希望它能对您有所帮助

假设条件

本文的其余部分假定以下内容:

  • 应用程序将使用Spring堆栈的以下组件在Java中实现:核心,MVC,数据,安全性等,但我们将不涉及Spring Integration或Batch(尽管推荐的测试框架和工具可能非常相似,但我发现测试这些组件的技术可能大不相同,因此必须等到另一篇博客文章为止)
  • “最终用户”将通过基于Web的UI和/或基于HTTP的API与开发的应用程序进行交互(通常,但不仅限于REST)
  • 为了进行生产,将使用外部数据存储在应用程序中保持长期状态。 我们假设您也将要测试您的应用程序如何与此交互。
  • 除了使用简单的内存中的servlet容器(如Jetty)来部署整个打包的应用程序之外,我们将不涉及通过远程或嵌入式容器进行的测试。 诸如Arquillian之类的框架提供了一些非常酷的功能,这些功能允许针对实际(嵌入式)容器(例如Tomcat,GlassFish和JBoss Application Server)进行单元测试。 这是通过提供机制来模拟生产类包装(“ ShrinkWrapping ”)和在嵌入式容器内测试组件的任意子集(直至类级别)的方式来实现的,所有这些过程都可以通过您喜欢的测试框架进行,例如JUnit的。

一般建议

如果您是新的测试驱动开发人员,那么我推荐以下书籍:

  • 有效的单元测试:Java开发人员指南 -这是对基于Java的单元测试中所有关键概念和技术的出色介绍(并且是最新的)。 本书不仅涵盖了动机和方法,而且还介绍了如何编写具有表现力和可维护性的“良好”测试,并针对每种用例选择了最合适的技术。
  • 使用JUnit和Mockito进行 实用单元测试和/或使用TestNG和Mockito进行实用单元测试 。 这些都是很棒的书,其中包含有关如何测试Java应用程序的大量实用示例,还讨论了TDD的原因和方式。 这两本书非常相似,主要区别在于用于驱动测试的框架。 我的建议是购买结合“有效单元测试”(主要侧重于JUnit)的TestNG版本,因为很高兴知道两种最流行的基于Java的测试引擎的区别和优势/劣势。
  • 由测试指导的不断增长的面向对象软件(贝克签名) –这是经典的TDD书籍之一,它讨论了测试驱动应用程序设计的所有高级概念和动机。 本书还详细介绍了基于拍卖网站的整个应用程序的构建和演进过程,为如何使用规定的方法提供了一个很好的实践示例。
  • 有几本关于单元测试JavaScript的书,尽管我没有机会阅读所有这些书,但我还是推荐Testable JavaScript。

测试核心

单元测试

目的 :应用程序的核心对要解决的问题进行建模,通常包含特定于域的表示形式和相关的“业务”规则,这些规则主要由您负责编写(即,在此处可以重用第三方代码的机会是有点受限制)。

因此,很容易有人争辩说,该代码应该经过良好的测试-您在这里实现的组件不仅可能是唯一的,而且还希望在将它们连接到提供样板功能的框架(例如,坚持不懈。 编写良好的测试还可以在微观级别上“记录”您的代码(及相关功能)。

工具

  • JUnit / TestNG –用于运行Java测试的事实上的框架。 我喜欢通过surefire插件将这些作为我的Maven构建过程的一部分运行
  • Spock –基于Groovy的出色测试和规范框架。 如果您还没有听说过,请立即停止阅读并访问该网页。 说真的 现在查看Spock基础页面 。 那有多棒? 而且它在Spring中也能很好地发挥作用 !
  • Mockito –我最喜欢的模拟框架。 其他确实存在,但我发现Mockito在易用性,表达性和可维护性之间取得了很好的平衡
  • PowerMock –当您遇到Mockito无法解决的困难情况时(例如,模拟依赖静态方法的旧库,模拟私有或最终方法,或模拟对象实例化),Mockito的强大扩展。 我的建议是,在开始接触PowerMock时,始终对您的组件设计进行三重检查–通常,使用PowerMock的愿望表明测试“有异味”,并可能表明您应该改进组件设计或您的方式。具有外部依赖性的代码接口可以得到增强。 例如,除了模拟第三方库的静态构造方法之外,您是否可以不将此方法调用隐藏在自己的接口后面(遵循decoractor / adapter模式),这将简化模拟?
  • ConcurrentUnit –一个强大的实用程序框架,用于测试组件内并发的艰巨任务
  • 轻松制作 -一个用于创建“测试数据”构建器的小框架(其概念来自前述的“ 不断增长的面向对象的软件,由测试指导”)
  • junitparams –一个很好的框架,用于增强JUnits参数化测试(或如创建者所言–“不烂的参数化测试”)

  • 隔离测试中的类和组件。 单元测试应专注于测试小型工作单元 ,因此应具有最小的依赖关系(或应模拟依赖关系)
  • 创建覆盖整个代码所有路径的测试用例,而不仅仅是简单的路径
  • 创建测试复制边缘案例
  • 利用参数化测试的功能来促进快速发现数据驱动的测试用例

不要

  • 编写琐碎的测试只是为了增加单元测试的覆盖范围
  • 创建脆弱的测试,使您的代码发生丝毫变化,即如果您使用超过10行代码来设置模拟和期望,那么您可能做错了
  • 测试getter和setter,除非它们包含逻辑
  • 直接测试与基础操作系统(文件,网络等),数据存储或任何容器/服务器的任何交互。 在此测试级别上应该模拟这种交互

塞在一起

集成测试–持久层

目的 :考虑对您的持久性或DAO层进行单元测试,但在这里您要模拟外部资源提供的行为,而不是模拟此功能。

工具

  • 上面提到的所有单元测试工具以及…
  • 利用Spring的@ContextConfiguration来管理诸如EntityManager或MongoOperations之类的依赖关系的连接,以及利用AbstractTransactionalJUnit4SpringContextTests来管理具有明确定义的事务语义的测试的运行
  • 您选择的数据存储的嵌入式(内存中)版本,例如
    • H2 –出色的嵌入式SQL数据存储区,在99%的标准用例中,其行为类似于MySQL(尽管您的里程可能有所不同……)

  • 断言实体可以按您期望的那样持久。 我忘记了错误配置XToMany JPA批注的次数,这导致对子实体的级联操作不正确。
  • 旨在使测试执行时间保持在合理范围内。
  • 测试DAO /存储库界面上公开的所有公共方法
  • 创建允许加载预先罐装的测试数据的线束。 从Spring的AbstractTransactionalJUnit4SpringContextTests中考虑executeSqlScript()
  • 在每次测试结束时销毁(或删除)数据,以防止以前的测试数据影响结果。 如果您选择的测试框架不能保证执行测试的顺序,这一点尤其重要!

  • 单元测试的覆盖范围过于重复,即大多数业务逻辑将调用持久层来加载数据,进行处理,然后再次调用持久层以保存结果。 此级别的测试只需要关注负载并保存
  • 测试所有可能的数据排列
  • 将太多的操作链接在一起–应该由服务集成测试或端到端测试覆盖

即将第二部分...

我将尽快尝试发布第2部分,它将涵盖诸如服务级别集成测试,基于Web的测试和API测试之类的主题。 第3部分将介绍端到端(E2E)测试和BDD。

参考: The Tai-Dev Blog博客中的JCG合作伙伴 Daniel Bryant 在2013年测试了基于Web的Spring应用程序(第1部分) 。

翻译自: https://www.javacodegeeks.com/2013/07/testing-web-based-spring-applications-in-2013-part-one.html

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

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

相关文章

计算机类课程嵌入式系统的特点及其应用,嵌入式系统的准确定义、特点及其重要性...

嵌入式计算机系统的出现,是现代计算机发展史上的里程碑事件。嵌入式系统诞生于微型计算机时代,与通用计算机的发展道路完全不同,形成了独立的单芯片的技术发展道路。由于嵌入式系统的诞生,现代计算机领域中出现了通用计算机与嵌入…

【Linux】cp命令

用途 cp除了复制功能之外还可以建立快捷方式 全称 cp的全称为copy 参数 -a :相当于同时指定参数pdr -d :若文件为链接文件的属性(link file),则复制链接文件属性而非档案本身 -f :强制的意思(force),若目标档案已经存在且无法开启,则移除后再…

网页变成灰色,对重大事件表示哀悼

body * { -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); filter: grayscale(100%); filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale1); filter: gray; } 兼容所有浏览器&#x…

Mybatis之逆向工程

前面几篇基本把mybatis简单使用学习了下,今天学习下mybatis逆向工程,我们在开发中经常需要先设计数据库表结构或者先设计model,那就是能不能有工具可以只需在一边设计之后另一边自动生成呢?于是逆向工程来了。这里的逆向功能是通过数据库的表生成java po…

2023航天推进理论基础考试划重点(W老师)-液体火箭发动机1

适用于期末周求生欲满满的西北工业大学学生。 1、液体火箭发动机的基本组成及功能是什么? 推力室组件、推进剂供应系统、阀门与调节器、发动机总装元件等组成。 2、液体火箭发动机的分类和应用是什么?3、液体火箭发动机系统、分系统的概念是什么&…

minio 并发数_c#(asp.net)线程配置总结

本文为大家介绍有关c#(asp.net)线程配置的相关知识,有需要的朋友可以参考下。同一时刻只能发起的工作线程数量。1、(maxWorkerThreads * CPU逻辑数量)-minFreeThreads比如2个CPU默认配置maxWorkerThreads100,minFreeThreads176,则同时最大只能…

Java EE 7是最终版本。 思想,见解和进一步的指针。

我们花了不到三年的时间才推出了下一个Java EE版本 。 今年4月16日, JCP EC对JSR 342进行了投票并获得批准。 这是一个成功的故事,因为在去年八月下旬的最后时刻撤消了拥有云就绪平台的最初想法。 作为EG的成员,撰写即将发布的功能或多或少容…

远程教育英语和计算机没过怎么办,网络教育英语统考能考几次 没考过怎么办?...

网络教育英语统考能考几次?网络教育统考是可以在学制期限内多次报考,直到考试合格为止。不过从2018年4月统考开始,所有考生只要一次弃考,弃考科目就只能再有3次报考机会(含以后的弃考)。网络教育统考每年有三次考试时间,分别是4、…

JavaScript的arguments及其子对象

首先一个最大的问题是,arguments这个对象哪儿来的?也许有人会认为它是调用函数时引擎自带的一个局部变量,因为我们平时使用arguments的时候都是在函数中把它当作局部变量来使用的。事实上arguments是Function实例的属性,只是在调用…

nginx 自动化定时切割日志

NG在默认情况下,是始终输出到一个日志文件中,日志文件在nginx.conf中 : access_log logs/www.access.log main; 一个文件中不是很方便查找,分析数据,因此需要按现实运维需要定时的对此文件进行切割。 1、准备个切割…

dbgrideh指定某单元格变色_一招搞定按指定名称批量新建文件夹

文 / 雷哥小鱼儿 编辑 / 小瓜子假如你有一个100行的Excel名单文件。业务需要,需要按姓名单独做成一个个文件夹。普通小白做法:用复制粘贴大法一个个去修改文件夹名字........雷哥Tips:EXCEL中为了实现某目标,出现了N次重复的操作…

如何编写自己的Java / Scala调试器

通过这篇文章,我们将探讨Java / Scala调试器的编写和工作方式。 诸如Windows的WinDbg或Linux / Unix的gdb之类的本机调试器通过操作系统直接提供给它们的钩子来获取其强大功能,以监视和操纵外部进程的状态。 JVM充当OS之上的抽象层,它提供了自…

软件测试bug文档模板,软件bug测试记录模板

软件bug测试记录模板 XXX软件bug测试记录表 文档编号: 背景信息 项目名称 测试目的 硬件环境 软件环境 测试时间 测试人员 测试说明 1、严重等级: A-Crash(崩溃的):由于程序所引起的死机、非法退出、死循环;数据库发生死锁&#x…

js模版引擎handlebars.js实用教程——结束语

返回目录 有了这些功能,[ajax json Handlebars]替代[vo el表达式]不成问题,新时代的曙光已经来临,最佳解决方案在此,您还等什么? 教程到此结束。。。祝读者学习愉快。。。 转载请注明:前端录js模版引擎hand…

rem根据屏幕大小适配字体大小

(function(window, document) {function rootSize() {var screenWidth document.documentElement.clientWidth || window.innerWidth;// console.log(screenWidth);var rootSize screenWidth > 750 ? 100 :screenWidth < 320 ? 320 / 750 * 100 : screenWidth…

mac mysql 列表_Mac终端操作Mysql,以及Mysql的操作方法详解

首先手动启动Mysql应用程序打开终端输入如下命令&#xff1a; /usr/local/mysql/bin/mysql -u root -p(注意&#xff1a;Windows下的是&#xff1a; mysql -u root -p)其中root为用户名。这时会出现如下命令&#xff1a;Enter password: 123456这样就可以访问你的数据库服务…

Java即时编译:不仅仅是一个流行词

最近的Java生产性能问题迫使我重新审视并真正欣赏Java VM即时&#xff08;JIT&#xff09;编译器。 大多数Java开发人员和支持人员都听说过这种JVM运行时性能优化&#xff0c;但是有多少人真正理解并欣赏它的好处&#xff1f; 本文将与您分享在添加新的虚拟服务器&#xff08…

php ajax实现分页效果

ajaxpage.php【这里是数据展示页面的代码】: <meta charset’utf-8′> <script src” http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js ” type”text/javascript”/></script> <script type”text/javascript”> //获取当前url地址…

常用的JVM调优参数总结汇总【随时查阅学习】

本文章参数根据后期用的参数会持续更新 --- &#xff08;1&#xff09;-Xms20M 表示设置JVM启动内存的最小值为20M&#xff0c;必须以M为单位 &#xff08;2&#xff09;-Xmx20M 表示设置JVM启动内存的最大值为20M&#xff0c;必须以M为单位。将-Xmx和-Xms设置为一样可以避免J…

win10设置计算机关机时间,教你windows10电脑怎么设置定时关机

今天小编教你windows10电脑怎么设置定时关机&#xff0c;相信大家都有过这样的经历吧!那就是有时开着电脑玩累了,躺在床上睡了一会&#xff0c;结果醒来的时候发现睡了比较久&#xff0c;且还不愿意下床关电脑怎么办&#xff0c;其实我们可设置定时关机&#xff0c;有需要的用户…