gpt4 book ai didi

php - 共享单元测试装置

转载 作者:可可西里 更新时间:2023-11-01 13:18:23 26 4
gpt4 key购买 nike

我正在为一个项目(用 PHP 编写,使用 PHPUnit)编写单元测试,该项目的整个环境(加载的组件、事件、配置、缓存、每个环境的单例等)保存在一个对象中,所有组件用于相互交互(使用调解器模式)。

为了使单元测试运行得更快,我正在共享环境对象和一些其他对象(例如,在我的 View 对象测试用例中 [如在 MVC 的 V 中], View 管理器对象 [其中充当 View 对象的工厂并负责实际呈现]) 在同一测试用例中的测试(使用 PHPUnit 的 setUpBeforeClass() 和静态属性)。

尽管据我所知,我共享的对象不应该影响测试的完整性(例如,在 View 的情况下,环境和 View 管理器对象是共享的,但单独的 View 对象是为每个测试创建 - 这是测试用例实际测试的对象),这对我来说越来越不对劲。

如果每个测试都使用完全隔离的环境并且不会以任何方式影响同一测试用例中的其他测试,我会更喜欢它。然而,这会使测试运行得更慢,而且对于我无法真正指出其缺点并且主要只是“感觉不对”的东西来说,这感觉是一个很大的代价。

你怎么看?您能否指出任何缺点,以便我说服自己值得更长的执行时间?还是我只是 react 过度,一切都很好?

最佳答案

我和你有同感,所以也许我只是陈述我遇到这个问题时的目标和解决方案:

  • 开发人员应该有一个运行非常非常快的测试套件
  • 至少单个测试用例应该在不到一秒内执行
  • 真的想确保我的测试用例中没有相互依赖

我假设您有一个正在运行的持续集成服务器。如果不是 cronjob 可能会做,但考虑设置 jenkins ,它是 really really easy .


对于正常使用:

只需共享所需数量的灯具即可获得所需的速度。它可能不是很漂亮,并且在此过程中可能会有更好的解决方案,但如果您的创建成本很高,那就只做一次。

我建议在 setUpBeforeClass 上使用辅助方法 getFoo() { if(!self::$foo) .... create ... return $foo;} > 因为它可以使共享更容易,但主要是因为以下几点。

每晚一次:

使用 --process-isolation 运行您的测试套件,并在该 Bootstrap 中重新创建您的完整数据库和所有内容。

它可能会运行 6 小时(为此禁用代码覆盖率!),但如何在乎呢。将为每个测试用例重新创建您的固定装置,因为它是一个新的 php 进程并且静态变量不存在。


使用这种方式,您可以确定您没有每天创建一次依赖项。这足以记住你做了什么(如果你需要修复某些东西,你可以使用 --filter 和 --process-isolation 运行)。

关于php - 共享单元测试装置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7079582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com