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
    
    输出是“将当前目录更改为 <directory>”。您应该将 '<directory>/vendor/bin' 添加到 PATH 变量中。在这种情况下,运行以下代码 -
    
    export PATH = $PATH:~/.composer/vendor/bin
    
    第 3 步- 创建一个名为'yii2_basic_tests'的新数据库。
    第 4 步- 在测试目录中运行。
    
    codeception/bin/yii migrate
    
    数据库配置可以在tests/codeception/config/config.php找到。
    第 5 步- 通过构建测试套件。
    
    codecept build
    
  • 夹具

    固定装置的主要目的是将环境设置为未知状态,以便您的测试以预期的方式运行。Yii 提供了一个近乎固定的框架。Yii 夹具框架的一个关键概念是夹具对象。它代表了测试环境的一个特定方面。夹具对象是yii\test\Fixture 类的一个实例。
    要定义一个夹具,你应该创建一个新类并从 yii\test\Fixture 或 yii\test\ActiveFixture 扩展它。前者更适合通用夹具,而后者专门设计用于数据库和 ActiveRecord。
  • 单元测试

    单元测试可帮助您测试各个功能。例如,模型函数或组件类。
    第 1 步- 在tests/codeception/fixtures目录下名为ExampleFixture.php的文件中创建一个新夹具。
    
    <?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 = "myser@email.com";
             $this->assertTrue($m->save());
          }
          public function testUpdateMyUser() {
             $m = new MyUser();
             $m->name = "myuser2";
             $m->email = "myser2@email.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);
          }
       }
    ?>
    
    在上面的代码中,我们定义了三个测试 -
    • 测试创建我的用户,
    • testUpdateMyUser 和
    • 测试删除我的用户。
    我们刚刚创建了一个新用户,更新了他的名字,并试图删除他。我们根据 yii2_basic_tests 数据库管理MyUser模型,它是我们真实数据库的完整副本。
    第 3 步- 要开始测试,请移至测试文件夹并运行。
    
    codecept run unit models/ExampleTest
    
    它应该通过所有测试。您将看到以下内容 -
    单元测试
  • 功能测试

    功能测试可以帮助您 -
    • 使用浏览器模拟器测试应用程序
    • 验证该功能是否正常工作
    • 与数据库交互
    • 将数据提交到服务器端脚本
    在测试文件夹内运行 -
    
    generate:cept functional AboutPageCept
    
    上述命令在 tests/codeception/functional 文件夹下创建AboutPageCept.php文件。在这个功能测试中,我们将检查我们的关于页面是否存在。
    第 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
    
    您将看到以下输出 -
    运行单元测试