(安正超/安小超)PHP单元测试
Tip:在这里分享的某些观点,会在超神共享的单元测试Pdf里面有提及,也算是补充.
[福利分享]PHPUnit 作者写的单元测试最佳实践: http://t.cn/RqOLYgk 同时也提到了一些代码的写法,建议详细阅读。
以下的是超神对单元测试的一些见解以及细节.
不过不要滥用静态写法,工具类很多时候都不用测试.看到那段长长的代码就拆分到不同的职责的方法.完美的测试应该是黑白都要覆盖全的.
[他人疑问]黑盒是不是类似集成测试, 具体话就是类似前端里的 selenium 那一套?
[解惑](安正超)严格来讲是让一个不明白代码逻辑的人来测试的意思,不过在php单元测试上来讲,就是给一些不正确格式的输入.比如你的参数期望接收数组,但是我传一个数字进去,如果你没有严格检查就出bug了.
[他人疑问]那如果写了好多疯狂的 testHandlerCanNotNull 是不是也不知不觉的算是黑盒了?感觉追求黑盒太难了呀,还要精心构造预期之外的东西.
[解惑](安正超)是呀,不过吧,一般的项目写白盒就够了.如果是支付这样的比较关键的,就写严格一些,用上黑盒,不然时间上真有点开销不起.
很多时候可以用 data provider 来完成一些重复性的测试工作.比如我昨天写一个接口,要求 6月4号期间不让微博用户更新资料.3、4、5这三天都是不让改资料的.
PS:请忽略类名的写法(yaf这个框架就是这么规定的,与业务代码保持一致)
[他人疑问]fail() 的作用是?
[解惑](安正超)试想,$controller->process() 没有抛出异常,不过$this->setExcepectException这样应该不用写fail,有时候我要测试两次异常,我就习惯用try...catch的写法,在 try 里最后一句都会加 $this->fail,来搞定没抛出异常的情况.
[他人疑问]这个疑问算是很多人要问的.单元测试对一个项目来说非常重要?
[解惑](安正超)目前是“保证最小单元是正确的”,这样一来,大模块出问题的可能性就会很小.试想,你做事情每一步的都正确执行了,而且能逼自己一步步改进代码
[他人疑问]什么样的代码算一个单元?
[解惑](安正超)phpunit 里一个function 算一个最小单元
安正超 - PHP单元测试分享 密码:ujho
PHPunit作者分享 最佳实践
[他人疑问]还是不懂,通常我理解的是,自己写的代码。逻辑在心中,没有得到想要的结果,再回头找,哪里需要单元测试了?
[解惑](安正超)因为写测试的难度与代码质量成反比,单元测试的益处除了上面我们聊的以外,它另外一个好处就是 **应对变更**.这个变更可以理解为,第N天后不管出于什么目的来修改代码,修改代码的时候怎么保证你的修改没有对以前的特性造成破坏.
如果保证你的修改没有出问题,当然你会说,我去跑一遍就知道了,这话虽然对,但是这个过程很辛苦,如果修改完代码跑一遍测试大概20秒不到,至少保证了你的代码是OK了,
就算上线,可能也只是逻辑上的疏忽,不会出现一些低级错误
[国内现状]
高度迭代,测试什么的占时间不宜过高,因为国内很多团队的项目管理质量太差,导致项目乱,迭代不稳定,代码质量低,就会出现大量的加班,改需求,改代码,所以这样的场景下写测试真的会比较**浪费**时间
[经验分享](Abraham) 如何找范例
PHPUnit的范例资料,一般就是看完 phpunit(事实上的 php 单元测试标准) 文档之后, 去github 上找别人的包,翻他的 tests 目录怎么写的。测试可以不写,多数人自己做点小玩意都不会写,但最好是掌握,比如找工作的时候,同样别人看你的代码,有没有 tests/ 很多时候就是 5k 和 15k 工资的差别
方方觉得经验单单只讲一个人的并不够,多个人多个看法,所以还是把Ab兄的一些单元测试的理解摘抄下来.
群里的聊天记录,都是宝藏(福利也算),不过更大的宝藏还是群里几位牛牛. 愿意不吝分享自己的知识的同时还肯悉心引导别人的更少见.