为我们的类创建第一个 PHPUnit 测试
想象一下,我们有一个类 Math.php
,具有计算 fiobanacci 和阶乘数的逻辑。像这样的东西:
<?php
class Math {
public function fibonacci($n) {
if (is_int($n) && $n > 0) {
$elements = array();
$elements[1] = 1;
$elements[2] = 1;
for ($i = 3; $i <= $n; $i++) {
$elements[$i] = bcadd($elements[$i-1], $elements[$i-2]);
}
return $elements[$n];
} else {
throw new
InvalidArgumentException('You should pass integer greater than 0');
}
}
public function factorial($n) {
if (is_int($n) && $n >= 0) {
$factorial = 1;
for ($i = 2; $i <= $n; $i++) {
$factorial *= $i;
}
return $factorial;
} else {
throw new
InvalidArgumentException('You should pass non-negative integer');
}
}
}
最简单的测试
我们想测试方法 fibonacci
和 factorial
的逻辑。让我们用 Math.php
将文件 MathTest.php
创建到同一目录中。在我们的代码中,我们可以使用不同的断言 。最简单的代码将是这样的(我们只使用 assertEquals
和 assertTrue
):
<?php
require 'Math.php';
use PHPUNIT_Framework_TestCase as TestCase;
// sometimes it can be
// use PHPUnit\Framework\TestCase as TestCase;
class MathTest extends TestCase{
public function testFibonacci() {
$math = new Math();
$this->assertEquals(34, $math->fibonacci(9));
}
public function testFactorial() {
$math = new Math();
$this->assertEquals(120, $math->factorial(5));
}
public function testFactorialGreaterThanFibonacci() {
$math = new Math();
$this->assertTrue($math->factorial(6) > $math->fibonacci(6));
}
}
我们可以使用命令 phpunit MathTest
从控制台运行此测试,输出将是:
PHPUnit 5.3.2 by Sebastian Bergmann and contributors.
... 3 / 3 (100%)
Time: 88 ms, Memory: 10.50Mb
OK (3 tests, 3 assertions)
使用 dataProviders
测试方法可以接受任意参数。这些参数由数据提供者方法提供 。要使用的数据提供程序方法是使用 @dataProvider
注释指定的。 :
<?php
require 'Math.php';
use PHPUNIT_Framework_TestCase as TestCase;
// sometimes it can be
// use PHPUnit\Framework\TestCase as TestCase;
class MathTest extends TestCase {
/**
* test with data from dataProvider
* @dataProvider providerFibonacci
*/
public function testFibonacciWithDataProvider($n, $result) {
$math = new Math();
$this->assertEquals($result, $math->fibonacci($n));
}
public function providerFibonacci() {
return array(
array(1, 1),
array(2, 1),
array(3, 2),
array(4, 3),
array(5, 5),
array(6, 8),
);
}
}
我们可以使用命令 phpunit MathTest
从控制台运行此测试,输出将是:
PHPUnit 5.3.2 by Sebastian Bergmann and contributors.
...... 6 / 6 (100%)
Time: 97 ms, Memory: 10.50Mb
OK (6 tests, 6 assertions)
<?php
require 'Math.php';
use PHPUNIT_Framework_TestCase as TestCase;
// sometimes it can be
// use PHPUnit\Framework\TestCase as TestCase;
测试异常
我们可以使用方法 expectException()
测试被测代码是否抛出异常。同样在这个例子中,我们添加了一个失败的测试来显示失败测试的控制台输出
<?php
require 'Math.php';
use PHPUNIT_Framework_TestCase as TestCase;
// sometimes it can be
// use PHPUnit\Framework\TestCase as TestCase;
class MathTest extends TestCase {
public function testExceptionsForNegativeNumbers() {
$this->expectException(InvalidArgumentException::class);
$math = new Math();
$math->fibonacci(-1);
}
public function testFailedForZero() {
$this->expectException(InvalidArgumentException::class);
$math = new Math();
$math->factorial(0);
}
}
我们可以使用命令 phpunit MathTest
从控制台运行此测试,输出将是:
PHPUnit 5.3.2 by Sebastian Bergmann and contributors.
.F 2 / 2 (100%)
Time: 114 ms, Memory: 10.50Mb
There was 1 failure:
1) MathTest::testFailedForZero
Failed asserting that exception of type "InvalidArgumentException" is thrown.
FAILURES!
Tests: 2, Assertions: 2, Failures: 1.
SetUp 和 TearDown
此外,PHPUnit
还支持共享设置代码。在运行测试方法之前,将调用名为 setUp()
的模板方法。setUp()
是你创建要测试的对象的位置。一旦测试方法运行完毕,无论是成功还是失败,都会调用另一个名为 tearDown()
的模板方法。tearDown()
是你清理测试对象的地方。
<?php
require 'Math.php';
use PHPUNIT_Framework_TestCase as TestCase;
// sometimes it can be
// use PHPUnit\Framework\TestCase as TestCase;
class MathTest extends TestCase {
public $fixtures;
protected function setUp() {
$this->fixtures = [];
}
protected function tearDown() {
$this->fixtures = NULL;
}
public function testEmpty() {
$this->assertTrue($this->fixtures == []);
}
}
更多信息
你可以在测试中使用 PHPUnit
的更多机会。有关详细信息,请参阅官方手册