php

PHPUnit单元测试中类protected/private方法测试

这里首先有一个问题要考虑的是,这类方法是否要被测试?


理论上,这类方法都会被其它public类型的方法调用,只要对那些public的方法做充分的测试,就可以保证这些方法的可靠性,就没有必要再测了。好像是有道理的。


我们先看看好的单元测试的原则:(ATRIP)



  • 自动化(Automatic)

  • 彻底(Thorough )

  • 可重复(Repeatable)

  • 独立(Independent )

  • 专业(Professional)


对于测试private/protected方法来说,有另外三个附加原则:



  • 透明(Transparency) - 不要改变测试下的系统(System Under Test ,SUT),例如,在产品代码中增加包装的方法.

  • 范围(Scope) - 可以在Debug和Release下运行

  • 简单(Simplicity) -最小的开销,因此容易修改,并且非常简单引入最小的风险.


正常情况下,PHP中只有标记为public的方法和属性,才可以在外部被访问,而protected/private方法都无法直接访问。


对于protected的,简单的方法是:通过创建一个子类并增加一个public的方法来包裹该protected的方法,即可通过这个子类的public方法来测试。


对于private的方法,则只能利用PHP的反射特性去访问,protected的方法同样也可以用反射实现访问。PHPUnit中其实在Mock Objects部分就充分使用了该特性来拦截某些方法的返回值,以完成复杂场景的测试。




0 个评论

要回复文章请先登录注册