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

Any tool to help unit testing?

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

不是直接回答你的问题,但最好的 "tool" 让 phpunit 更容易的是你的代码的良好设计。如果您不确定针对给定问题的好的设计是什么,那么您已经在使用其他可用的好工具 - 这个站点。

您在问题中提到的造成困难的事情通常很困难,因为您的代码设计存在问题。如果它难以测试,那么重构、使用和维护也将变得困难。这些测试会在编码过程的早期向您展示这一点,并允许您进行更改以使未来的自己免受问题的困扰。

比如你问题中的难点:

  • Mocking private functions - 这是闻一闻有二 class 需要创建。你的对象可能违反了 单一职责原则。这个功能应该是 移动到它自己的对象中并传递给被测系统。

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

  • 模拟静态方法 - 关于这个有很多问题 困难和许多资源都说静态方法不好 设计。如果你需要模拟一个静态方法,那意味着你是 影响全局状态。静态方法也隐藏依赖 来自您对象的用户并使事情难以修改。您的 设计变得不那么灵活而更加模块化。

不需要测试私有方法和属性。它们是私有的是有原因的,并且只有在从包含它们的 class 内部调用时才有意义。此外,如果您测试 public 方法,您也在间接测试它调用的私有方法,并且 public 函数的结果也可能取决于您也在测试的一些私有属性public 方法。

如果您测试 class 的所有 public 方法(即它的接口),我的意思是完全 code/branch 覆盖这些方法,那么您正在测试所有私有methods/attributes 需要。如果在测试完所有 public 之后您还剩下一些未达到的代码片段,那么您可以安全地删除该代码,因为它没有用。