PHP PHPUnit的简单使用
1.Pear的官方教程:https://phpunit.de/manual/current/zh_cn/phpunit-book.html#writing-tests-for-phpunit
2.将Pear的安装目录的路径,加入Path;在CMD中,执行 "pear list" ,
如果没有,PHPUnit模块,执行
3.在php.ini文件的 include_path 路径,将pear的相关的文件路径加进去 ,这是我的:
4. 在编写测试文件时,直接include下面,是找不到TestCase类的,
会报错:
PHP Fatal error: Class 'TestCase' not found in H:\Slg\SlgCardsServer\actions\MyTest.php on line 26
这是,因为include_path路径下面的文件TestCase.php的TestCase并不存在,这是要自己编写的。
5. 如果不使用自己编写的TestCase类,可以继承 PHPUnit_Framework_TestCase 类。这个类继承了PHPUnit_Framework_Assert,提供了一些基本的asset***的断言方法。
6.如下代码:
1 <?php 2 3 include_once 'PHPUnit\TestCase.php'; 4 5 class Test extends PHPUnit_Framework_TestCase 6 { 7 public function testEmpty() 8 { 9 $stack = []; 10 $this->assertNotEmpty($stack); 11 12 return $stack; 13 } 14 15 /** 16 * @depends testEmpty 17 */ 18 public function testPush(array $stack) 19 { 20 array_push($stack, 'foo'); 21 $this->assertEquals('foo', $stack[count($stack)-1]); 22 $this->assertNotEmpty($stack); 23 24 return $stack; 25 } 26 27 /** 28 * @depends testPush 29 */ 30 public function testPop(array $stack) 31 { 32 $this->assertEquals('foo', array_pop($stack)); 33 $this->assertEmpty($stack); 34 } 35 } 36 37 ?>
当第一个函数的测试代码有问题时,运行结果:
7.多重依赖的代码测试:
1 <?php 2 include_once 'PHPUnit\TestCase.php'; 3 4 class Test extends PHPUnit_Framework_TestCase 5 { 6 public function testProduceFirst() 7 { 8 $this->assertTrue(true); 9 return 'First'; 10 } 11 12 public function testProduceSecond() 13 { 14 $this->assertTrue(true); 15 return 'Second'; 16 } 17 18 /** 19 * 下面的依赖 20 * @depends testProduceFirst 21 * @depends testProduceSecond 22 */ 23 public function testEquals() 24 { 25 return $this->assertEquals( 26 ['first','second'], 27 func_get_args() 28 ); 29 } 30 } 31 32 ?>
运行结果:
10 .数据提供器
1)数据供给器方法必须声明为 public,其返回值要么是一个数组,其每个元素也是数组;要么是一个实现了 Iterator 接口的对象,在对它进行迭代时每步产生一个数组。每个数组都是测试数据集的一部分,将以它的内容作为参数来调用测试方法。
2)测试代码:
1 <?php 2 include_once 'PHPUnit\TestCase.php'; 3 4 class DataProviderTest extends PHPUnit_Framework_TestCase 5 { 6 /** 7 * @dataProvider additionProvider 8 */ 9 public function testAdd($a,$b,$sum) 10 { 11 $this->assertEquals($sum,$a+$b); 12 } 13 14 public function additionProvider() 15 { 16 return [ 17 'Data1' => [1,2,3], 18 'Data2' => [4,7,9], 19 'Data3' => [5,4,9], 20 ]; 21 } 22 } 23 24 ?>
运行的结果:
要点:
1.文档注释块(docblock)中使用 @test
标注将其标记为测试方法,用 @depends
标注来表达测试方法之间的依赖关系。
2.如果需要传递对象的副本而非引用,则应当用 @depends clone
替代 @depends
。
3.PHPUnit 不会更改测试的运行顺序,因此你需要自行保证某个测试所依赖的所有测试均出现于这个测试之前。
4.如果出现找不到PHPUnit相关的头文件,可以用在相关文件输出get_include_path()的结果查看. 在php.ini 可以找 “”include_path" 关键字,定位原因。
在 PHPUnit的目录下有一个文件Autoload.php,在设置了php.ini的include_path的变量之后,在使用文件中,包括该文件。
5.在安装XDebug的前提下(extension = XDEBUG_PATH 替换为 zend_extension = XDEBUG_PATH ),可以运行:phpunit --coverage-html "OUTPUT_PATH" CalculatorTest ,生成一个报表,HTML格式,可以了解此次测试代码的覆盖率。 默认在当前目录生成OUTPUT_PATH目录。
6.不要将被测试的类和测试类放在同一个文件,这样是生成的XDEBUG代码覆盖率报告数据都是空的。
7. 测试类里面的测试函数一定要以 "test"开头 !!!