如何在 PHPUnit 中跳过/标记不完整的整个测试套件


How to skip/mark incomplete entire test suite in PHPUnit?

说明

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

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 输出会充斥着来自相关包的错误。这迫使我每次检查是否有任何故障来自任何其他软件包。

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

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

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

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

  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字母,这肯定表明,我们跳过了很多测试。这无法逃脱我们的注意,但让我们的测试通过。

您可以将

测试标记为已跳过。