發表文章

目前顯示的是有「CodeIgniter」標籤的文章

PHP CodeIgniter 3 單元測試日常:建立 PHPUnit 測試環境

圖片
本文將帶領讀者建立 CodeIgniter 3 框架的 PHPUnit 測試環境,給 CodeIgniter 3 一個現代化的機會! 本文假設您已經具備 軟體測試自動化 以及 PHPUnit 相關知識,且了解如何撰寫測試案例。若您尚未了解單元測試或軟體測試自動化,這裡提供一些不錯的資源讓您初步了解: otischou.tw:瞭解單元測試 阿川先生:先寫單元測試的12個好處! 除了上面兩個資源外,請您務必花時間認識並學習軟體測試,這可以說是軟體開發技術的核心技能之一。 若您尚未了解 PHPUnit 這裡也有些簡單的文件供您參考: PHPUnit 官方中文文件 Jace Ju:PHPUnit 入門介紹 前言 2020 年對於 PHP 界風靡一時的 MVC 框架「CodeIgniter」來說,光環已經被新星 Laravel 搶去。雖然 CodeIgniter 的討論熱度已經消退了,但市佔率仍然相當高,至今仍有許多 PHPer 還在與 CodeIgniter 奮鬥和成長(包括我)。 由於 CodeIgniter 3 框架(以下簡稱 CI3)沒有使用 Namespace 的特性,加上 CI3 統一透過框架內建的 Loader 類別實現 Autoload 機制,造成很多 PHPer 沒辦法在 CI3 框架中使用現代 PHP 的特性來開發系統。若不做點手腳的話,PHPer 的開發思維很容易就會被 CI3 框架綁架,一不小心就將所有業務邏輯全部寫在 CI3 框架中。換句話說所有的程式碼都依賴於框架,物件導向 SOLID 原則的實現、設計模式、單元測試 …等較進階的管理程式碼策略都不用談了! 為了讓還在與 CI3 奮鬥的同袍們能夠使用現代 PHP 的特性來開發系統,本文將介紹如何在 CI3 框架中建立單元測試的環境,讓 CI3 也能使用並測試現代 PHP 的程式碼,確保 PHPer 能安心地實現各種開發策略和思維。 導入 Composer 擁抱現代 PHP 特性 其實 CI3 跟現代 PHP 只差臨門一腳,你可以在 config/Config.php 中找到一個設定為 composer_autoload ,只要替 composer_autoload 設定 Composer 目錄底下的 autoload.php 路徑,你的

CodeIgniter 框架擴展:HMVC

圖片
CodeIgniter 框架擴展:HMVC Hierarchical((階層式的))-Model-View-Controller(HMVC)模式,也可以叫做 Layered MVC。 為什麼需要 HMVC 單層 MVC 的限制 原 MVC 架構中只有單層 MVC ,單層 MVC 的設計本身沒問題,但隨著系統功能漸變多變複雜時,程式碼卻只能塞進單層 MVC 裡面,程式碼很快就會變得  巨大、縱錯複雜、互相耦合、難以維護 。試想一下,一個 Controller 內有 7、8 千行程式碼會容易維護嗎。 原 CodeIgniter MVC 架構(單層 MVC)示意圖: application |- controllers |- controllersA.php |- controllersB.php |- ...(所有 Controller 都只能放在同一層) |- models |- models1.php |- models2.php |- ...(所有 Model 都只能放在同一層) |- views |- views1 |- index.php |- footer.php |- ... |- views2 |- index.php |- footer.php HMVC 帶來的解決方案: 擴展 MVC 架構, 讓 MVC 底下可以再擴充一層或多層子 MVC ,讓單層 MVC 變成階層式 MVC,而這些擴充出來的 MVC,又稱作為模組、模塊(Modules)。 使用模組好處是: 使每個功能都可以獨立出來 因模組變得獨立,降低各個功能模組之間的耦合性 提高程式碼複用性 每個模組都有自己的 MVC 結構 HMVC 架構示意圖: CodeIgniter HMVC 擴展模組後,其結構(階層式 MVC)如下: application |- modules |- moduleA

在 CI 測試環境中使用 SQLite

Why SQLite?In Memory 模式 SQLite 可開啟 In Memory 模式 在記憶體中操作資料庫 ,程式關閉後,記憶體內的 SQLite 資料庫也會清空,相當適合測試環境使用(無副作用)。 建置步驟: 產生假資料,先匯出 MySQL 備份檔 將 MySQL 的備份檔轉換成 SQLite 格式的備份檔。 最後再將 SQLite 備份檔配置到 CodeIgniter 的 database.php 設定檔中。 config/database.php if (ENVIRONMENT == "testing" ) { $db [ 'main' ] = [ 'dsn' => ':memory:' , // 啟動 In Memory 模式 'hostname' => '' , // 不需填寫 'username' => '' , // 不需填寫 'password' => '' , // 不需填寫 'database' => APPPATH . 'database/sqlite/sqlite.db' , // SQLite 備份檔案,絕對路徑。 'dbdriver' => 'sqlite3' , // 使用 SQLite 'dbprefix' => '' , 'pconnect

在 Codeigniter 上進行測試

圖片
在 Codeigniter 上進行測試 如果想在 CI 上面使用 PHPUnit 進行測試,可以使用 kenjis 提供的 ci-phpunit-test 。 ci-phpunit-test 讓你在 CI 上面可以很方便就能使用 PHPUnit。 不過使用這個套件之前,有一些必要條件: PHP 版本至少高於 5.4.0 CodeIgniter 至少要有 3.0 至少先安裝 PHPUnit 4.3 以上的版本 ci-phpunit-test 的目錄結構: codeigniter/ ├── application/ │ └── tests/ │ ├── _ci_phpunit_test/ ... 不要碰!裡面是 ci-phpunit-test 使用的檔案 │ ├── Bootstrap.php ... PHPUnit 的 bootstrap 設定檔 │ ├── DbTestCase.php ... 測試 DB 專用的 class │ ├── TestCase.php ... 測試案例專用的 class │ ├── controllers/ ... 把你的 controller 測試程式放進來 │ ├── libraries/ ... 把你的 library 測試程式放進來 │ ├── mocks/ │ │ └── libraries/ ... mock 模擬資料來源專用的 libraries │ ├── models/ ... 把你的 model 測試程式放進來 │ └── phpunit.xml ... PHPUnit 的設定檔 └── vendor/ 透過 Composer 進行安裝 到你的專案目錄下使用 composer 進行下載 ci-phpunit-test $ cd /path/to/codeigniter/ $ composer require kenjis/ci-phpunit-test --dev 下載完成後需要執行一次 install.php 你必須要在專案的根目錄執