对 PHP 脚本进行单元测试

Unit Testing a PHP Script

我有一些 php 脚本作为 cronjobs 运行。没有 classes,只有几个函数。

我想用 PHPUnit 测试脚本以确保一切正常,但看来我需要将 php 重写为 class,我不想这样做(或不知道如何做)到)。

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

 <?php

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

 ?>

如何使用 phpunit 测试 $c==3?

谢谢, 唐

不需要classes,你可以用同样的方法对函数进行单元测试!您甚至可以在不封装功能的情况下进行单元测试,尽管这会困难得多。

在特定情况下我会做的是将代码封装在一个函数中,或者用静态方法封装在一个class中。

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

然后提供add功能的测试。 $a 和 $b 值的来源很重要。这就是你需要嘲笑的。如果你能控制他们的值,你可以使用

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

对于您的示例,您没有测试 $c = 3。

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

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

job.php

<?php

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

?>

现在我们实际上有了一些输出和一些行为。对此的测试如下:

public function testJob() {
   require('job.php');
   $this->expectOutputString('3');
} 

PHPUnit has the ability to assert against stdOut. 我们确保代码输出我们所期望的。您对这些类型文件的测试将检查它们所做的是否正确。由于 PHP 的 require 语句将在该点执行文件,我们可以 运行 脚本并检查其输出。

如果您的文件有函数,您只需包含它并在各自的测试中检查每个函数。

通常,较小的测试单元是一个函数或方法,您可以向其传递输入,并期望从中获得特定的输出。因此,如果您的脚本包含函数,您可以测试它们。

然而,在您描述的特定场景中,您可以简单地断言 $c 等于 3,但这对测试没有多大帮助,因为测试应该 black-box test那个单位。

此外,如果您要测试的脚本调用了一些全局 PHP 函数,那么您可以模拟这些函数并断言它们已按预期调用(here 是您如何调用的示例可以模拟全局函数)。同样的模拟也可以应用于执行其他全局 PHP 函数的脚本中的函数。必须小心,但如果脚本执行一些破坏性操作,例如删除文件,就好像您未能模拟删除功能一样,您可能最终会得到一些令人讨厌的结果。