技术开发 频道

PHP单元测试利器:PHPUNIT深入用法(二)

  在上一篇文章中已经介绍过assertTrue和assertFalse了,这里留意一下其中的第二个参数,其含义是,当该断言的测试不通过时,自定义的显示信息。比如在这个测试方法中,当trueProperty不为真值时,将显示“trueProperty isn't true”的信息。

  接下来再看下在数值方面上phpunit的断言使用实例:

<?php
public function testValueEquals()
{
  
$valueOne = 4;
  
$valueTwo = 2;
  
$this->assertEquals($this->_testable->addValues($valueOne,$valueTwo),6);
}
public function testValueGreaterThan()
{
  
$valueOne = 4;
  
$valueTwo = 2;
  
$this->assertGreaterThan($valueTwo,$valueOne);
}
public function testLessThanOrEqual()
{
  
$valueOne = 4;
  
$valueTwo = 2;
  
$this->assertLessThanOrEqual($valueTwo,$valueOne);
}
public function testAreObjectsEqual()
{
  
$testTwo = new Testable();
  
$this->_testable->resetMe = false;
  
$this->assertEquals($this->_testable,$testTwo);
}
?>

   其中,assertEquals为判断是否相等,assertGreaterThan为判断是否大于,assertLessThanOrEqual判断是否小于或等于,而assertEquals这里要注意一下,它还可以用来判断两个对象是否相等,比如这里就判断了$testTwo这个Testable类的实例是否和新设置的resetMe这个对象相等。

  除了在数值方面的断言外,在字符方面还有一些很多断言的功能,看下面的代码:

<?php
public function testStringEnding()
{
  
$testString = $this->_testable->getTestString();
  
$this->assertStringEndsWith('frood',$testString);
}
public function testStringStarts()
{
  
$testString = $this->_testable->getTestString();
  
$this->assertStringStartsWith('hoopy',$testString);
}
public function testEqualFileContents()
{
  
$this->assertStringEqualsFile('/path/to/textfile.txt','foo');
}
public function testDoesStringMatchFormat()
{
  
$testString = $this->_testable->getTestString();
  
$this->assertStringMatchesFormat('%s',$testString);
}
?>

   其中, assertStringStartsWith断言是判断字符串是否以指定的字符串开头,assertStringEndsWith断言判断字符串是否以指定的字符串结尾。assertStringEqualsFile断言判断给定的文件中是否含有指定的字符,比如这里就判断textfile.txt这个文件中是否包含字符串foo。

  而assertStringMatchesFormat可以让用户指定匹配的模式去判断一个字符串是否符合要求,如 $this->assertStringMatchesFormat('%s',$testString);

  这里则判断$testString是否是字符串类型,具体的可以参考phpunit手册。

  再来看如下的代码:

<?php
public function testStringIsNotNull()
{
  
$notANull = “i'm not a null!”;
  $this->assertNull($notANull);
}
public function testStringIsSame()
{
  $numberAsString =
'1234';
  $this->assertSame(1234,$numberAsString);
}
?>

   其中assertNull判断某个变量是否为null,而assertSame则严格判断两个变量是否同一个类型,尽管在PHP中是弱类型语言,但这里通过assertSame还是能判断出$numberAsString为字符串类型,跟期望的1234数字类型不匹配,所以测试不能通过。

  最后我们来看一下平常可能不大常用的断言,但又可能对你的单元测试工作十分有帮助的,先看代码如下:

<?php
public function testArrayKeyExists()
{
    
$this->assertArrayHasKey('first key',$this->_testable->testArray);
}
public function testAttributeExists()
{
    
$this->assertClassHasAttribute('resetMe',get_class($this->_testable));
}
public function testFileIsReal()
{
    
$this->assertFileExists('/path/to/file.txt');
}
public function testIsInstance()
{
    
$this->assertInstanceOf('OtherClass',$this->_testable);
}
<?php
public function testDoesMatchRegex()
{
  
$testString = $this->_testable->getTestString();
  
$this->assertRegExp('/[a-z]+/',$testString);
}
?>

   代码中第一个断言assertArrayHasKey,是用来检查一个数组中是否每个键值都是存在的,比如我们的数组中,“firstkey”这个值是有键1与其对应的,所以测试能通过。而assertClassHasAttribute则能判断某个类是否有相应的属性,这个例子中测试也能通过;

  而assertFileExists则判断在本地文件系统中是否存在指定的文件。而assertInstanceOf则判断某个你正在创建的对象是否为某个类的实例。assertRegExp相信大家都知道,这个是判断某个字符串中是否与给定的正则表达式相匹配。

  总结

  本文进一步探讨了PHPUNIT中一些重要的方法和断言,PHPUNIT中还有大量丰富的断言,对提高单元测试十分有帮助,具体的请参考PHPUNIT用户手册。

0
相关文章