安装 Yii2 使用 Composer 安装 Yii 2 高级模板项目,Yii 安装文档 。1
2
3
4
5
6
7
8
#  安装 Yii
composer global require "fxp/composer-asset-plugin:^1.2.0"
composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application
#  Yii 初始化
cd yii-application
composer install
yii init
配置 Apache VirtualHost1
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
47
48
49
50
51
<VirtualHost *:80> 
   ServerName 
   DocumentRoot "/path/to/yii-application/frontend/web/" 
   <Directory "/path/to/yii-application/frontend/web/"> 
       
       RewriteEngine on 
       
       RewriteCond %{REQUEST_FILENAME}  !-f
       RewriteCond %{REQUEST_FILENAME}  !-d
       
       RewriteRule 
       
       DirectoryIndex  index.php
       
       
       Require  all  granted
       
       
       
   </Directory> 
</VirtualHost> 
<VirtualHost *:80> 
   ServerName 
   DocumentRoot "/path/to/yii-application/backend/web/" 
   <Directory "/path/to/yii-application/backend/web/"> 
       
       RewriteEngine on 
       
       RewriteCond %{REQUEST_FILENAME}  !-f
       RewriteCond %{REQUEST_FILENAME}  !-d
       
       RewriteRule 
       
       DirectoryIndex  index.php
       
       
       Require  all  granted
       
       
       
   </Directory> 
</VirtualHost> 
安装 Codeception 如果在项目的 vendor 目录看到 codeception 目录,代表 Yii 集成了 codeception package,不需要单独安装 codeception。
执行以下命令安装 Codeception package1
2
3
4
5
6
7
#  Codeception
sudo composer global require "codeception/codeception=*"
sudo composer global require "codeception/specify=*"
sudo composer global require "codeception/verify=*"
#  Facker 用于虚拟数据生成
sudo composer require --dev "yiisoft/yii2-faker=*"
将 codeception 命令配置进环境变量中1
2
3
4
5
6
7
8
vim .zshrc
#  如果在 Composer 安装 Codeception,alias 路径如下
alias codecept="/Users/用户名称/.composer/vendor/codeception/codeception/codecept"
#  如果在项目根目录下安装 Codeception,alias 路径如下
alias codecept="/Users/用户名称/项目路径/vendor/codeception/base/codecept"
source .zshrc
在项目中使用 codeception1
2
3
4
cd  frontend/
codecept bootstrap
codecept build
codecept run
单元测试(Unit Test) 单元测试是针对程序模块来进行正确性检验的测试工作,可以通过单元测试来确认深藏在代码里面的某些功能仍然可用, 单元测试能消除程序单元的不可靠性。
Codeception 的单元测试功能是基于 PHPUnit 之上的, 你可以照样写 PHPUnit 的测试代码, Codeception 一样能运行。PHPUnit 官方文档 
创建单元测试 使用 Codeception 的生成器来执行以下命令生成单元测试1
2
cd frontend
codecept generate:test unit SimpleExample
上述命令会在 tests/unit 目录创建一个 ExampleTest 文件,代码如下: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
<?php 
class  SimpleExampleTest  extends  \Codeception \Test \Unit 
    
    protected  $tester;
    protected  $stack;
    protected  function  _before () 
     {
        $this ->stack = [];
    }
    protected  function  _after () 
     {
    }
    
    public  function  testArrayPushAndArrayPop () 
     {
        $this ->stack = [];
        $this ->assertEquals(0 , count($this ->stack));
        array_push($this ->stack, 'foo' );
        $this ->assertEquals('foo' , $this ->stack[count($this ->stack) - 1 ]);
        $this ->assertEquals(1 , count($this ->stack));
        $value = array_pop($this ->stack);
        $this ->assertEquals('foo' , $value);
        $this ->assertEquals(0 , count($this ->stack));
    }
}
测试依赖 通过 @depends 让测试方法之间进行依赖关联
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
47
48
49
50
51
52
53
54
55
56
<?php 
class  DependsExampleTest  extends  \Codeception \Test \Unit 
    
    protected  $tester;
    public  function  testEmpty () 
     {
        $stack = [];
        $this ->assertEquals(0 , count($stack));
        return  $stack;
    }
    
    public  function  testPush (array $array) 
     {
        array_push($array, 'LuisEdward' );
        $this ->assertEquals('LuisEdward' , $array[count($array) - 1 ]);
        $this ->assertNotEquals('Leon' , $array[count($array) - 1 ]);
        $this ->assertEquals(1 , count($array));
        return  $array;
    }
    
    public  function  testPop (array $arrayAliasNames) 
     {
        $this ->assertEquals('LuisEdward' , array_pop($arrayAliasNames));
        $this ->assertEmpty($arrayAliasNames);
    }
    protected  function  _before () 
     {
    }
    protected  function  _after () 
     {
    }
}
抛出异常 通过 @expectedException 或方法 $this->expectException() 在测试实例中抛出异常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php 
namespace  frontend \tests ;
class  ExceptionTest  extends  \Codeception \Test \Unit 
    public  function  testException () 
     {
        $this ->expectException(InvalidArgumentException::class);
    }
    
    public  function  testExceptionTow () 
     {
    }
}
断点输出 通过方法 $this->expectOutputString() 生成一个预期的输出。当实际输出和预期输出不一致时,则测试不通过。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php 
use  PHPUnit \Framework \TestCase ;
class  OutputTest  extends  TestCase 
    public  function  testExpectFooActualFoo () 
     {
        $this ->expectOutputString('foo' );
        print  'foo' ;
    }
    public  function  testExpectBarActualBaz () 
     {
        $this ->expectOutputString('bar' );
        print  'baz' ;
    }
}
Codeception 的更多 Unit Tests 信息请参考链接:
创建接口测试(RESTFUL API TEST) 创建 RESTFUL API 测试配置文件,新增文件 api.suite.yml 和文件夹 api1
codecept generate:suite api
修改配置文件 api.suite.yml 如下:1
2
3
4
5
6
7
actor: ApiTester
modules:
    enabled:
        - REST:
            url: http://workerbee.app/v1/
            depends: PhpBrowser
            part: Json
