迷惘的码农。
分类:
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在测试套件对象聚集的所有的测试中使用(见)。