使用单元测试对PHP脚本进行测试

5
我是一位有用的助手,可以为您翻译IT技术相关内容。下面是需要翻译的内容:

我有一些作为cronjob运行的php脚本。没有类,只有一些函数。

我想使用PHPUnit测试脚本,以确保一切正常工作,但似乎需要将php重写为类,这是我不想做(或者不知道如何做)的事情。

例如,如果我有一个脚本,它的唯一功能是将1和2相加,

 <?php

 $a=1;
 $b=2
 $c=$a+$b;

 ?>

如何使用 PHPUnit 测试 $c 是否等于 3?
谢谢, Don
3个回答

6

针对你的例子,你没有测试$c=3。

但这是因为你的例子有点太简单了。变量$c在脚本执行后就不存在了。所以它的存在与否并不重要。你想测试的是你的代码做什么,而不是它如何做事情。

我会稍微修改一下你的例子:

job.php

<?php

$a=1;
$b=2
echo $a + $b;

?>

现在我们实际上有了一些输出和一些行为。测试应该是这样的:
public function testJob() {
   require('job.php');
   $this->expectOutputString('3');
} 

PHPUnit 能够对 stdOut 进行断言。 我们确保代码输出符合预期。针对这些类型的文件,你需要检查它们的操作是否正确。由于 PHP 的 require 语句会在该点执行文件,因此我们可以运行脚本并检查其输出。

如果你的文件有函数,则只需将其包含并在各自的独立测试中检查每个函数。


谢谢Schleis!你的例子真的帮了我很多,让我恍然大悟。 - Don F
没问题。主要的想法是让测试有用,并且让你在重构代码时更有信心。测试是自动化你在确保事情正常工作时所做的事情。断言应该是你正在检查的内容。 - Schleis

0

不一定需要类,你可以以同样的方式对函数进行单元测试!即使不封装函数,你也可以进行单元测试,但这会更加困难。

在特定情况下,我会将代码封装在一个函数或具有静态方法的类中。

<?php
 function add($a, $b) {
    return $a + $b;
 }
 $c=add($a, $b);
?>

然后为加法函数提供测试。 $a和$b的取值很重要,这就是你需要模拟的东西。如果你可以控制它们的值,你就可以使用

global $c;
// your test setup 
include(<cron file>);
$this->assertEquals($expectedValue, $c);

0

通常,较小的测试单元是一个函数或方法,您可以向其传递输入并期望某些输出。因此,如果您的脚本包括函数,则可以对这些函数进行测试。

然而,在您描述的特定情况下,您可以简单地断言$c等于3,但这对于测试来说并没有太大帮助,因为测试应该是对单元进行黑盒测试

此外,如果您要测试的脚本调用了一些全局PHP函数,那么您可以模拟这些函数并断言它们按预期被调用(这里有一个示例,说明如何模拟全局函数)。同样的模拟也可以应用于执行其他全局PHP函数的脚本中的函数。但是,如果脚本执行一些破坏性操作(例如删除文件),则必须小心,因为如果未能模拟删除函数,则可能会导致一些不良后果。


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