gpt4 book ai didi

php - 如何对执行命令行程序的 PHP 类方法进行单元测试?

转载 作者:行者123 更新时间:2023-12-01 22:42:32 24 4
gpt4 key购买 nike

对于我正在开发的 PHP 应用程序,我需要阅读当前的 git 修订版 SHA,当然我可以通过使用 shell_exec 或反引号来执行 git 命令行客户端来轻松获得。

显然,我已将此调用放入它自己的方法中,以便我可以轻松地隔离和模拟它以用于我的其余单元测试。所以我的课看起来有点像这样:

class Task_Bundle
{

public function execute()
{
// Do things
$revision = $this->git_sha();
// Do more things
}

protected function git_sha()
{
return `git rev-parse --short HEAD`;
}
}

当然,虽然我可以通过模拟 git_sha 来测试大部分类,但我正在努力了解如何测试实际的 git_sha() 方法,因为我没有找到为其创建已知状态的方法。我认为还调用 git rev-parse 来比较结果的单元测试没有任何实际值(value)?我想知道至少断言命令已经运行,但我看不到任何方法来获取 PHP 执行的 shell 命令的历史记录——即使我指定 PHP 应该使用 BASH 而不是 SH,历史列表也会出现空,我认为是因为单独的反引号执行是单独的终端 session 。

我很想听听关于如何测试这个的任何建议,或者是否可以不测试该方法并在将来维护应用程序时小心使用它?

最佳答案

虽然您已经接受了一个答案,但让我发布一些关于单元测试应该如何工作的内容,因为即使发布的解决方案确实有效并且确实不错,它也有一些缺点。

首先,您不想实际执行您的命令,因为这会测试外部软件。从这一刻起,你将依赖于你无法控制的外部事物(如果我想在我的电脑上测试你的软件会发生什么?我是否必须安装 git 或任何 git-mock?)。你真正想做的是看看命令行命令是否正确,是否执行得很好。

因为我之前为此苦苦挣扎,所以这是我所做的:我创建了一个执行 shell_exec 的类。在任何我想与 shell 交互的地方,我都会注入(inject)类并使用它。因此,为了进行测试,我可以模拟类并查看是否执行了正确的方法以及是否设置了正确的参数。

这有很多好处:

  • 我有一点与 shell 交互。如果将来有任何变化,或者如果我需要在执行命令之前做任何事情,我可以将行为添加到类中。 PHP 函数封装得很好。
  • 它适用于每台 PC,即使 shell_exec 命令因任何原因不起作用。测试在每台电脑(开发机器、测试服务器、集成服务器)上执行,无需担心外部依赖性。

当然,要验证您的软件作为一个整体工作,您必须进行不模拟任何东西的集成测试。但这是完全不同的情况。单元测试应该确保你的类(或方法)做它需要做的事情。有时这不是很明确,因为您可能决定在某个地方使用真实的类,因为模拟它会导致很多开销。但是,就我而言,如果它依赖于可能未安装或由于某种原因可能无法运行的外部库/软件,则无论如何都不再是单元测试。

关于php - 如何对执行命令行程序的 PHP 类方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10158134/

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