写 ruby 代码也有 2 个月多了。rails 当然是必配的。 但是单元测试写的真的不多。可以说基本没怎么写~!。说下原因吧。 1、不太习惯 rails 里面这种单元测试的方式,在学习的时候,对单元测试也没太深入,所以可能不是很顺手的说~! 2、前几天耐着性子写了一个,但是过了几天,业务改变,再运行的时候惨不忍睹。。如果想炮通,必须修改测试代码。。个人感觉浪费时间啊~!(其实改个功能性的东西,或者页面的东西,花了 10 分钟改完了,单元测试写了 10 分钟,然后再调试,又花了 10 分钟,终于跑通了)我是这么一情况啊
不知道各位大神有什么建议啊~!欢迎拍砖,拍石头,下冰雹。,狠狠的砸吧~
=======
update
不知道有木有创业的兄弟,创业项目在时间紧迫的情况下,还有坚持写测试代码吗?
#11 楼 @jarorwar 用 seed 还算好了,起码不是手工填数据。刚开始尝试写测试,可以不按全套 TDD 的做法来,完全掌握 TDD 需要不少时间,起步的时候会让你的产出率下降得相当严重,可能一天只能提交十几行产品代码,十分打击人。
我的应对做法是 Test After,在写好一个最小逻辑单元(通常是一个方法,或者函数)后再写测试代码,通过测试后再继续写产品代码。只测试一些比较关键的,出了错不容易发现的部分,通常是 Model,从来没有测过 UI。这样对产出率的影响比较小,也容易坚持下去。我自己不搞全套的 TDD,经常 Test After,更加不追求测试覆盖率。
当你在界面上点来点去为了 debug 一个功能的时候,考虑写个测试吧。
OK,我先说第一个问题:需求是否合理不过问,无条件实现。
在这个问题下,测试能帮助我们什么呢,比如说覆盖方法或模块的边界条件就是很好的例子。假如说你不写测试,在需求未变的情况下出了 bug,排查再修改的时间会更“浪费”。但如果有之前的测试做底子,你只需要用测试重现 bug,然后再重构就好了,目的性和指向性极强。
至于说需求变更导致测试和代码都要重写,这个我只能说很遗憾,测试原本就是为了忠实于需求的,需求本身都变了,测试能不变吗?你觉得因此而多写了代码(测试)很累,这是可以理解的,不过为了以后着想,以及为了团队所有成员的协作着想,这是值得的。
最后,如果需求总是变来变去,请不要责怪测试,因为这是你们团队整体的问题,或者是和其他利益相关方的沟通问题。
第二,需求会涉及多个模块,要改都得该。
这……是测试的错吗?或许你们应该从设计角度来考虑一下现在的代码实现,看看耦合度是不是太高了?或者类和模块的抽象度和通用度不够/可以改进?
大体上你可以有两种“武器”来解决依赖性问题的测试,一种是验收测试(有时候可以在一些情况下和集成测试互换概念,但这样并不好,所以 RSpec 和 Capybara 才会单独分离出 Features Spec),它不太关注系统模块中的耦合情况,而是从输入/输出的角度来做一个黑盒测试;比如说,从用户在界面上的操作开始,到用户看到的视觉反馈结束,隐藏中间的系统实现过程。
还有一种就是单元测试了,单元测试则完全不应该受系统模块的耦合约束,需要相互依赖调用的可以使用 stubbing / mocking。
所以说,就算你无法改变高耦合这样的项目现状,你也完全可以采取不同的测试策略来减少耦合带来的修改联动性;注意,不是说实现代码不用改,而是把测试分离开避免修改的联动性导致测试被连带修改。这样一来,被联动的代码只要其对应的业务逻辑(需求)没变,测试就不需要大改特改。
然而说到底,我还是觉得这是代码设计层面不够好,好的设计不应该总是“牵一发而动全身”,除非需求变化的太频繁,太剧烈——还是回到最初,这不是测试的问题,而是团队本身或沟通的问题。
最后,“Typing is not the bottlebeck”,不要误解“因为写了测试,所以我要多打/多改一倍的代码,浪费时间”,这种想法根本上就是带有偏见的,狭隘的。
===回答你最后一句话===
越是时间紧急,越要写测试,特别是创业项目——人无远虑,必有近忧!
#21 楼 @blacktulip 嗯。我想也是这样的吧~今天开始看书,学习。谢谢各位了~ @nightire ,真是良师啊~ 最近 ruby 写的我不想写 java 代码了。无奈,时不时还要去写一些。。呵呵
@wjch 400 行 java 你没有漏算 import
吧?还有页面 jsp (相信你不会把查数据库之类的放 jsp 里吧?), 还有各种 web.xml, pom.xml 配置文件...
嗯嗯,用注解一下就可以省好多代码啊,又想起用 servlet 写 cms 的一个 dao 类就是几百行的极度苦逼...这个一下就简化了好多...也在试着学 ror,打算用它来学一些比较流行的技术....
我刚开始学,教程里也是推荐 TDD(测试驱动开发)。→_→http://railstutorial-china.org/ 个人感觉比 { 开发->测试 } 这个流程效率要高,最重要的还是测试用例的设计,如果没做过测试的话这方面可能是要生疏点。
单元测试是上述测试的基础,如果@jarorwar没有上述需求,可以不用写单元测试,无非就是 a. bug 多点(增加客服人员和测试人员) b. 代码行数多了之后,不知道相关代码的作用(只增加,不删除或修改代码) c. 不提供对上一个版本的支持(宣传是新品,另收费) d. 看到有问题的代码,有可能改出更多,更严重的问题或将问题埋的更深 (能不改就不改)
更多的问题尚未发现,望砖之。