【问题标题】:Any tool to help unit testing?有什么工具可以帮助单元测试吗?
【发布时间】:2015-07-29 19:34:17
【问题描述】:

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

【问题讨论】:

  • 访问类的私有函数和方法的需要表明你做错了(测试或测试的类或两者)。测试类的接口(即公共方法)。你不能关心它完成工作的内部方式。

标签: phpunit


【解决方案1】:

不直接回答您的问题,但使 phpunit 更容易的最佳“工具”是良好的代码设计。如果您不确定针对给定问题的好的设计是什么,那么您已经在使用另一个可用的好工具 - 这个网站。

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

例如在您的问题中遇到的困难:

  • 模拟私有函数 - 这是一种气味,有第二个 需要创建的类。您的对象可能违反了 单一职责原则。这个功能应该是 移动到自己的对象中并传递给被测系统。

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

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

【讨论】:

    【解决方案2】:

    不需要测试私有方法和属性。它们是私有的是有原因的,并且只有在从持有它们的类内部调用时才有意义。而且,如果你测试一个公共方法,你也在间接测试它调用的私有方法,而公共函数的结果也可能取决于一些私有属性,你也在用公共方法测试。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2010-09-23
      • 2010-12-05
      • 2019-08-14
      • 1970-01-01
      相关资源
      最近更新 更多