​​​​ php 单元测试 | 苏生不惑的博客

php 单元测试

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
新建一个单元测试

php artisan make:test ReplyTest --unit
单独执行某个测试

phpunit tests/Unit/ReplyTest.php
单独执行某个测试中的函数

phpunit --filter a_thread_has_a_creator
带上测试环境变量进行测试就不需要 CsrfToken

APP_ENV=testing phpunit --filter an_authenticated_user_may_participate_in_forum_threads

APP_ENV=testing phpunit

测试类例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

class TestCase extends Illuminate\Foundation\Testing\TestCase {

/**
* Creates the application.
*
* @return \Illuminate\Foundation\Application
*/
public function createApplication()
{
$app = require __DIR__.'/../bootstrap/app.php';

$app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();

return $app;
}

}
class FooTest extends TestCase {

public function testSomethingIsTrue()
{
$this->assertTrue(true);
}

}
你可以从终端机执行phpunit 命令来执行应用程序的所有测试。

$response = $this->call('GET', 'user/profile');

$response = $this->call($method, $uri, $parameters, $cookies, $files, $server, $content);
接着你可以检查Illuminate\Http\Response 对象:

$this->assertEquals('Hello World', $response->getContent());
从测试调用控制器

你也可以从测试调用控制器:

$response = $this->action('GET', 'HomeController@index');

$response = $this->action('GET', 'UserController@profile', array('user' => 1));

phpunit.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="bootstrap/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false">
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
</php>
</phpunit>

覆盖率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
pecl install xdebug
php.ini 手动添加 zend_extension=xdebug.so
php -m|grep xdebug

phpunit --coverage-html ./tests/report 来生成 html 报告

在 phpunit.xml 添加如下代码:
<filter>
<!--这里配置了白名单,只有这里边的代码会被统计覆盖率-->
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./tests/Unit</directory>
</whitelist>
</filter>
<logging>
<log type="coverage-html" target="./tests/report" charset="UTF-8"/>
</logging>
然后直接执行 phpunit 即可。

https://learnku.com/articles/24030
视频 https://58hualong.com/course/16/PHP-dan-yuan-ce-shi
第七课:Mockery

测试demo

1
2
3
4
5
git clone https://github.com/sebastianbergmann/money.git
phpunit --configuration build/phpunit.xml
//或者如下执行方式也行
php build/tools/phpunit.phar --configuration build/phpunit.xml
http://yyeer.com/%E7%BC%96%E7%A8%8B/2018/05/04/PHP%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96%E7%8E%87%E4%B8%80%E8%B5%B7%E7%8E%A9/#4phpunit指令和xml配置了解一下

hook

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
PHPUnit则为我们提供了全面的hook接口:

public static function setUpBeforeClass()/tearDownAfterClass()//测试类构建/解构时调用
protected function setUp()/tearDown()//测试方法执行前/后调用
protected function assertPreConditions()/assertPostConditions()//断言前/后调用
<?php
namespace Tests;

use App\Example;
use PHPUnit\Framework\TestCase as BaseTestCase;

class ExampleTest extends BaseTestCase
{
// 类静态属性
private static $example;

public static function setUpBeforeClass()
{
self::$example = new Example();
}

public function testGetTrue()
{
// 类的静态属性更新
self::$example->setMsg("hello big_cat");
$result = self::$example->getTrue();
$this->assertTrue($result);
}

public function testGetFalse()
{
$result = self::$example->getFalse();
$this->assertFalse($result);
}

/**
* 依赖 testGetTrue 执行完毕
* @depends testGetTrue
* @return [type] [description]
*/
public function testGetMsg()
{
$result = self::$example->getMsg();
$this->assertEquals($result, "hello big_cat");
}
}

Laravel 中基于 PHPUnit 进行代码测试

单元测试demo

Laravel 单元测试那些事

单元测试

PHP单元测试-mock和数据库测试

测试:入门指南

基于Laravel的项目的单元测试规范

phpunit文档

PHPUnit 入门教程

PHP 单元测试覆盖率

phpunit 快速入门

测试简介

使用 PHPUnit 进行单元和功能测试

Laravel 测试之 —— PHPUnit 入门教程

PHPUnit 进行单元测试并生成代码覆盖率报告

使用桩件 (Stub) 解决 Laravel 单元测试中的依赖