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 = "[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 資料庫,使用者模型是資料庫完整副本。
第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
將會看到下面的輸出如下 -