任何帮助单元测试的工具?

时间:2015-05-18 10:28:32

标签: phpunit

我正在使用phpunit。但是你知道它的困难,没有可能模拟私有函数,访问私有变量等等。有没有一个工具可以帮助我?将私有函数转换为public的东西,将静态方法转换为mockable等等

2 个答案:

答案 0 :(得分:4)

不直接回答你的问题,但是让phpunit变得更容易的最佳“工具”就是设计好代码。如果你不确定给定问题的优秀设计是什么,你已经在使用另一个可用的好工具 - 这个网站。

您在问题中提到的导致困难的事情通常很困难,因为您的代码设计存在问题。如果难以测试,则很难重构,使用和维护。测试在编码过程的早期阶段向您展示,并允许您进行更改以保护您未来的自我免受问题的影响。

例如,您的问题存在困难:

  • 模拟私人功能 - 这是一种气味,有一秒钟 需要创建的类。你的对象可能违反了 单一责任原则。这个功能应该是 移入自己的对象并传入被测系统。

  • 访问私有变量 - PHPUnit确实有对象的断言 属性(assertAttributeEquals, etc.)。不过这真的 不是你应该使用的东西。私有变量是 你的对象的实现细节,应该有某种 您可以用来验证正确信息的公共方法 已设置(getter或依赖注入模拟对象)

  • 模拟静态方法 - 关于此,有很多问题 困难和许多资源说静态方法如何不好 设计。如果你需要模拟静态方法,那意味着你是 影响全球国家。静态方法也隐藏了依赖项 来自您对象的用户并且难以修改。您的 设计变得不那么灵活,更加模块化。

答案 1 :(得分:2)

需要测试私有方法和属性。由于某种原因,它们是私有的,只有从持有它们的类内部调用时才有意义。此外,如果您测试公共方法,您也间接测试它调用的私有方法,公共函数的结果也可能依赖于某些私有属性,您也使用公共方法进行测试。

如果你测试一个类的所有公共方法(即它的接口),并且我的意思是这些方法的完整代码/分支覆盖,那么你正在测试需要的所有私有方法/属性。如果在测试了所有公共内容之后,你会留下一些未到达的代码,那么你可以安全地删除那些代码,因为它没用。