测试驱动开发–双赢策略

敏捷从业人员谈论测试驱动开发 (TDD),所以许多关心代码质量和可操作性的开发人员也是如此。 我曾几何时,不久前设法阅读了有关TDD的文章。 据我了解,TDD的关键是:
  1. 编写测试,但失败
  2. 代码,使测试成功
  3. 自动化测试
  4. 重构代码以提高质量
  5. 重复

很容易理解。 恼火的开发人员大喊:“开发人员在编写测试吗? 您如何期望我们开发和测试并及时完成功能?”。 毕竟,所有开发人员都不想做无聊的测试工作。 我从事开发人员大约两年了,在最初的几天里,有时我会做出这种反应。 但是随着时间的流逝,我已经开始理解软件开发的症结所在。 这次我想到尝试TDD。

我的工作涉及使用Java EE Web框架通过UI在db中连接数据库中的数据,这是典型的Web应用程序工作。

让我解释一下在采用TDD之前的测试策略:

  1. 编写完整的代码,其中包括-PLSQL过程,调用PLSQL过程的Java代码,用于UI绑定的Java代码以及JSP页面本身。
  2. 手动测试db层和UI层代码的功能。 它涉及导航到页面,然后测试各种操作。 在这种情况下,UI问题和后端代码问题都会出现。
  3. 正如我将进一步研究UI一样,我将在代码中发现一些错误,否则将编写一个硒测试以自动测试一些用例。

通过上述3个步骤,我花了很多时间-

  1. 等待后端代码编译,然后重新启动服务器以使UI反映更改。 即使它只是一个简单的1词/ 1语句更改,我也不得不等待大约5分钟,有时甚至是8分钟。 当我等待重新启动时,我会失去对其他任务的关注,因此需要一段时间才能回到主要任务。
  2. 尝试调试并找出异常/错误是由于UI代码问题还是后端代码问题引起的。
  3. 等待页面加载并浏览页面到正确的页面。

好的,那是史前时代。 现在正走向现代。 我以为我无法完成TDD的工作,这是因为我编写了后端和UI代码耦合不良的代码。 我想不出一种方法来独立测试后端代码,然后移至UI代码,然后通过硒测试对其进行测试。 抛开这些概念,我试了一下。 我知道我与实际的TDD距离不太远,但感觉有点接近。

  1. 我对如何实现逻辑,创建基本实现并使其成功编译有一个很明确的想法。
  2. 创建了一些数据填充测试,以获取用于测试的数据类型。
  3. 创建了JUnits以测试基本功能。 主要是通过Java API正确执行PLSQL过程。
  4. 更新了JUnits以添加更多测试以测试所需的实际功能,并更新了代码以实现这些功能。
  5. 重构代码以消除难闻的气味,然后运行JUnits以确保没有任何损坏。

我感到兴奋的原因,以及我认为这是双赢的策略:

  • 我开始考虑的是API用户而不是API创建者。 这使我无法添加可以解决问题但难以测试的黑客。 与以前编写的代码相比,这极大​​地改善了代码结构。
  • 无需重新启动服务器,每次重新启动不会浪费〜8分钟,也不会浪费浏览页面的时间。 我只需要编辑代码,运行Junit并查看测试即可确定命运。 这对于我编写的后端代码更有用。
  • 我专注于代码测试周期,因此不会失去重点。
  • 我看到测试显示绿色的成就感。
  • 创建具有良好单元测试的代码以测试后端功能的可能性,这也有助于更轻松地重构代码。

现在,我只需要为UI和后端编写粘合代码,并通过硒测试来测试粘合代码。

任何人开始使用TDD时都有类似的经历吗?

参考: 我在测试驱动开发中的第一步-我们的JCG合作伙伴 Mohamed Sanaulla在“ 体验无限”博客上提出的双赢策略 。


翻译自: https://www.javacodegeeks.com/2012/05/test-driven-development-win-win.html

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

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

相关文章

设计模式学习(三)——装饰器模式

前言 距离上一次正儿八经地写随笔已经有一段时间了,虽然2月10号有一篇关于泛型的小记,但是其实只是简单地将自己的学习代码贴上来,为了方便后续使用时查阅,并没有多少文字和理解感悟。之所以在今天觉得有必要写点东西,…

swift - 导航栏设置

话不多,直接贴代码: let nav UINavigationController.init(rootViewController: viewController) nav.topViewController?.title title// 设置导航栏的标题 nav.navigationBar.tintColor .whiteColor()// 设置push出的导航栏的返回颜色(箭头及文字) …

mysql5.6主从复制(读写分离)方案_MySQL5.6主从复制(读写分离)方案

MySQL5.6主从复制(读写分离)方案一、前言:为什么MySQL要做主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低。为了提升业务系统性能,优化用户体验,可以通…

在实践中使用延迟队列

