一个自动生成PHPUnit测试的工具?

8
我想知道是否有一种工具可以查看我的PHP代码并自动生成PHPUnit测试?或者是否有其他语言的类似工具,我可以将其移植到PHP?
我不是在说生成一个框架。我认为一个工具可以查看tokenized PHP,并确定方法中的代码路径,然后自动为每个代码路径生成一个测试,必要时创建mocks和设置“expects”调用。
即使目前没有这样的工具,这样的任务也可能可行,或者我是否忽略了什么?

5
测试你的代码表现如何并不像测试它应该如何表现那样有用。 - Louis-Philippe Huberdeau
我同意AndreKR的观点。假设在编写测试代码之前,我的一段代码已经能够正常工作,“表现如何”是“应该表现如何”的一个子集。任何改变都可能会影响代码的运行方式,应该导致单元测试失败并让我重新审视代码——即使它看起来仍然能够正常工作。 - Brian Kendig
在Github上分享可能会导致开发出很棒的工具。当然,这需要时间。我知道这些信息。 - Tomas Votruba
@BrianKendig 的行为并不是“应该的行为”的子集。如果它做了一些不应该做的事情,那么它就不在这个集合中。 - chesscov77
2个回答

6
目前没有这样的工具,所以我写了一个(得到同事的帮助)。它还不完整——只够用来探索概念。使用nikic的PHP-Parser(https://github.com/nikic/PHP-Parser),可以找到类方法中的所有方法调用,然后可以为它们创建模拟对象。
至少,最终我可能会把它用到可以用来制作一些填空单元测试的程度。

嘿,你打算分享这个工具吗?我非常想看看它。 - fatlog
没有分享的计划;它没有用处。事实证明,如果代码足够复杂,需要自动化工具来帮助,那么这个代码就太复杂了,应该进行重构,使编写单元测试变得非常简单。 - Brian Kendig
1
好观点,但我是从非复杂代码的角度考虑的,只有许多代码... - fatlog
@BrianKendig,我对此有稍微不同的看法,并计划朝这个方向构建一些东西。我完全同意,任何足够复杂以从中受益的代码都需要重构,但正是这样的工具有用的地方。重构的目的是改变程序的设计/结构*而不改变结果行为。像Kenyou描述的这样的工具在确保重构后的代码确实不会改变任何行为方面可能非常有价值。如果您能贡献出您迄今为止想出的内容,那可能是一个有用的起点。谢谢。 - Loren Osborn
我刚刚注意到上面有一个重大的错别字。“tool long kenyou describe”应该是“tool like you describe”……抱歉。 - Loren Osborn
1
自动生成单元测试可能会对那些已经通过手动编写集成测试获得信心的开发人员有所帮助,但企业政策规定他们必须编写单元测试。在这种情况下,拥有一个工具来模拟和生成测试将有助于满足100%单元代码覆盖率的要求。 - Drew LeSueur

3

不太可能实现。

目前自动生成测试的技术取决于代码行为规范的存在,而不仅仅是实现。从 PHP 代码中推断规范对于人类来说可能都不容易,更何况对于机器。因此,我认为这对于任何实际的代码都不可能实现。


我对仅仅说“如果我将X作为参数传递,那么它会返回Y”的单元测试不是很感兴趣。在代码正常工作的情况下,即使我不知道它做了什么,我也可以为其编写单元测试 - 我所要做的就是选择一个代码路径,在该代码路径上进行外部方法调用的断言,并对该代码路径的返回值进行断言。我认为这种类型的测试工具可以很好地为我编写。 - Brian Kendig
11年后,我们已经拥有了这样的工具,可以做到这些,甚至更多。今天非常可行。 - matronator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接