在 PHPUnit 中測試需要 closure 的函式

不知道你有沒有在開發 PHP 程式的過程中,測試過需要使用 anonymous function 或 closure 的函式或類別方法?我在開發自己的函式庫時,就遇到了需要測試 closure 是否被正確調用的問題。

在解決幾個問題後,我發現其實做法並不難,所以接下來我就來介紹幾個測試 closure 的方式。

閱讀更多

利用 PHPUnit 與 Mink 來做 Web 測試

如果你面對的是以前舊有的 PHP 程式,是時候負起一些責任了。

我知道它改起來很痛苦,一堆不良的 PHP 程式習慣都阻礙你的修正;使得每次調整功能時,到底改得對不對,得要等到上線才知道。想要重寫一個新版本,但太多的實作細節你不清楚;也沒有最新的規格文件,讓你無法為新版本做出功能無誤的保證。

現在你唯一擁有的,就是已經在線上運作的程式邏輯;雖然它可能還有 bug ,但至少大多數的功能是通過使用者驗證的。那麼先為它買個保險吧!確保之後的修改不會影響到其他功能的正常運作;而最直接的方式,就是把目前程式邏輯所呈現的結果或是使用者的操作,寫成自動化 Web 測試。

建立 Web 測試的方法有很多,這裡我將介紹我在實務上使用 PHPUnit 加上 Mink 搭配 PhantomJS 的方法。

閱讀更多

邁向 PHP 重構之路 - 以 Laravel 程式碼片段為例

來上 TDD 課的學員問到一個 Laravel 程式碼重構的問題,這裡簡單地做分享。未來如果有好的實戰範例,這系列就會延續下去。

閱讀更多

在 Laravel 上用 MailCatcher 發送測試信件

雖然 Laravel 在寄送測試信件上提供了 Mailgun 這個服務的串接方式,不過如果能夠在 Homestead 就可以直接測試是更棒的選擇;而 MailCatcher 剛好就提供這樣的功能,它能啟動一個 SMTP 模擬服務,並且讓我們透過 Web 介面來查看信件是否有被發送出來。

註:類似的工類還有用 Go 寫的 MailHog ,據說速度更快;雖然我還沒試過,但我想用法應該是相同的。

以下就簡單介紹一下如何在 Laravel 5.1 上使用 MailCatcher 。

閱讀更多

Laravel 5.1 Events Broadcasting 實務練習

Laravel 5.1 提供了一個非常棒的 Events Broadcasting 特色,它能讓開發者建立一個 RealTime Web App 。作者 Taylor 也錄製了一個 Events Broadcasting 的教學影片,讓開發者可以更快瞭解這個新功能。

教學影片中雖然是使用 Pusher 服務來做事件推送,不過 Laravel 也可以搭配 Redis 來做到同樣的事情。考量到未來的系統發展,我打算採用 Redis 來當做事件推送伺服器,所以本文也會在此基礎進行說明。

以下就來介紹如何用 Laravel 的 Events Broadcasting 來實作一個簡單的聊天室。

閱讀更多

Laravel 5.1 正式釋出

經過了幾個月的等待, Laravel 5.1 終於在美國時間 6/9 正式釋出了。同時 Laracasts 也推出了一系列的 Laravel 5.1 新功能介紹,絕對是每位 Artisan 必看的影片。

官方也介紹了 5.1 有哪些新特色 ,以下我會簡單介紹它們。

閱讀更多

在 Mac OS X 上搭建 Selenium 測試環境

在開發網站的過程中,因為需要測試介面以模擬使用者的操作,最理想的工具就是 Selenium 了。

現在我是用 Mac 來當做開發環境,所以簡單記錄一下如何在 OS X 上建立 Selenium 測試環境。

Selenium 的簡單原理與應用可以參考:自動測試與 TDD 實務開發 - 上課心得 (中)

閱讀更多

自動測試與 TDD 實務開發 - 上課心得 (下)

第三週是這門課程的最後一堂課,上完課的我心裡其實有很大的衝擊,一直不知道該怎麼整理這最後的心得;就好像美妙的音樂感動了你的心靈,但自己一時之間卻很難重現那樣的弦律。

