经过前几篇的测试学习跟实践,我觉得有必要对这次学习做个总结。其实上面的话只是幌子,主要原因还是javaeye的
lighter 写道
貌似这一篇文章要放在"agile"版块更好一些吧.
btw:wuhua同学写文章有时候可以把两篇结合成一篇,可能会更好一些,不然让别人看一篇文章要看一,二,三,四才能看完.个人建议而已,别见怪.
觉得他说的很对,当时是出于篇幅过程,怕javaeye blog不支持大篇幅的文章,所以拆开。不过我觉得我这个担心是多余的。这里说句题外话,我用过很多Blog,但觉得这里是最好的。速度快,写文章贴心(主要是对源代码格式化方面做的很出色)。
好了,进入正题。
先介绍下我以前写的那些文章先,让大家对这篇文章有个初步的认识。
单元测试之测试目的,
单元测试之实践一,关于设计的常见分层
单元测试之实践二,关于DAO的测试
单元测试之实践三 Service的测试
以前我正常的设计流程是Database->Model -> Dao-> Service -> Action ->View。这样的设计伴随我1年多了,这样的设计方式好吗?这样的设计高效吗? 代码质量能保证吗? 我可以很肯定的回答,不能,如果数据库一该,我要在表格里面添加一个字段,或者什么的。那么它将会牵连到很多其他,修改的动作如下:Database->Model -> Dao-> Service -> Action ->View。 噢,my got,几乎跟设计的一样多,甚至更多,因为在修改的过程中你就算有再好IDE去重构它也不能保证它的正确性。然后你就要去测试,测试它的正确性。也许测试的过程将是修改过程的几倍时间。所以我个人觉得这样的设计方式是不高效的。总而言之就是这样的设计迟早会出问题的?
为什么会这样呢?难道就没有一种解决办法吗? 经过这段日子学习我发现,以前的设计不能很好的保证质量是因为你没有足够的单元测试去支撑着它,所以你改了代码后缺乏一个很好的手段去保持这段代码的质量,换句话的意思就是,没有一个静态的人去监督你的工作(我把单元测试比喻为静态的人,它只做一件事,就是督促你的代码不出问题)。
好了。我们已经找到了适合保证我们代码质量的方法了。但是我们还得提高我们的开发效率啊。这又怎么办呢?是不是还按照以前的方式吗?我想自己浑浑噩噩的活了20多年了。我想换种活法了,想找种更刺激,更有意义的生活方式。
设计有时候更生活是一样的,应该经常探索,经常实践才能感受的更多。
那好吧我们就来个彻底的变革吧。怎么变呢? 很明显:那就是TDD。
该怎么做呢?
以前的方式:Database->Model -> Dao-> Service -> Action ->View。
TDD的方式:Test->其他。
先看看下面Dao的例子吧:以前的方式:IBaseDao -> BaseDao -> BaseDaoTest。
TDD:BaseDaoTest->IBaseDao->BaseDao.
- public void testFindAccountByName(){
- Account a = new Account("wuhua");
- ht.find("from Account as a where a.name=?", a.getName());
- List l = new ArrayList();
- l.add(a);
- control.setReturnValue(l);
- control.replay();
- Account result = accountDao.findAccounByName(a.getName());
- Assert.assertEquals(a.getId(),result.getId());
- Assert.assertEquals(a, result);
- control.verify();
-
- }
好,非常好,怎么这段代码不能运行呢?当然不行了,因为上面的很多类都没有。那我们这段代码的用途是什么呢?
用途就是:以为上面的从上面的代码我很清楚自己以后要做什么。1,要建立一个Model,里面起码有一个name属性,然后你会发现我们要测试的功能段是
accountDao.findAccounByName(a.getName()); 里面我们要求测试的SQL是from Account as a where a.name=?,意图明确吧。好,
我们写下实际代码吧。
java 代码
- public Account findAccounByName(String name) {
- List l = this.getHibernateTemplate().find("from Account as ", name);
- if(l != null && l.size() >=1)
- return (Account) l.get(0);
- else
- return null;
- }
好,代码写好了。去运行我们的测试吧。结果是令人失望的。怎么会是红色的呢。肯定是逻辑代码出问题了(如果测试代码没问题的话)。经过检查发现原来from Account as a where a.name=?跟from Account as 完全两码事。好改回去
java 代码
- public Account findAccounByName(String name) {
- List l = this.getHibernateTemplate().
- find("from Account as a where a.name=?", name);
- if(l != null && l.size() >=2)
- return (Account) l.get(0);
- else
- return null;
- }
怎么还是红色啊。我不干了(程序员暴躁的情绪出来了,我就经常这样)主管跟我说:“再查查吧。别灰心。”
后来查了半天发现原来
java 代码
- List l = new ArrayList();
- l.add(a);
我只renturn一个预期的对象a
java 代码
- if(l != null && l.size() >=2)
- return (Account) l.get(0);
- else
- return null;
而代码却要求我要传入预期两个对象才给我通过,所以代码只return null。
最后改了这段代码
java 代码
- public Account findAccounByName(String name) {
- List l = this.getHibernateTemplate().find("from Account
- as a where a.name=?", name);
- if(l != null && l.size() >=1)
- return (Account) l.get(0);
- else
- return null;
- }
终于通过了。绿色,绿色,我看到了。我对主管说。主管笑了。我也笑了
最后我郁闷下,写这篇文章足足话了我22个小时,
第一次写好了。杀毒突然重启。所以全没了。
第二次,提交不了。然后忘记备份,又全没了
第三次成功了。过程跟TDD差不多。
分享到:
相关推荐
测试驱动开发引领了新的开发浪潮,它与敏捷开发、极限编程共同成为JAVA高级研发人员关注的重点。附上TTD测试驱动开发的工程源码,供广大爱好者参考使用。
主要介绍关于测试驱动开发的相关知识,本文档是由幻灯片制作成PDF格式
关于软件测试的东西 关于软件测试的东西 关于软件测试的东西 关于软件测试的东西 关于软件测试的东西 关于软件测试的东西 关于软件测试的东西 关于软件测试的东西 关于软件测试的东西 关于软件测试的东西 关于软件...
TTD 学习测试驱动开发
TTD
TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD虽是敏捷方法的核心实践,但不只适用于XP(Extreme Programming),同样可以适用于其他开发方法和过程。
Programmed and designed by AZS.VN
2017主要网络安全威胁分析 企业提高安全性面临的最大障碍 在这场攻防较量中。。。 如何去更好地做出安全考虑 思科SAFE安全设计 Step1:安全能力设计 专业安全评估提炼安全需求 ...我们的目标:不断缩短 TTD
对于多通道宽带信号的数字波束形成( DBF) ,传统的相位控制方法会导致波束的指向偏移及扫描不准,需要使用真实时间延迟线( TTD) 来代替传统的移相器。相比模拟延迟线,在数字域上实现延时补偿具有成本低、精度高、...
react-native-ttd-gvr入门$ npm install react-native-ttd-gvr --save 大多是自动安装$ react-native link react-native-ttd-gvr 手动安装的iOS 在XCode的项目导航器中,右键单击“ Libraries ➜ Add Files to [your...
1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程...
#你好 是一个免费的Material Bootstrap Admin,其灵感来自Google的Material Design,其设计新颖新颖。 我们很高兴通过易于使用且美观的组件来介绍我们对材料概念的看法。 Material Dashboard是基于流行的Bootstrap...
语言:Tiếng Việt ttd Logistics提供在1288,Tmall,Taobao等电子商务网站上在线协助您的工具。 TTD的在线订购支持工具物流Chrome浏览器&Chrome Flag +是一个支持...图4:推车以与订单工具一起用于篮子后的产品。
字符串计算器T-303中TTD练习的存储库
在这个项目中,我为一个基于 web 的应用程序编写了测试文件,该应用程序读取 RSS 提要,使用 jasmine(行为驱动的 JavaScript 文档): : ##Instruction 在这里检查我的程序:http: Jasmine 将运行 7 个测试。 我...
类型 进行中!!! 用 node.js 和 express 编写的打字游戏 经过茉莉花测试 学习/使用的技能 TTD - 与茉莉花 节点.js 表示
该项目是通过引导的。...与API后端集成 节点 Ruby on Rails 在开发中代理API请求 配置代理后出现“无效的主机头”错误 手动配置代理 配置WebSocket代理 在开发中使用HTTPS 在服务器上生成动态<met
硝烟中的敏捷和xp(极限编程) 及 驱动测试设计(有中英文版本) 目前项目使用敏捷的越来越多,感觉这是些不错的敏捷指导开发和敏捷项目管理材料,值得学习
test_driven_hello_word_nodejs 根据 TTD,Node.js 中的 Hello World
TTD--Projeto-PI3 Um fangame de Genshin Impact feito pela equipe 3 do 3D na materia de PI3