只執行部份測試

有時候我們可能只需要執行一部份相關的測試,來確認我們的修改不會破壞某些測試,而不需要跑完所有測試;如果有某個功能可以把這些相關測試群組起來,讓我們在執行自動測試時可以帶入參數來指定只測試這個群組,就能達到我們的目的了。

將測試加入群組

針對上述的問題, PHPUnit 提供了 @group 這個註記讓開發者可以把測試群組起來。而 @group 是可以跨檔案的, PHPUnit 會自動幫我們把這些跨檔案的測試群組起來一起測試。

以下我們將先前的 CartTest 類別與 ErrorTest 類別中的測試方法都加上群組註記:

<?php
class CartTest extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider provider
     * @group update
     */
    public function testUpdateQuantitiesAndGetTotal($quantities, $expected)
    {
        // ...
    }

    /**
     * @expectedException CartException
     * @group update
     * @group exception
     */
    public function testUpdateQuantitiesWithException()
    {
        // ...
    }

    /**
     * @group get
     */
    public function testGetProducts()
    {
        // ...
    }
<?php
class ErrorTest extends PHPUnit_Framework_TestCase
{
    /**
     * @expectedException PHPUnit_Framework_Error
     * @group exception
     */
    public function testFileWriting()
    {
        // ...
    }
}
  • CartTest::testUpdateQuantitiesAndGetTotal 方法與 CartTest::testUpdateQuantitiesWithException 方法為 update 群組。

  • CartTest::testUpdateQuantitiesWithException 方法與 ErrorTest::testFileWriting 方法為 exception 群組。

  • CartTest::testGetProducts 方法為 get 群組。

執行測試

phpunit 指令上加上 --group 參數就可以指定要測試的群組。另外也可以用 --exclude-group 來排除不想執行的群組。

C:\project> phpunit --group update tests
PHPUnit 4.2.5 by Sebastian Bergmann.

...

Time: 41 ms, Memory: 3.25Mb

OK (3 tests, 3 assertions)

C:\project> phpunit --group exception tests
PHPUnit 4.2.5 by Sebastian Bergmann.

..

Time: 28 ms, Memory: 3.25Mb

OK (2 tests, 2 assertions)

C:\project> phpunit --exclude-group get tests                                     
PHPUnit 4.2.5 by Sebastian Bergmann.

....

Time: 80 ms, Memory: 3.25Mb

OK (4 tests, 4 assertions)

官方手冊參考

練習

  • 思考看看群組測試可能會有什麼樣的風險?