位元詩人 跨平台程式碼該在那些系統上測試?

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

做跨平台測試時,很多人第一個反應都是:多裝幾套系統,多跑幾次,總不會錯。

但實際寫工具寫久了,通常會發現一件事:
你不是在測平台名字,你是在測哪些地方會出事。

我們不可能窮舉所有平台,所以測試要有明確的目標:
我要在這個系統確認什麼問題。

GNU/Linux Distro Matrix

Linux 發行版看起來很多,Ubuntu、Debian、Fedora、Arch、Alpine 各有各的擁護者。但對開發者來說,多數差異並不是「這些系統本質上完全不同」,而是 version、libc、compiler、packaging、預設設定與更新節奏不同。

換句話說,真正該測的不是發行版名單,而是那些會讓程式壞掉的差異軸。

所以 Linux distro matrix 的重點,從來不是蒐集發行版,而是用最少的樣本抓到最多問題。很多專案其實不用測一整排 Linux,只要有以下幾種環境即可:

  • 保守 baseline(例如 Ubuntu LTS)
  • 比較新的主流環境(例如 Fedora)
  • 像 Alpine 這種會暴露 musl 差異的系統
  • 用 Clang 確認編譯器差異

這也是為什麼我一直覺得,container 跟 CI matrix 比「自己裝一堆 Linux」更實際

除非你測的是桌面環境、顯示系統、驅動或硬體互動,不然大多數工具、library、CLI 與 build pipeline,根本沒必要靠重裝系統來證明自己有在做測試。你要的是可重現,不是主機收藏。

FreeBSD

再往外看,FreeBSD 跟 GNU/Linux 其實不是同一個問題。

測 FreeBSD 的意義,通常不在於那邊有多少人等著你支援,而是它很適合拿來檢查:你到底是在寫 Unix-like code,還是在寫一堆 Linux-only 假設。像 /proc、epoll、GNU extension、glibc 特性,這些東西在 Linux 內部很容易被當成理所當然;一旦丟到 FreeBSD,問題就會很誠實地浮出來。

所以 FreeBSD 最有價值的地方,不一定是市場,而是診斷能力。它像一個比較嚴格的老師,會逼你承認哪些 portability 其實只是錯覺。

當然,這不代表每個專案都要正式支援 FreeBSD。正式支援是一種承諾,會牽涉 CI、文件、issue 處理與使用者期待。很多時候,更合理的做法是:

不承諾支援,但也不要故意把 Linux 寫死。

MSYS2

MSYS2 則又是另一種測試點。

它的重要性常常被低估,因為很多人一碰 Windows 就直接分成兩種態度:要嘛完全放棄,要嘛以為改改路徑就好了。實際上,Windows 真正麻煩的地方根本不只路徑分隔符,還包括 shell 行為、程序啟動、編碼、原生 API 邊界,以及很多 Unix 工具鏈理所當然的習慣,到了那邊就不一定成立。

MSYS2 的價值就在這裡。它不是把 Windows 偽裝成 Linux,而是提供一個很適合抓邊界問題的環境。

對 CLI 工具、modding toolchain、launcher、開發者工具來說,MSYS2 很值得測,因為它能告訴你:你的工具到底是真的有基本可攜性,還是只是碰巧在 Linux 上一路順風。

測試準則

如果把這三者放在一起看,它們其實各自對應不同層次的檢查:

  • Linux distro matrix:版本、libc、toolchain、packaging 差異
  • FreeBSD:Linux 假設 vs Unix-like 真實性
  • MSYS2:Unix 與 Windows 邊界

所以真正該問的,不是「這三個要不要全測」,而是:

你的專案現在最缺哪一種壓力測試。

如果你做的是 SaaS backend,而且部署環境高度可控,那大矩陣通常沒什麼必要。你真正該顧的是自己的映像檔、依賴封裝與部署流程,不是全宇宙作業系統。

如果你做的是 CLI、library、mod 工具、資源處理器、build tool,矩陣的價值就高很多,因為這些東西本來就會跑進別人的環境裡。

如果你發的是 binary,不是 source code,那測試的重要性還會再往上跳一級,因為使用者不是幫你編譯,他們是直接執行。

講到底,cross-platform testing 不是政治正確,也不是平台博愛。它比較像是一種風險管理:你用有限的時間,去找出最可能讓程式在外面悄悄壞掉的那些條件。

結論

我的結論其實很簡單:

不要為了看起來專業而把 matrix 拉很大。先做一個最小但有效的組合,再看哪些環境真的能幫你抓到 bug。

平台測試的目的,不是讓程式在所有地方都完美運作,
而是不要讓它在你完全沒意識到的地方壞掉。

關於作者

位元詩人 (ByteBard) 是資訊領域碩士,喜歡用開源技術來解決各式各樣的問題。這類技術跨平台、重用性高、技術生命長。

除了開源技術以外,位元詩人喜歡日本料理和黑咖啡,會一些日文,有時會自助旅行。