前兩週講師介紹了單元測試基礎以及如何重構舊有程式之後,但我們依舊面臨了一個很大的問題,那就是:「我們寫出來的程式,不見得就是我們所想的;而就算符合我們想的,也不見得是需求要的。」

「嘿!你沒睡好嗎?上星期提的搜尋功能你應該完成了吧?」
「嗯,我昨天加班完成了,還加上了測試,應該很完美,你試試。」

不久後...

「怎麼我搜尋『特價』這個字,沒有出現特價商品的類別頁?」
「不是吧?搜尋結果應該是獨立的搜尋列表呀!這不是 common sense 嗎?」
「不對不對,你應該在我搜尋『特價』的時候,直接導到特價商品頁就好了。」
「靠!這兩回事吧?而且你給的的需求只有搜尋商品而已,剩下的要我自己腦補喔?」

如果這種戲碼常常在辦公室上演的話,浪費的可不只是開發人員的時間呀!面對不清不楚的需求,或是雙方對需求的認知上有所誤解,甚至開發人員「善意地」加入根本不在需求裡的程式碼,這些問題都將可能拖垮整個專案的進度!

所以最後一週,講師為我們帶來了整套課程的高潮:不僅僅是以規格來完成程式碼,更能用規格來自動驗證你的程式碼!

閱讀更多

自動測試與 TDD 實務開發 - 上課心得 (中)

曾經有個工程師對著已經上線的網站說:「別說使用者不曉得這個系統是怎麼運作的,其實已經接手那麼久的我也不知道。」

如果你對這句話心有戚戚焉的話,那你真的不孤單。其實有很多維護維護前人程式碼的工程師在在接到新的需求而去修改程式碼時,常常是很戰戰競競的,然後辦公室裡就會響起這樣的聲音:

「我記得前一個工程師說這邊加幾行程式碼就可以了,你覺得呢?」
「我直覺這樣改會出問題...有環境讓我先測試看看嗎?」
「先不管,後天活動要上了,你先改完讓它上線後再說。」
「沒有測試的話...」
「閉嘴!快去改。」
不久後...
「慘了!訂單出大問題了!你可以先還原原來的程式碼嗎?」
「不對呀!我改這邊怎麼會讓那裡出錯?」
又過了一會兒...
「你有還原嗎?!整個訂單資料大亂了呀!你一定有動到什麼東西了!」
「我全還原了!現在跑的是我沒改過前的版本!」
「不管!加班修好它!」
「我不就說沒測試的話會有問題嗎!?為什麼不聽!?」
「你老闆我老闆?再靠杯試試看!」
三天後...
「夠了!拎杯走!我不想再改這個系統了! (摔杯子) 」

假設今天有時間讓你調整這個系統,在不知道線上系統整體如何運作的狀況下,你會怎麼讓它容易被維護與增添新功能呢?

上週所介紹的單元測試其實還沒辦法可以讓我們立刻套用在這樣的系統上,所以本週課程的重點就在:如何為已經上線的 legacy code 加上測試。

為了達成這個目標,講師介紹了兩個招式: Web Testing 與 Refactoring 。以下我就以我的方式來介紹我所學到的心得。

閱讀更多

自動測試與 TDD 實務開發 - 上課心得 (上)

測試一直以來是很多開發者心中的痛,當被老闆問到:「你的程式碼是否都測試過了?」你是否能摸著自己的良心,並且拿出證據來說自己真的做過測試讓所有功能都符合需求了?我相信絕大多數的開發者這時一定都是面有難色,因為其實你不但騙了老闆,還騙了你自己。

從我自己開始研究測試後,其實一直覺得自己還是沒有真正把測試當成是開發的一部份,更別說坊間很多程式書籍和教學課程能把這兩者真真實實地融合在一起,傳授給廣大的開發人員。

這次正好有機會去聽 Joey (91 哥) 在 SkillTree 開的 TDD 課程,我心想這實在是太棒了! Joey 是業界在 TDD 領域相當有研究,而且也已經在實務上經過千錘百鍊的高手,如果能親眼見到他是如何把測試融入開發中的話,一定能大大提升自己的經驗值!

不過課程中精采的部份太多了,恕我無法一一介紹;而且我也不覺得我能在這篇心得中,表達出講師在實務面的深厚功力。以下就讓我來為大家介紹這個課程為什麼值得你去聽的心得。

閱讀更多