当我们写一个PHP类,我们一般会一步步或使用 die 或 echo 语句来验证它是如何工作的。
如果我们开发一个 Web 应用程序,使用表单来进入测试数据,以确保网页如我们预期的那样工作。
测试过程可以被自动化。
对于长期的项目,自动测试方法是有道理的,这是因为 -
-
项目复杂和巨大
-
不断地增长
-
项目失败的成本过于昂贵
如果项目没有得到复杂和相对简单,又或者它仅仅是一个一次性的项目,那么自动化测试就是大材小用了。
准备测试
第1步 - 安装 Codeception 框架。运行下面的代码。
c:\basic>composer global require "codeception/codeception" c:\basic>composer global require "codeception/specify" c:\basic>composer global require "codeception/verify"
步骤2 - 运行如下
c:\basic>composer global status
输出“Changed current directory to <directory>”如下图所示:

应该加上'C:/Users/Administrator/AppData/Roaming/Composer/vendor/bin ' 到 PATH 环境变量。在本示例中,运行下面的代码 -
export PATH = $PATH:~/.composer/vendor/bin
注:windows系统可右键"我的电脑"=>"高级系统设置"=>"环境变量"来添加。
第3步 - 创建一个新数据库 “yii2_basic_tests”
第4步 - 测试 tests 目录内运行。
C:\basic\tests>codeception/bin/yii migrate
数据库配置可以在这里找到:tests/codeception/config/config.php.
第5步 - 构建测试套件通过如下命令:


C:\basic\tests>codecept build
Fixtures
fixtures 的主要目的是建立环境处于未知状态,这样测试就可以按照预期的方式运行。 Yii提供一个接近固定的框架。在Yii fixture框架中的一个关键概念是 fixture 对象。它代表了测试环境的特定方面。fixture 对象是 yii\test\Fixture 类的一个实例。
要定义 fixture ,应该创建一个新的类,并从 yii\test\Fixture 或 yii\test\ActiveFixture 扩展。
前者是为通用目的会更好,而后者是特别设计用数据库和 ActiveRecord 来工作的。
单元测试
单元测试帮助你来测试各项功能。例如,模型的功能或组件类。
第1步 - 在 tests/codeception/fixtures 目录下创建一个新的 fixture 在 ExampleFixture.php 文件中。
<?php
namespace app\tests\codeception\fixtures;
use yii\test\ActiveFixture;
class ExampleFixture extends ActiveFixture {
public $modelClass = 'app/models/MyUser';
}
?>
第2步 - 然后,在 tests/codeception/unit/models 文件夹中创建了一个新的测试文件:ExampleTest.php 。
<?php
namespace tests\codeception\unit\models;
use app\models\MyUser;
use yii\codeception\TestCase;
class ExampleTest extends TestCase {
public function testCreateMyUser() {
$m = new MyUser();
$m->name = "myuser";
$m->email = "myser@xuhuhu.com";
$this->assertTrue($m->save());
}
public function testUpdateMyUser() {
$m = new MyUser();
$m->name = "myuser2";
$m->email = "myser2@xuhuhu.com";
$this->assertTrue($m->save());
$this->assertEquals("myuser2", $m->name);
}
public function testDeleteMyUser() {
$m = MyUser::findOne(['name' => 'myuser2']);
$this->assertNotNull($m);
MyUser::deleteAll(['name' => $m->name]);
$m = MyUser::findOne(['name' => 'myuser2']);
$this->assertNull($m);
}
}
?>
在上面的代码中,我们定义三个测试功能(函数) -
- testCreateMyUser
- testUpdateMyUser
- testDeleteMyUser
我们刚刚创建了一个新的用户,更新自己的名字,并试图删除它。
管理 yii2_basic_tests 数据库,用户模型是数据库完整副本。
第3步 - 要开始测试,进入 tests 文件夹内并运行。
C:\basic\tests>codecept run unit models/ExampleTest
它应该通过所有测试。会看到如下输出结果 -


功能测试
功能测试可以帮助你 -
-
使用浏览器模拟器应用测试
-
验证功能的正常使用
-
与数据库进行交互
-
将数据提交到服务器端脚本
在 tests 测试文件夹中运行 -
c:\basic\tests>codecept generate:cept functional AboutPageCept
上述命令在 tests/codeception/functional 文件夹下创建一个 AboutPageCept.php 文件。

在这个功能测试,我们要检查上面的 about 页面是否存在。
第1步 - 修改 AboutPageCept.php 文件。
<?php
$I = new FunctionalTester($scenario);
$I->wantTo('perform actions and see result');
$I->amOnPage('site/about');
$I->see('about');
$I->dontSee('apple');
?>
在上述代码中,我们检查是否在 about 页面上。很显然,我们会看到 “about” 单词,并在页面上没有显示 “apple”。
第2步 - 通过以下运行测试。
run functional AboutPageCept
将会看到下面的输出如下 -


