這篇聊聊如何防止測試環境專用的特殊程式邏輯在正式環境被誤用?

實務上測試或開發環境與實際環境常存在難以克服的差異,為方便測試,有時我們需要加入一些測試專用的程式碼,例如:資料轉換、省略權限檢查... 等。

最不花腦筋的做法是直接把測試邏輯加進程式碼,上線前再記得拿掉。但老鳥都知道這樣一定有風險,一旦忙中有錯忘記拿掉又沒被上線流程(例如:Code Review)攔阻,測試用的程式邏輯便有可能被上線到正式環境引發問題。

由此可知,測試台專用邏輯不加修飾寫進程式碼存在危險性,需仰賴開發者及覆核人員把關防止出亂子。

然而,有一些技巧能改善這類問題,例如:

  1. 利用 .NET #if 前置處理器指示詞將測試台專用邏輯包起來,加上特定參數以編譯測試台版本的 DLL。
    缺點:需區分及管理同檔名之正式版及測試版 DLL,搞混仍可能出錯
  2. 拆分成正式及測試專屬元件版本,採不同名稱,例如:DataModule.Test.dll 及 DataModule.Prod.dll
    缺點:有可能需要拆分成兩個專案或在 csproj 設定下工夫,易導致內容重複,較複雜且不好維護
  3. 將測試邏輯寫入正式程式碼,透過旗標設定值決定是否啟動測試台專用功能

旗標控制法是我覺得較好的做法,概念如下:

// 讀取啟用開關,若未設定視為不啟用
bool EnableTestLogic = (ConfigurationManager.AppSettings["EnableTestLogic"] ?? "N") == "Y";

//...略...

if (EnableTestLogic) 
{
		//TODO: 測試台專用邏輯
}

如此,同一套程式碼可供測試台跟正式台使用,啟用與否透過 config appSetting,只要別傻傻把 appSetting EnableTestLogic = "Y" 上到正式台就不會出事。

依據莫非定律,你遲早會遇到有人在正式台啟用 EnableTestLogic = "Y"?所以,針對衝擊較大或與資安有關(例如:略過權限檢查)的測試專用邏輯,我還會多加一層額外保險 - 比對主機名稱。使用 System.Net.Dns.GetHostName() 取得主機名稱,要想啟用測試專用邏輯,除了設定 EnableTestLogic = "Y",還需要填寫正確的測試台主機名稱,例如:

// 讀取啟用開關,若未設定視為不啟用
bool EnableTestLogic = (ConfigurationManager.AppSettings["EnableTestLogic"] ?? "N") == "Y" &&
	System.Net.Dns.GetHostName() == (ConfigurationManager.AppSettings["TestHostName"] ?? "N/A");

基本上,這樣的設計就有夠強的防呆效果了,即使測試台的 config 被無腦複製到正式環境也不會不小心啟用。

那那那,要是有人硬是在正式台 config TestHostName appSetting 填入正式主機名稱呢?

這肯定是孽緣了,施主保重。

[2021-2-4 更新] 如果你寫的是 ASP.NET Core,有開關功能的官方套件,不必自己刻。延伸閱讀:ASP.NET Core 的 Feature Flags(Feature Toggle)by 軟體主廚,感謝 cash 補充。

This article demostrates the tips to prevent logic for testing to deploy to production environment.


Comments

# by jain

孽緣出現就是出大包的時候 如果能把測試跟開發環境設定的跟正式環境一樣 就讓RD辛苦點去開發跟測試 不要跳過正式的所有步驟 (RD沒人權的做法) 至於不能或無法模仿的正式環境 黑暗大的作法已經是有2層的防護了 還是被破防呆的話 就只能祝保重

# by cash

donte core 的話用 Feature Flags 好像比較方便,這是主廚的文章 https://dotblogs.com.tw/supershowwei/2020/11/02/154134

# by Jeffrey

to cash,雄雄忘了提(拍頭),謝謝提醒,已補充於本文。

# by ChrisTorng

使用 CI/CD 自動組建部署的話,使用 1. #if 方法應該也是足夠的才對。 Captcha 82-37 讓我這退化的腦袋瓜算了好久...是否可以簡化減法,個位數不要借位? (也就是前者「被減數」的個位數 >= 後者「減數」的個位數)

# by ALEX

仿效 DOTNET CORE 檢查主機環境變數 只有是 Development / Staging 才可以啟用測試邏輯

# by Jeffrey

to ChrisTorng,在 CD 環境中不太需要擔心這類問題。 Captcha 我也常算錯 XD 但它己被列入我的老年失智預防計劃的一環(我愈來愈需要了),不宜調整。

# by Ca

要是有人硬是在正式台 config TestHostName appSetting 填入正式主機名稱呢? 雖然我不懂 但....能不能再加一組密碼(只有測試人員知道的密碼)

Post a comment