Posts Mentioning RSS Toggle Comment Threads | Keyboard Shortcuts

  • tin 7:55 am on January 31, 2008 Permalink | Log in to leave a Comment
    Tags: , , ,   

    写javascript单元测试是挺爽的事,可惜不要在safari上? 

    对于javascript来说,通过单元测试,你也可以实现TDD。对你非常有好处,一是减少了js变动带来的代码退化问题,另外一方面是TDD可以改变你设计程序的方式。
    举个简单的例子,写javascript很多情况下是和BOM(也就是文档模型)和DOM打交道的,这样可以说javascript程序很容易与dom高度耦合,这样的程序运行起来没有问题,但是应对需求变化的能力会比较地。但是根据人的思维方式,javascript很多时候是先出页面,然后根据页面逐渐调试着写出javascript,对于开发者来说,脑子里并不是真正的清楚自己要什么,而是在想界面的结果……这样产生的高耦合代码不容易测试,也难以面对多变的界面。
    所以,换一种方式思考。如果用单元测试的方式去写,你就需要考虑程序的可测试性,这会细化你的程序的模块粒度,因为细粒度的抽象容易单元测试。同时由于js单元测试的页面是mock出来的,所以一般都会尽量的简单,这样会减少程序远对界面的依赖。同时由于界面的可测是性问题,也许会减少对element的style的修改,转而使用语义话的css。例如如果一个元素高亮,你可以element.style['font-size']=’bold’;element.style.color=’red’l….,当然你也可以element.addClassName(‘highlight’),然后那些不好验证的界面的约束条件可以放到css里面去,放给可用性和用户验收测试去验证。这样的单元测试的验证条件(assertion)会简单很多,如果写过单元测试的朋友肯定会有感触的。
    那么,常见的Javascript的单元测试框架有JsUnit和scrit.aculo.us的单元测试框架两个。前者方便用ant调用和分析结果,适合使用了ant的项目。而后者的优点就是界面好看,直接运行产生的报告清楚漂亮。所以小型项目我倾向后者,而大型项目我倾向前者。当然,由于js的动态特性,其实做个单元测试框架非常简单,所以自己动手也无妨。关键是要写,而且争取做到测试先行。

    前面是个引子,其实写这个的原因是今天上午的一个郁闷的事。
    前面的blog entry说道我升级了Firefox3,结果遇到了getElementsByClassName问题。但是今天换到另外一个项目组,没有用那个方法,程序也正常。可是我TDD的写一个新的feature的时候却发现可爱的JsUnit的testRunner在Firefox3里面无法工作,从firebug里面看到了一堆安全性问题。估计是firefox3的新安全模型造成的吧。那么,由于firefox3覆盖了firefox2,所以难道我没法写程序了?当然不可以,还有safari嘛。马上开始去写测试了,写好测试执行测试,发现红条。嗯,很满意,因为TDD的红-绿-红-绿的节奏就是这样的。然后我开始去写实现来满足这个测试……结果忙活了一上午就是不行……而且发现一些原来的测试也无法通过了……我仔细寻找问题,diff修改的内容,可是最后实在没有发现任何让它不能通过的原因,因为手工在firebug里面都已经验证了写的实现是没有问题的呀……崩溃。此时我突然想起来我们的持续集成服务器里面没有跑safari的JsUnit测试……也就是说不能确定在safari下全绿(此时的背景是我们的持续集成显示全部绿色,也就是说所有的测试都可以同过,包括windows和linux平台还有IE及Firefox),那么我可能衰了。马上开动camino(靠,一上午都忘记用它执行JsUnit了,因为我的习惯是Camino里面保存to read list),运行一下全绿。很兴奋,但是感觉刚才寻找问题的1个多小时被无辜的浪费了,心疼呀。

    那么,请注意啦,我只是想提醒,jsUnit可能不能在safari下正常工作(大部分测试没有问题,少量在其它浏览器正常的测试在safari下无法工作),我用的是safari3.0.4……

     
  • tin 7:19 am on January 31, 2008 Permalink | Log in to leave a Comment
    Tags: , , Prototype   

    Firefox3 beta2带来的getElementsByClassName问题 

    Firefox3解决了一些内存泄露问题,或者说主要的是解决了一些长时间运行以后的内存占用问题。由于使用mac的习惯是休眠不关机,所还是在正式版出来之前选择了升级到firefox beta2。
    那么作为开发人员肯定遇到firebug不能用的问题,还好,我们可以用firebug的beta版本来解决这个问题,当然这个firebug还是会出现莫名其妙的问题,无所谓啦,不久就会发布正式版本了。
    这些都是废话,问题集中在firefox beta2提供了原生的getElementsByClassName方法,而我们大家都很愿意使用的prototype库正巧也给Element封装过getElementsByClassName方法,看起来两者的作用是一样的,但是不巧……其实两者还是有很大差别的,所以造成了如果你的项目正巧用了getElementsByClassName方法,而后你又用习惯的prototype方式便利了它……那么你的程序就不能在Firefox3 beta2工作了……
    我们以前的习惯就是不用考虑新浏览器的javascript兼容行问题,只需要考虑向后兼容,但是这次问题还是出现了变化。
    其实原因是简单的:
    1、Firefox3实现的原生getElementsByClassName方法返回的不是javascript数组(Array),而是html element collection,这个东西可以用标准的方式遍历,但是却与Array没有共同的prototype(这个指javascript里面的原型继承的prototype)。所以,很不幸,如果你用了Prototype库的那个返回Array的方法写程序,然后使用了Array增强方法里面的first()等方法或者Emmerable里面的each()等方法,那么程序一定会出错。此时你可以$A一下这个html element collection,但是这不是好方法。因为其实Prototype在1.6以后就不推荐使用getElementsByClassName方法了。
    2、那么解决的方法就是使用select方法代替原来的getElementsByClassName方法,不过记得要给参数的前面加个”.”。比如oneElement.getElementsByClassName(‘someClass’)应该修改为oneElement.select(‘.someClass’)。而其实select方法由于接受css selector语法,可以实现更强大的选择操作。

    嗯,非常废话。
    那么简单的说:如果你在Firefox3里面发现你的基于Prototype库的js程序的getElementsByClassName以后出现了method null的错误,那么你需要用select方法代替它。且考虑到长时间的不兼容状态,最好完全消除你的程序中的getElementsByClassName同名方法调用,不关你用什么js库。

     
  • tin 7:34 am on January 25, 2008 Permalink | Log in to leave a Comment
    Tags:   

    Pragmatic Programmer的穿着 

    来到ThoughtWorks以后有一个很有意思的发现,这里可能是我见到的穿赠品衣物最多的公司。赠品衣物就是公司为了宣传而印刷的T-shirt或者大衣,质量一般,上面还有鲜艳的商标或者口号,所以一般大家收到后都是不穿的。可是在一家重视实践的咨询公司里面却有这样有趣的现象,我们来思考一下。

    1、好的程序员可能会有一些Geek的特性,他们愿意搞清楚事物运行的方式,但是却忽略了自己。他们的精力愿意用来学习和娱乐,而外貌问题,可能不是非常重要。除非是去找伴侣的时候……所以他们的时间用来上网,写作,玩游戏,但是不会用来逛街买衣服。

    2、程序员的实用价值观。从敏捷逻辑上来说要消除浪费,减少预先的需求,而外貌本身不是直接收益的,而是潜在的影响,所以花很多钱在衣服上会被认为是一种需求浪费,因为你过度要求了(类比于过度设计)。所以要在非要不可的最后一刻再解决它。可能程序员在参加重要活动的时候可以穿西服,但是哪一定不是程序员聚会,而是……所以,可以从节省钱的角度来说,赠品是成本最小话却可以满足基本要求的选择。

    3、程序员相信自己,胜过别人。所以程序员更以来于自己的工具,电脑和网络……那么减少了砍价这个非常麻烦的人与人沟通的方式,如果我们可以尽量的利用身边的资源,那么……所以你看到参加各种活动的时候程序员真的会非常在意厂商发放的服装……

    4、ThoughtWorkers很多都自豪自己的公司和产品,所以他们愿意穿公司产品的宣传服装。比如背包……我看的男女ThoughtWorkers几乎都背的……虽然这样的商标在大街上被认出来的可能是非常小的,但是大家还是愿意背它,原因可能是一种发自内心的认可。

    小处见大。我想第四条是非常有意义的,你愿意背出你的IT公司的包么?你的公司值得你自豪么?你是个不在乎着装的程序员么?我们应该不停思考。

     
c
compose new post
j
next post/next comment
k
previous post/previous comment
r
reply
e
edit
o
show/hide comments
t
go to top
l
go to login
h
show/hide help
esc
cancel