创建 RESTFUL API 测试文件1
codecept generate:cept api UserSignIn
修改生成文件代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php 
$I = new  ApiTester($scenario);
$I->haveHttpHeader('Content-Type' , 'application/x-www-form-urlencoded' );
$I->haveHttpHeader('Accept' , 'application/json' );
$I->sendPOST('user/sign-in' , ['username'  => 'admin' , 'pwd'  => '123456' ]);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK);
$I->seeResponseMatchesJsonType([
    "id"  => 'integer' ,
    "username"  => "string" ,
    "password_hash"  => "string" ,
    "access_token"  => "string" ,
    "email"  => "string:email" ,
    "status"  => 'integer' ,
    "role"  => "string" ,
    "created"  => 'integer' ,
    "updated"  => 'integer' ,
    "mobile"  => 'string||null||integer' ,
]);
常用的 REST API 如下:
wantTo():配置测试标题 
sendGET():发送 HTTP GET 请求 
sendPUT():发送 HTTP PUT 请求 
sendPOST():发送 HTTP POST 请求 
sendDELETE():发送 HTTP DELETE 请求 
haveHttpHeader():设置 HTTP 请求头 
seeHttpHeader():检查 HTTP 请求头 
seeResponseCodeIs():检查响应状态码 
seeResponseContains():检查响应内容 
seeResponseContainsJson():检查响应数据类型是否为 JSON 和核对响应内容 
seeResponseIsJson():检查响应是否返回 JSON 数据 
seeResponseJsonMatchesJsonPath():使用 JSON 数据去检查响应内容 
seeResponseMatchesJsonType():检查响应数据的数据类型 
 
Codeception 的更多 RESTFUL API 信息请参考链接:
数据库测试(DB TEST) 常用的 DB TEST API 如下:
seeInDatabase() 
dontSeeInDatabase() 
haveInDatabase() 
grabFromDatabase() 
 
示例代码如下: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
<?php 
$I->dontSeeInDatabase('user' , ['username'  => 'Davert' , 'email'  => 'davert@mail.com' ]);
$I->seeInDatabase('user' , ['username'  => 'okirlin' , 'email'  => 'brady.renner@rutherford.com' ]);
$I->haveInDatabase('user' ,
  [
    'username'  => 'miles' ,
    'email'  => 'miles@davis.com' ,
    'auth_key'  => 'EdKfXrx88weFMV0vIxuTMWKgfK2tS321' ,
    'password_hash'  => '$2y$13$g5nv41Px7VBqhS3hVsVN2.MKfgT3jFdkXEsMC4rQJLfaMa7VaJqL2' ,
    'password_reset_token'  => '4BSNyiZNAuxjs5Mty990c47sVrgllIi_1487317115' ,
    'email'  => '506510463@qq.com' ,
    'role'  => 10 ,
    'status'  => 0 ,
    'created_at'  => 1391885313 ,
    'updated_at'  => 1391885313 ,
]);
$mail = $I->grabFromDatabase('user' , 'email' , array ('username'  => 'troy.becker' ));
var_dump($mail);exit ;
Codeception 的更多 DB TEST API 信息请参考链接: