iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
DevOps

自動化測試大作戰系列 第 6

常用 Assertion 函數(三)

  • 分享至 

  • xImage
  •  

Medium 清新閱讀版連結

鐵人賽不知不覺來到第6天了!

今天會再與大家介紹幾個資料庫 Assertion 函數,與陣列 Assertion 函數。與前一天一樣,以下會提到的資料庫 Assertion 函數,並非 PHPUnit 內建,而是由 Laravel 所擴充,因此需注意是否有確實引用到 use Tests\TestCase 。最後面介紹的2個陣列 Assertion 函數,則是PHPUnit內建的。

在介紹資料庫 Assertion 函數前,要先請大家在根目錄下的 phpunit.xml<php> 標籤內,加入以下 <env> 子標籤:

<php>
    <-- ...前略...->

    <env name="DB_CONNECTION" value="sqlite"/>
    <env name="DB_DATABASE" value=":memory:"/>

    <-- ...後略...->
</php>

這2個設定值,會在執行PHPUnit測試時,暫時使用 phpunit.xml<env> 所設定的資料庫環境變數值,以避免改變到實際資料庫的資料。同時,在資料庫 Assertion 函數的實作範例中,皆會使用到 Illuminate\Foundation\Testing\RefreshDatabase 這個 Trait,惟今天的內文中僅會展示如何使用它,之後會再安排篇幅與大家分享,請大家拭目以待。

讓讓我們看看吧!

資料庫

  1. assertDatabaseCount

    • 函數簽名:assertDatabaseCount($table, int $count, $connection = null)

    • 函數說明: 此函數可以驗證,指定資料庫連線下,指定資料表是否含有指定數量之資料。當沒有指定資料庫連線時,將會使用預設資料庫連線。

    • 實作範例:

      <?php
      
      namespace Tests\Feature;
      
      use Illuminate\Foundation\Testing\RefreshDatabase;
      use Tests\TestCase;
      
      class DatabaseTest extends TestCase
      {
          use RefreshDatabase;
      
          /**
           * Example for assertDatabaseCount()
           * @return void
           */
          public function testAssertDatabaseCount()
          {
              // 假設 users 資料表中有1筆資料,則以下 Assestion 將通過測試
              $this->assertDatabaseCount('users', 1);
          }
      }
      
  2. assertDatabaseHas

    • 函數簽名:assertDatabaseHas($table, array $data, $connection = null)

    • 函數說明: 此函數可以驗證,指定資料庫連線下,指定資料表是否含有指定資料結構與值之資料。與前一函數相同,當沒有指定資料庫連線時,將會使用預設資料庫連線。

    • 實作範例:

      <?php
      
      namespace Tests\Feature;
      
      use Illuminate\Foundation\Testing\RefreshDatabase;
      use Tests\TestCase;
      
      class DatabaseTest extends TestCase
      {
          use RefreshDatabase;
      
          /**
           * Example for assertDatabaseHas()
           * @return void
           */
          public function testAssertDatabaseHas()
          {
              // 假設 users 資料表中至少有1筆資料
              // 其 email 欄位值為 test@test.com
              // 則以下 Assestion 將通過測試
      
              $this->assertDatabaseHas('users', [
                  'email' => 'test@test.com'
              ]);
          }
      }
      
  3. assertDatabaseMissing

    • 函數簽名:assertDatabaseMissing($table, array $data, $connection = null)

    • 函數說明: 此函數可以驗證,指定資料庫連線下,指定資料表是否 含有指定資料結構與值之資料。與前一函數相同,當沒有指定資料庫連線時,將會使用預設資料庫連線。

    • 實作範例:

      <?php
      
      namespace Tests\Feature;
      
      use Illuminate\Foundation\Testing\RefreshDatabase;
      use Tests\TestCase;
      
      class DatabaseTest extends TestCase
      {
          use RefreshDatabase;
      
          /**
           * Example for assertDatabaseMissing()
           * @return void
           */
          public function testAssertDatabaseMissing()
          {
              // 假設 users 資料表中無任1筆資料
              // 其 email 欄位值為 test@test.com
              // 則以下 Assestion 將通過測試
              $this->assertDatabaseMissing('users', [
                  'email' => 'test@test.com'
              ]);
          }
      }
      

陣列

  1. assertArrayHasKey

    • 函數簽名:assertArrayHasKey($key, $array, string $message = '')

    • 函數說明: 這個函數相當單純,可檢查第2個參數中,是否含有第2個參數所述之鍵。

    • 實作範例:

      /**
       * Example for assertArrayHasKey()
       * @return void
       */
      public function testAssertArrayHasKey()
      {
          $array = ['key' => 'value'];
      
          $this->assertArrayHasKey('key', $array);
      }
      
  2. assertJsonStringEqualsJsonString

    • 函數簽名:assertJsonStringEqualsJsonString(string $expectedJson, string $actualJson, string $message = '')

      • 函數說明: 有時會需要驗證結構比較複雜的關聯式陣列,但PHPUnit被未提供相對應的關聯式陣列 Assertion 函數,這時候便可使用此函數,將欲驗證之值先做 json_encode ,代入第2參數,並將期望的關聯式陣列結構與值,以JSON String的形式代入第1個參數。
    • 實作範例:

      /**
       * Example for assertJsonStringEqualsJsonString()
       * @return void
       */
      public function testAssertJsonStringEqualsJsonString()
      {
          $array = [
              'key' => 'value',
              'object1' => [
                  'array' => [1, 2, 3,]
              ],
          ];
      
          $this->assertJsonStringEqualsJsonString(
              '{"object1":{"array":[1,2,3]},"key":"value"}',
              json_encode($array)
          );
      }
      

以上就是今天的介紹,到今天為止,已經學到了20+個 Assertion 函數,是不是覺得很充實呢!

明天我們來將這幾天學到的 Assertion 函數,實際運用到撰寫 API 自動話測試吧!

參考資料


上一篇
常用 Assertion 函數(二)
下一篇
API測試
系列文
自動化測試大作戰31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言