TDD Using PHPUnit

PHPUnit Test

  • Composer.json定義版本號
  • PHPUnit.xml定義單元測試的規則
    • 檔案名稱用Test當後綴
    • 方法名稱用test當前綴
  • 增加可讀性
    • @test註解
    • function的名稱可以用底線來連結
    • CamelCase plugin
      • (V) a_product_has_a_name
      • (X) AProductHasAName
  • 新增一個屬性,結果原先的unit test變成不通過
    • construct少傳一個參數,兩種解法
      • 給預設值
      • 修改舊的測試方法,把要傳的參數也加上去
    • filter方法,可以針對要測試的方法指定方法名稱或類別名稱
  • 原則
    • 根據unit test回傳的錯誤訊息來調整代碼
  • 測試Order
    • 一個Order有多個商品,加總起來個數和總經額要經過測試
    • assertCount()計算陣列元素個數
  • 重構
    • setUp()把物件整理出來,單元測試在執行前會先執行setUp的方法
    • 缺點:耦合度提高,牽一髮動全身
    • stop-on-error:Stop execution upon first error
  • 測試Model的資料
    • 測試最多觀看文章資料
    • use DatabaseTransaction,執行完之後會在執行rollback
    • 安裝sqlite
      • sudo apt-get install php7.2-sqlite
      • 修改/etc/php/php7.2/php.ini的,把分號拿掉
    • 自己做一次發現卡住
      • 少做了修改database的預設配置文件(config/database.php)
        • env(‘DB_CONNECTION’, ‘sqlite’),
      • php artisan make:modol Article -m
        • 建立model文件和migration文件
        • 修改migration的定義
      • 用model::class來創建紀錄
  • 新增團隊案例
    • 一個團隊可以加入多個User,多對多關係
    • 拋出例外可以整理成protected的function比較容易閱讀
  • Feature和Unit Test的差異
    • Feature測試模仿實際操作的過程
    • Unit Test則是每一個拆開的方法(向洋蔥一樣,最核心的部分就是單元測試)
  • 安裝phpunit watch
    • composer global require spatie/phpunit-watcher
    • composer require spatie/phpunit-watcher --dev
      • 要require進來才可以用,光是安裝是沒有用的
    • phpunit-watcher watch
  • laravel 5.4之後才支持dusk針對瀏覽器的測試

PHPUnit In Action

  • 踩坑了,結果書中已經有說這個問題
    • 使用了 Data Provider 的測試,它的輸出將無法注入到其他相依於它的測試
  • 加上namespace測試一下會不會重現laravel例外的問題
    • 結果依然沒有辦法重現QQ
    • 用get_class打上完整的namespace類別名稱,有取到那個類別,但是單元測試不給過
  • 測試了一般的Exception才給過,感動
  • phpunit --configuration
    • 產生phpunit.xml
    • 方便整合測試使用(CI)
  • 產生測試報告
    • phpunit --coverage-html ./report tests

移除團隊成員(Unit Test)

  • 一個團隊有多個人,每個人記錄一組team_id(所屬的團隊)
  • 新增多個團隊成員
    • instanceof判斷是不是User的Model
    • 如果是的話就用save,不是就用saveMany(Collection)
  • 移除多個團隊成員
    • remove():移除User的team_id
    • 注意:User的team_id要是fillable才可以
    • 兩種方法可以移除collection的team_id
      • 參數法:each每一個user做update
      • 關聯法:透過members()關聯,whereIn條件搭配使用pluck update
  • php 7.2會有count不能count collection的問題
  • 测试团队移除成员的功能
1
2
3
4
5
6
7
// 方法1:參數法
$users->each(function($user){
return $user->update(['team_id'=>null]);
});
// 方法2:關聯法pluck
return $this->members()->whereIn('id', $users->pluck('id'))->update(['team_id'=>null]);

參考連結