在PHPUnit中测试级别/组

时间:2014-03-04 18:37:16

标签: php unit-testing phpunit

我们已经在代码库上实现了一些PHPUnit测试。然而,为了最大限度地减少运行测试所需的时间,我希望将我们的测试分成两组或一组:

  1. 非常低级别的测试,不会打到测试数据库(单元测试)
  2. 更高级别的测试并与测试数据库交互(有时称为组件或集成测试)
  3. 这将允许我们在处理基本功能时运行1级测试,在处理更高级别功能时运行1级和2级,或者在提交到主线/构建之前运行。

    我将如何使用PHPUnit完成此任务?

3 个答案:

答案 0 :(得分:7)

您可以编写一个phpunit.xml,将您的测试分成可以单独运行的测试套件。

http://phpunit.de/manual/current/en/organizing-tests.html#organizing-tests.xml-configuration

它看起来类似于:

<phpunit>
  <testsuites>
    <testsuite name="Unit_Tests">
      <directory>SomeTests</directory>
      <directory>MoreTests</directory>
    </testsuite>
    <testsuite name="Functional_Tests">
      <directory>OtherTests</directory>
    </testsuite>
  </testsuites>
</phpunit>

然后,当您只想运行一组测试时,可以根据需要调用phpunit --testsuite Unit_Testsphpunit --testsuite Functional_Tests

答案 1 :(得分:7)

@Schleis的回答完全正确且非常有用。唯一的问题(我承认在我的问题中没有包括)是我希望能够在整个测试文件中分散单元和集成测试 - 我想避免使用两个测试文件 - 一个用于单元测试的文件对于SomeClass,以及一个单独的功能测试文件,也适用于SomeClass。

我发现启用此功能的PHPUnit命令行选项是groups

--group Only runs tests from the specified group(s). A test can be tagged as belonging to a group using the @group annotation.

要使用此方法,您只需在测试之前将@group注释添加到多行注释中:

class SomeClassTest extends PHPUnit_Framework_TestCase {
    /**
     * @group Unit
     */
    public function testSomeUnitFunctionality() {
        $this->assertEquals(xyz(' .a1#2 3f4!', true), ' 12 34');
    }

    /**
     * @group Integration
     */
    public function testSomeIntegrationFunctionality() {
        $this->assertEquals(xyz(' .a1#2 3f4!', true), ' 12 34');
    }
}

这允许我执行以下操作:

  • phpunit --group Unit(只是单元测试)
  • phpunit --group Integration(只是集成测试)
  • phpunit(所有测试)

答案 2 :(得分:1)

组的替代方法是使用命名约定:

    <testsuites>
        <testsuite name="unit-tests">
            <directory suffix="Test.php">test</directory>
        </testsuite>
        <testsuite name="benchmark">
            <directory suffix="Benchmark.php">test</directory>
        </testsuite>
    </testsuites>

test/SomethingTest.phpclass SomethingTest extends TestCase {...})之类的文件位于unit-test套件中,而test/SomeBenchmark.phpclass SomeBenchmark extends TestCase {...})之类的文件位于benchmark套件中

简单,明显和实用。

它还允许我们拥有不属于任何一个套件的test/SomeExperiment.phpclass SomeExperiment extends TestCase {...})(因此它不会在CI管道中失败),但仍可以在执行期间显式执行开发。