如何编写phpunit的测试用例,其中被测试的代码使用可选模块,但并不总是可用

时间:2013-04-23 16:10:59

标签: php unit-testing phpunit

我刚开始编写测试用例,我不知道如何处理某些测试。我正在测试的类是非常基本的术语,用于各种操作码缓存的包装器。测试将被捆绑到软件中,这些软件将被下载并在许多不同的主机上使用,因此我很困惑如何处理这些类的测试有两个原因。

以apc包装为例

class Storage_Container_Apc extends Storage_Container implements Storage_iContainer
{    
    protected $_id_prefix = '';   
    protected $_file_prefix = '';   

    function __construct($id_prefix='', $file_prefix='', $options=array())
    {               
        $this->_id_prefix = $id_prefix; 
        $this->_file_prefix = $file_prefix; 
    } 

    /**
     * @see Storage_iContainer::available
     */
    public static function available()
    { 
        return extension_loaded('apc') && ini_get('apc.enabled');
    } 
}

这个基本的测试用例。

class StorageContainerApcTest extends \PHPUnit_Framework_TestCase
{
    public function testAvailability()
    {
        $this->assertTrue(Storage_Container_Apc::available());
    }
}

在没有APC的系统上,此测试显然会失败,但当然并不是真的失败,因为该类依赖于模块,如果在系统上不可用则不使用。所以对于这一点,测试实际应该是什么,以便它返回ok。它会是这样的吗?

class StorageContainerApcTest extends \PHPUnit_Framework_TestCase
{
    public function testAvailability()
    {
        if(extension_loaded('apc') && ini_get('apc.enabled'))
        {
            $this->assertTrue(Storage_Container_Apc::available());
        }
        else
        {
            $this->assertFalse(Storage_Container_Apc::available());
        }
    }
}

我的上一个问题涉及如何使用测试来测试这些操作码包装器。因为在任何给定时间都不可能运行多个操作码?

非常感谢任何指示。

2 个答案:

答案 0 :(得分:1)

我意识到我应该使用

protected function setUp() {
    if (!(extension_loaded('apc') && ini_get('apc.enabled'))) {
        $this->markTestSkipped('The APC extension is not available.');
    }
}

答案 1 :(得分:0)

您也可以使用

@codeCoverageIgnore

例如:

/**
 * @see Storage_iContainer::available
 * @codeCoverageIgnore
 */
public static function available()
{ 
    return extension_loaded('apc') && ini_get('apc.enabled');
}

请参阅Code Coverage Analysis