Yii测试

当我们写一个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步 - 构建测试套件通过如下命令:
Yii测试
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
将会看到下面的输出如下 -


上一篇: Yii字段 下一篇: Yii缓存