我有一些作为cronjob运行的php脚本。没有类,只有一些函数。
我想使用PHPUnit测试脚本,以确保一切正常工作,但似乎需要将php重写为类,这是我不想做(或者不知道如何做)的事情。
例如,如果我有一个脚本,它的唯一功能是将1和2相加,
<?php
$a=1;
$b=2
$c=$a+$b;
?>
如何使用 PHPUnit 测试 $c 是否等于 3?
谢谢, Don
我有一些作为cronjob运行的php脚本。没有类,只有一些函数。
我想使用PHPUnit测试脚本,以确保一切正常工作,但似乎需要将php重写为类,这是我不想做(或者不知道如何做)的事情。
例如,如果我有一个脚本,它的唯一功能是将1和2相加,
<?php
$a=1;
$b=2
$c=$a+$b;
?>
针对你的例子,你没有测试$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
语句会在该点执行文件,因此我们可以运行脚本并检查其输出。
如果你的文件有函数,则只需将其包含并在各自的独立测试中检查每个函数。
不一定需要类,你可以以同样的方式对函数进行单元测试!即使不封装函数,你也可以进行单元测试,但这会更加困难。
在特定情况下,我会将代码封装在一个函数或具有静态方法的类中。
<?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);
通常,较小的测试单元是一个函数或方法,您可以向其传递输入并期望某些输出。因此,如果您的脚本包括函数,则可以对这些函数进行测试。
然而,在您描述的特定情况下,您可以简单地断言$c
等于3
,但这对于测试来说并没有太大帮助,因为测试应该是对单元进行黑盒测试
。
此外,如果您要测试的脚本调用了一些全局PHP函数,那么您可以模拟这些函数并断言它们按预期被调用(这里有一个示例,说明如何模拟全局函数)。同样的模拟也可以应用于执行其他全局PHP函数的脚本中的函数。但是,如果脚本执行一些破坏性操作(例如删除文件),则必须小心,因为如果未能模拟删除函数,则可能会导致一些不良后果。