对 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 函数的脚本中的函数。必须小心,但如果脚本执行一些破坏性操作,例如删除文件,就好像您未能模拟删除功能一样,您可能最终会得到一些令人讨厌的结果。
我有一些 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 函数的脚本中的函数。必须小心,但如果脚本执行一些破坏性操作,例如删除文件,就好像您未能模拟删除功能一样,您可能最终会得到一些令人讨厌的结果。