Yii - 测试



当我们编写 PHP 类时,我们会逐步调试它,或者使用 die 或 echo 语句来验证它的工作方式。如果我们开发一个 web 应用,我们会输入测试数据到表单中以确保页面按预期工作。这个测试过程可以自动化。

自动测试方法对于长期项目很有意义,这些项目:

  • 复杂且庞大
  • 持续增长
  • 失败成本过高

如果您的项目不会变得复杂,并且相对简单,或者只是一个一次性项目,那么自动化测试就显得过分了。

准备测试

步骤 1 - 安装 Codeception 框架。运行以下代码。

composer global require "codeception/codeception = 2.0.*"
composer global require "codeception/specify = *"
composer global require "codeception/verify = *"

步骤 2 - 运行以下命令。

composer global status

输出为“Changed current directory to <directory>”。您应该将 '<directory>/vendor/bin' 添加到您的 PATH 变量中。在这种情况下,运行以下代码:

export PATH = $PATH:~/.composer/vendor/bin

步骤 3 - 创建一个名为 'yii2_basic_tests' 的新数据库。

步骤 4 - 在 tests 目录中运行。

codeception/bin/yii migrate

数据库配置可以在 tests/codeception/config/config.php 中找到。

步骤 5 - 通过以下命令构建测试套件。

codecept build

Fixture

Fixture 的主要目的是在未知状态下设置环境,以便您的测试以预期的方式运行。Yii 提供了一个近乎完整的 Fixture 框架。Yii Fixture 框架的一个关键概念是 Fixture 对象。它代表测试环境的特定方面。Fixture 对象是 yii\test\Fixture 类 的一个实例。

要定义一个 Fixture,您应该创建一个新类并从 yii\test\Fixture 或 yii\test\ActiveFixture 扩展它。前者更适合于通用 Fixture,而后者专门设计用于与数据库和 ActiveRecord 一起工作。

单元测试

单元测试帮助您测试单个函数。例如,模型函数或组件类。

步骤 1 - 在 tests/codeception/fixtures 目录下创建一个名为 ExampleFixture.php 的新 Fixture 文件。

<?php
   namespace app\tests\codeception\fixtures;
   use yii\test\ActiveFixture;
   class ExampleFixture extends ActiveFixture {
      public $modelClass = ‘app⊨’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 = "[email protected]";
         $this->assertTrue($m->save());
      }
      public function testUpdateMyUser() {
         $m = new MyUser();
         $m->name = "myuser2";
         $m->email = "[email protected]";
         $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 数据库管理 MyUser 模型,这是一个我们真实数据库的完整副本。

步骤 3 - 要启动测试,移动到 tests 文件夹并运行。

codecept run unit models/ExampleTest

它应该通过所有测试。您将看到以下内容:

Unit Tests

功能测试

功能测试帮助您:

  • 使用浏览器模拟器测试应用程序
  • 验证函数是否正常工作
  • 与数据库交互
  • 将数据提交到服务器端脚本

在 tests 文件夹内运行:

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

您将看到以下输出:

Run Unit Tests
广告