说明
我有一个测试套件,我需要将其标记为已跳过(整个测试套件 - 而不是套件中的特定测试用例)。
class AllTests
{
public static function suite()
{
// this does not work same as within TestCase:
// throw new 'PHPUnit_Framework_SkippedTestError("Out of order");
$Suite = new 'PHPUnit_Framework_TestSuite(__NAMESPACE__);
$Suite->addTestSuite(translators'AllTests::cls());
$Suite->addTestSuite(TlScopeTest::cls());
$Suite->addTestSuite(TlNsTest::cls());
$Suite->addTestSuite(TlElementTest::cls());
$Suite->addTestSuite(TlItemTest::cls());
$Suite->addTestSuite(LangCodeTest::cls());
$Suite->addTestSuite(TlElemClassTagTest::cls());
return $Suite;
}
}
如您所见,抛出PHPUnit_Framework_SkippedTestError
异常不起作用。它不会被 PHPUnit 捕获,并且会作为任何未捕获的异常中断执行(这是可以理解的,因为在实际运行测试之前,在构建测试层次结构时调用suite()
方法)。
我见过一个名为 PHPUnit_Framework_SkippedTestSuiteError
的异常类,但不知道如何利用它。有什么想法吗?
赋予动机
我有一个测试套件,它聚合了许多测试用例以及其他测试套件。几乎每个测试都失败了,因为我在代码核心中所做的更改。
问题是这个包不是关键的,并且计划稍后修复。在此之前,我必须对其他每个包运行测试,但是当我这样做时,PHPUnit 输出会充斥着来自相关包的错误。这迫使我每次检查是否有任何故障来自任何其他软件包。
正如您可能怀疑的那样,这很容易受到人为错误的影响,即我可能会错过失败,这实际上很重要。
我只能运行我当前正在使用的测试套件,但我无法控制一个包中的更改是否会导致另一个包失败。
我不想注释掉那个测试套件,因为我担心我(或将在我之后接管代码的人)可能会完全忘记它。
好的,所以我把它放在一起:
- 必须重构
AllTests
类才能扩展PHPUnit_Framework_TestSuite
。 - 这使得该类成为一个完全有价值的
TestSuite
,并允许在套件级别实现setUp
方法。 setUp
方法由测试运行程序(而不是由生成器)调用,因此可以安全地引发SkippedTestError
异常。- 在测试套件中执行此操作的相应方法称为
markTestSuiteSkipped
(请注意方法名称中的Suite
)。
整个类将如下所示:
class AllTests extends 'PHPUnit_Framework_TestSuite
{
protected function setUp()
{
$this->markTestSuiteSkipped("zzz");
}
public static function suite()
{
$Suite = new self(__NAMESPACE__);
$Suite->addTestSuite(translators'AllTests::cls());
$Suite->addTestSuite(TlScopeTest::cls());
$Suite->addTestSuite(TlNsTest::cls());
$Suite->addTestSuite(TlElementTest::cls());
$Suite->addTestSuite(TlItemTest::cls());
$Suite->addTestSuite(LangCodeTest::cls());
$Suite->addTestSuite(TlElemClassTagTest::cls());
return $Suite;
}
}
输出是一堆漂亮的S
字母,这肯定表明,我们跳过了很多测试。这无法逃脱我们的注意,但让我们的测试通过。
您可以将
测试标记为已跳过。