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

时间:2013-11-02 15:32:18

标签: php unit-testing phpunit

描述

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

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

我只能运行我目前正在使用的测试套件,但是我无法控制我在一个软件包中的更改是否导致其他软件包出现故障。

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

2 个答案:

答案 0 :(得分:9)

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

  1. 必须重构AllTests类才能扩展PHPUnit_Framework_TestSuite
  2. 这使得该课程具有完全的价值TestSuite,并允许在套件级别实施setUp方法。
  3. setUp方法由测试运行器调用(而不是由构建器调用),因此抛出SkippedTestError异常是安全的。
  4. 在测试套件中执行此操作的相应方法称为markTestSuiteSkipped(请注意方法名称中的Suite)。
  5. 整个班级看起来像这样:

    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字母块,绝对表明我们跳过了很多测试。这无法逃脱我们的注意,但仍允许我们的测试通过。

答案 1 :(得分:4)

你可以mark test as skipped