9

描述

我有一个TestSuite,我需要将其标记为已跳过(整个测试套件 - 而不是套件中的特定测试用例)。

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,但不知道如何利用它。有任何想法吗?

动机

我有一个TestSuite,它聚合了许多测试用例以及其他测试套件。由于我对代码的核心进行了更改,因此几乎所有测试都失败了。

问题是这个包并不重要,并且计划稍后修复。在那之前,我必须为每个其他包运行测试,但是当我这样做时,PHPUnit 输出会充斥着来自相关包的错误。这迫使我每次都检查是否有任何故障来自任何其他包。

正如您可能怀疑的那样,这很容易受到人为错误的影响,即我可能会错过一个失败,这实际上很重要。

我只能运行我当前正在使用的测试套件,但我无法控制我对一个包的更改是否会导致另一个包失败。

我不想评论那个测试套件,因为我担心我(或将在我之后接管代码的人)可能会完全忘记它。

4

2 回答 2

9

好的,所以我将它放在一起:

  1. 该类AllTests必须重构以扩展PHPUnit_Framework_TestSuite
  2. 这使得该类完全有价值,并允许在套件级别TestSuite实现setUp方法。
  3. setUp方法由测试运行器(而不是构建器)调用,因此抛出SkippedTestError异常是安全的。
  4. 在测试套件中执行此操作的相应方法被调用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字母块,它明确地表明,我们跳过了很多测试。这无法逃脱我们的注意,但允许我们的测试通过。

于 2013-11-04T23:10:40.330 回答
4

您可以将测试标记为已跳过

于 2013-11-03T04:59:29.837 回答