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方法,可以針對要測試的方法指定方法名稱或類別名稱
- construct少傳一個參數,兩種解法
- 原則
- 根據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來創建紀錄
- 少做了修改database的預設配置文件(config/database.php)
- 新增團隊案例
- 一個團隊可以加入多個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 | // 方法1:參數法 |