通常,在某些情况下,当您有某种工作或作业队列时,有必要不立即处理每个工作项或作业,而是要延迟一些时间。 例如,如果用户单击一个按钮来触发要完成的某项工作,而一秒钟后,用户意识到他/她错了&a…

PCL学习八叉树

建立空间索引在点云数据处理中有着广泛的应用,常见的空间索引一般 是自顶而下逐级划分空间的各种空间索引结构,比较有代表性的包括BSP树,KD树,KDB树,R树,四叉树,八叉树等索引结构,而…

Android实现自定义带文字和图片的Button

在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法。 一.用系统自带的Button实现 最简单的一种办法就是利用系统自带的Button来实现,这种方式代码量最小。在Button的属性中有一个是drawableLeft,这个 属性可以…

mysql语句中的注释方法_MySQL语句注释方式简介

MySQL支持三种注释方式:1.从‘#字符从行尾。2.从‘-- 序列到行尾。请注意‘-- (双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如空格、tab、换行符等等)。3.从/*序列到后面的*/序列。结束序列不一定在同一行中,因此该语法允许注释跨越多行。…

aqlserver实用程序_sqlserver命令提示实用工具的介绍

除上述的图形化管理工具外,SQL Server2008还提供了大量的命令行实用工具,包括bcp、dtexec、dtutil、osql、reconfig、sqlcmd、sqlwb和tablediff等,下面进行简要说明。dtexec实用工具用于配置和执行SQL Server2008 Intgration Services包。用户…

使用Java和Scala将Play Framework 2应用程序部署到Openshift

几个星期, 马克阿特伍德 ( Mark Atwood) , 豪尔赫阿里斯 ( Jorge Aliss )和我塞巴斯蒂安 斯卡塔诺 ( SebastinScarano)参加了红帽网络研讨会LETS PLAY! 在云端&#xff1…

LintCode 387: Smallest Difference

LintCode 387: Smallest Difference 题目描述 给定两个整数数组(第一个是数组A,第二个是数组B),在数组A中取A[i],数组B中取B[j],A[i]和B[j]两者的差越小越好(|A[i] - B[j]|)。返回最小差。 样例 给定数组A …

android框架----下沉文字Titanic的使用

Titanic is a simple illusion obtained by applying an animated translation on the TextView TextPaint Shaders matrix. Titanic的使用 Titanic的使用,项目结构如下: 一、下载Titanic并且部署到项目中 Titanic的项目地址: https://github…

linux 自动安装mysql_Linux安装mysql

一、下载这里我创建了一目录software用于存放我们待会要下载的mysql包,先去到该目录命令:cd /software命令:wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar下载完成后,你会在software这个…

Quartz Scheduler插件–隐藏的宝藏

尽管在官方文档中进行了简要描述,但我相信Quartz插件了解得还不够多,看看它们有多有用。 本质上,Quartz中的插件是方便的类,用于包装基础侦听器的注册。 您可以自由编写自己的插件,但我们将专注于Quartz随附的现有插件…

mysql查询表名匹配只有字母的_MySQL按某些匹配字母查询表

MySQL查询是MySQL的核心功能,有时候我们需要查找带有某些匹配字母的表。下文对该MySQL查询方式作了详细的介绍,供您参考。在MySQL中我们可以使用LIKE或者NOT LIKE操作符进行比较。在MySQL中模式默认是不区分大小写的。查询示例,student表----…

hdu 1181(Floyed)

变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 20748 Accepted Submission(s): 7494 Problem Description呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的…

读书笔记-你不知道的JS上-混入与原型

继承 mixin混合继承 function mixin(obj1, obj2) {for (var key in obj2) {//重复不复制if (!(key in obj1)) {obj1[key] obj2[key];}}return obj1;} 这种复制是浅复制,对象或者数组函数等都是同一个引用,改变obj1的会同时影响obj2。 寄生继承 ... 隐式…

JUnit和Hamcrest:在assertEquals上进行改进

在我的博客文章中,Java越来越接受静态导入吗? ,我讨论了在Java中越来越多地使用静态导入来使代码在某些情况下更流畅。 Java 单元测试特别受静态导入的影响,在此博客文章中,我提供了一个简单的示例,说明如何…

mysql delete temporary denied_这些错误是什么意思?djang中的mysql

我试着运行一个程序,我被给予了一个例子,它就像一个购物网站,使用MySQL数据库而不是Django提供的原始数据库!我只是想看看有没有人理解这些错误的含义?任何信息都将不胜感激!我本可以提供网页的代码&#x…

C语言 · 芯片测试

基础练习 芯片测试 时间限制:1.0s 内存限制:512.0MB问题描述有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试…

Animation用法

测试代码及说明&#xff1a; <!DOCTYPE html> <html lang"en-US"> <head><meta charset"UTF-8"><title>Simple CSS3 Animation</title><style type"text/css">#demo {position: absolute;left: 30%;t…