迷惘的码农。
分类:
2008-03-26 09:34:37
PHPUnit的目标(见)之一是测试应是可组合的:我们应能同时运行任意数量或任意组合的测试,例如整个工程的所有测试,或者工程局部组件的所有类的测试,或者只是单个类的测试。
PHPUnit框架的PHPUnit_Framework_TestSuite
类允许我们将一些测试组织在若干测试套件构成的一个层次结构中。让我们通过一个例子看看PHPUnit特有的测试套件。
显示一个删节版本的Tests/AllTests.php
,显示一个删节版本的Tests/Framework/AllTests.php
。
范例 7.1: 类AllTests
if (!defined('PHPUnit_MAIN_METHOD')) {
define('PHPUnit_MAIN_METHOD', 'AllTests::main');
}
require_once 'PHPUnit/Framework.php';
require_once 'PHPUnit/TextUI/TestRunner.php';
require_once 'Framework/AllTests.php';
// ...
class AllTests
{
public static function main()
{
PHPUnit_TextUI_TestRunner::run(self::suite());
}
public static function suite()
{
$suite = new PHPUnit_Framework_TestSuite('PHPUnit');
$suite->addTest(Framework_AllTests::suite());
// ...
return $suite;
}
}
if (PHPUnit_MAIN_METHOD == 'AllTests::main') {
AllTests::main();
}
?>
范例 7.2: 类Framework_AllTests
if (!defined('PHPUnit_MAIN_METHOD')) {
define('PHPUnit_MAIN_METHOD', 'Framework_AllTests::main');
}
require_once 'PHPUnit/Framework.php';
require_once 'PHPUnit/TextUI/TestRunner.php';
require_once 'Framework/AssertTest.php';
// ...
class Framework_AllTests
{
public static function main()
{
PHPUnit_TextUI_TestRunner::run(self::suite());
}
public static function suite()
{
$suite = new PHPUnit_Framework_TestSuite('PHPUnit Framework');
$suite->addTestSuite('Framework_AssertTest');
// ...
return $suite;
}
}
if (PHPUnit_MAIN_METHOD == 'Framework_AllTests::main') {
Framework_AllTests::main();
}
?>
类Framework_AssertTest
是个扩展了PHPUnit_Framework_TestCase
的标准测试用例。
运行Tests/AllTests.php
则使用TextUI测试启动器运行全部测试,然而运行Tests/Framework/AllTests.php
则只运行类PHPUnit_Framework_*
的测试。
只有像这样运行测试才会调用类AllTests
中声明的main()
方法:
php AllTests.php
PHPUnit 3.2.10 by Sebastian Bergmann.
............................................................ 60 / 227
............................................................ 120 / 227
............................................................ 180 / 227
.........................SSSSSS................
Time: 4 seconds
OK, but incomplete or skipped tests!
Tests: 227, Skipped: 6.
运行phpunit AllTests
来启动测试不会调用main()
方法。
类PHPUnit_Framework_TestSuite
提供两个模板方法,setUp()
和tearDown()
,它们分别在测试套件的首个测试前和最后测试后被调用。
范例 7.3: 类MySuite
require_once 'MyTest.php';
class MySuite extends PHPUnit_Framework_TestSuite
{
public static function suite()
{
return new MySuite('MyTest');
}
protected function setUp()
{
print "\nMySuite::setUp()";
}
protected function tearDown()
{
print "\nMySuite::tearDown()";
}
}
?>
中,被加入测试套件MySuite
中的测试用例类MyTest
有两个测试方法,testOne()
and testTwo()
,以及方法setUp()
和tearDown()
。输出显示了这八个方法的调用顺序:
MySuite::setUp()
MyTest::setUp()
MyTest::testOne()
MyTest::tearDown()
MyTest::setUp()
MyTest::testTwo()
MyTest::tearDown()
MySuite::tearDown()
通过类PHPUnit_Framework_TestSuite
的setUp()
方法存储在$this->sharedFixture
中的变量,能作为$this->sharedFixture
在测试套件对象聚集的所有的测试中使用(见)。