搜尋

搜尋結果

你開始寫 Spring Boot 測試案例了嗎?
科技新知
MacauYeah・2025-11-29

雖然筆者過往做 spring boot framework 教學中,都有滲入一些測試用例。筆者也曾經困惑了很長一段時間,所以就獨立開一個主題,聊一下筆者在實務上對spring boot test 的理解。 測試案例究竟測試什麼? 測試用例 test case 是確保你的程式碼正確性與穩定性的重要步驟,但在 framework 下,並不是所有功能都很容易寫成測試。所以在討論 framework 測試之前,釐清測試的本質。 function input business logic function output 這意味著我們輸入某些資料(input),然後經過業務邏輯(business logic)的處理,最後產生結果輸出(output)。 我們的測試目標,其實就是確保業務邏輯正確。而我們的手段就是經檢查概定的輸入資料,核對輸出結果。 那麼只要我們可以生成輸入資料,就一定可以檢查輸出結果了吧?其實不是的,因為實務上的輸入和輸出沒有這麼簡單。筆者常接觸到的輸入輸出如下 輸入 function 輸入參數 系統狀態資料,例如:資料庫狀態、外部API結果。 輸出 function 輸出參數 寫入系統(影響到)的資料,例如:資料庫狀態、使用外部API時的輸入參數。 總之就是考慮了狀態機 state machine 的問題,每個狀態外部輸入都是一個測試用例,然後核對狀態機去了下一個什麼狀態。 言下之意,我們就是暴力地生成輸入參數和模擬狀態資料,道理上就是可以進行測試。 Spring boot web framework 中,我們又會測試什麼? function input business logic function output在Spring boot web就變成如下 controller request business logic controller response在 Spring Boot test 中,我們可以用模擬的 MVC MockMvc 測試來驗證 controller 的行為。不過,其實進入 controller 前經過很多系統轉換,而這些道理上跟Framework的技術大相關,與業務邏輯小相關。所以為免折磨自己,可以將業務邏輯單獨封裝成服務(service)。之後直接測試服務 ,易寫也易讀。 controller request service input business logic service output controller response道理上 controller 能做的業務邏輯,服務 service 都可以無腦重現。這樣還可以重用服務,減少測試的數量。 如何實現輸入? 直接 new Object。大部份的情況下,因為業務是自己編寫的,應該都可以直接 new 出來。 經 json 檔讀入。如果輸入的參數量太多,逐個經 java new 是很耗時的,我們可以經 json 反序列化變成 Object。但這亦只限於自己可以操作改寫的類。 Mockito 模擬那些無法簡易經 new 或 json 反序列化的 Object。例如:spring security authentication object 我們在使用時,其實只看到 interface。我們難似自己實現一個可以反序列化的類,那麼我們可以使用 Mockito 來模擬這些資料。一些外部API的結果,我們也可以用使 Mockito 來模擬。 什麼情況下不進行測試? 有些情況下,我們可能選擇不對某些功能進行測試,原因可能包括對功能的了解不足或是單純的懶惰。以下是一些例子: 僅進行配置的Function:如果你的 Function 只是在 Framework 中填寫配置,而且你並不太了解它的運作原理,可能就不需要進行測試了。例如,Spring boot web 中,需要大家配置一個SecurityFilterChain Object,它要求大家將 HttpSecurity 轉換為 SecurityFilterChain 。因為輸入的 HttpSecurity 是系統固定的參數,我們亦沒有檢查它的狀態。這種情況下,它的輸入及輸出,其實我們都沒有真正理解。我們硬測試的話,測試功能可能只流於表面。若我們真的要做測試,也是經過MockMvc進行端到端測試(endtoend testing),測試它在事後的影響範圍。 單純的框架功能:例如資料庫的儲存庫介面(repository interface),雖然是在框架下生成的,對於自己手動調整的部份功能,筆者通常亦不會進行單獨測試,通常都會搭配業務邏輯一起進行。它可以使用 Mockito 進行模擬測試,或用測試環境的真實資料庫進行測試。 面對的挑戰 總括來講,筆者盡可能地把測試用例限定在業務邏輯中,就可以大大地降低寫測試的技術難度。但筆者還是有些問題並未完美解決。 測試用例的數量可能很多,因此共用與維護變得相當困難。逐個用例獨立編寫輸入也是很累的。對於 Mockito 的使用,筆者還是可免則免。因為要逐個功能模擬,編寫量就指數提高,這亦難似配合外部變化。一般來說,能優先使用測試環境或者 Docker 來模擬環境的,就盡量用。 離線開發、離線測試。系統依懶的外部功能越多,想做單機開發的難度就越高。即使前述有 Docker 測試,對於持續整合(CI)來講也是有一定難度。那麼這時,Mockito 就是一個可取的選擇。但這又回到編寫量及難以偵測外部變化問題。 希望這篇文章能幫助你更好地理解測試案例的編寫方向,並在Spring boot web開發中加入你自己的測試!

來來著數日 來來卡$0.75=1亞洲萬里通!
生活在我城
MO560・2019-05-19

來來著數日 用大豐來來卡$0.75=1亞洲萬里通! MO560 教識你生活中各種儲里數方法 5月2526日來來著數日,大豐信用卡繼續有優惠!於著數日到GF及1F用大豐來來卡有20倍積分,換算後等於$0.75=1亞洲萬里通!其他大豐信用卡都有2倍,換算後等於$7.5=1亞洲萬里通。 另外,於著數日到GF及1F用來來著數卡大豐來來卡單一消費滿MOP$600額外送200積分,滿MOP$1200額外送400積分,如此類推。記得順便儲來來積分啊!因為5000來來分可以換200亞洲萬里通里數! 來來積分換里數 詳情 大豐信用卡20倍分時的里數兌換比率:每 $0.75 消費 = 1 亞洲萬里通每 $0.4 消費 = 1 鳳凰知音每 $0.6 消費 = 1 東方萬里行每 $0.6 消費 = 1 南航明珠俱樂部 20倍積分=10%回贈 另外,如果你不儲里數的話,亦可以換現金券的。大部分都是20000分換$100現金券,20倍分後就等於10%回贈﹝因為消費$1000就可以換$100券﹞,小編認為值得換的有:超市券、八佰伴券、Starbucks券,全部都是20000分換$100。另外,小編不太建議換油券,因為日常入油會額外送10%,用油券就不會送。 小編是以里數為主題的,所以換現金券就不多講了,如果你想了解兌換里數以外的東西,請看:BOCI簽帳得Fun禮品集 留意,BNU的Asia Miles卡亦在Promo中,任何消費只要MOP$500以上,白金卡$5=1里數,金卡$6=1里數。 BNU AM卡 優惠詳情 注意事項 小編在Blog中已經幫大家整理了三個本次活動的注意事項,請轉到MO560的Website中查看。 緊貼最新最潮澳門信用卡、飛行里數、旅遊資訊,記得讚好MO560的Facebook! 如想查看更多詳情,請到MO560的Facebook或Website查看。 喜歡小編的文章嗎?比個Like支持我啦 Facebook MO560Instagram mo560_travelWebsite httpsmotravel.info 想追蹤最新最潮澳門信用卡、飛行里數、旅遊資訊?將MO560設定為 「搶先看See First」!

路癡去旅行是一種甚麼體驗?
走遍世界
Dexter・2017-10-03

只有路癡才能懂的辛酸,條條路都是去羅馬的!路癡去旅行所消耗的腦細胞比常人多出好幾倍,常人又怎麽會理解呢?如果你身邊也有個路癡,或者你本人就是路癡,那請好好對待路癡們,畢竟他們也不容易。 那麽路癡去旅行到底是一種甚麼體驗呢? 01 打開 Google Map 也找不到路? 作為路癡,連 Google Map 也挽救不了!別笑!許多路癡都遇到過這種事,明明已經打開 Google Map 跟著的指示走,卻怎麽走也走不到目的地。而且還有不少路癡不懂得怎樣用 Google Map,即便現在的地圖 Apps 十分簡單,更何況有時候 Google Map 的定位也不是 100% 準確。 02 分不清東南西北方向 就算給路癡一個指南針,他們也未必能分清東南西北,更別說在沒指南針的前提下,想要跟著太陽找到方向可難了,拿著紙質地圖也不知道該往哪走。 03 近在咫尺卻遠在天邊 明明只有 5 分鐘路程,卻可以花上半小時!比繞路的司機還要厲害! 04 問完路跟沒問路一樣 這就跟上學時代一樣,在課堂上聽老師講解好像甚麼都聽懂了,可等自己做題時,才發現又好像甚麼都沒聽懂。而且問路也會緊張hellip;hellip; 05 剛出門又找不到回去的路 明明才離開酒店兩步,就找不到回去的路,請原諒我一生放蕩不羈愛自由! 06 每條路看起來都一樣 對路癡來講,條條路看起來真的都差不多!那些建筑物以為自己記住了,轉過頭就找不到了。 就跟海賊王裡的佐羅一樣,作為路癡的你,是否也找不到路呢?不過也別怕,迷路其實也是一種體驗,你還可以遇到別人遇不到的風景! copy; 原文版權歸 Dextalk.com 作者 DEXTER 所有,任何形式轉載請聯系作者。 原文地址 dextalk.com 如果你也喜歡旅行,歡迎支持我的 Facebook Page:劈柴喂馬走天下 也歡迎 Follow 我的 IG: @Dex.Chan

【澳門】路環黑沙龍爪海岸徑 ~ 澳門的「黃金海岸」 都市繁囂外的醉人風光
生活在我城
80後愛旅行✈️・2018-05-14

作為土生土長的澳門人, 80後愛旅行經常周圍走, 分享不同地方的旅遊資訊給大家 但...我竟然沒有為大家分享過我的家澳門的景點 該打 😩 今次我就為大家介紹澳門的「黃金海岸」, 路環黑沙龍爪海岸徑 「黑沙龍爪角海岸徑」位於路環黑沙龍爪角的黃金海岸, 起自黑沙海濱馬路, 終於竹灣別墅群, 屬於一線式的步行徑。 ⭐附近還有另一條不是沿海的步道, 叫「黑沙龍爪家樂徑」, 大家不要走錯⭐ 我們走的是沿海的「黑沙龍爪角海岸徑」 在澳門, 我們當然是開車去啦 🚗 由於龍爪角海岸徑屬於一線式的步行徑, 就是不能走一個圓形回到終點 所以開車來的話要走來回才到回到最初停車的地方。 我們把車開到上圖🔸C33的外圍, 就是黑沙海濱馬路那邊 停好車後, 就往右上方走, 就是「黑沙龍爪角海岸徑」的入口 「黑沙龍爪角海岸徑」全長1200米, 全程都是沿海步道, 可以好好欣賞澳門的海岸線 像我們接近黃昏的時間來, 更能看到日落的美 🌄 今天天氣真好, 但也迎來涼涼的海風, 非常適合行山 開始囉 Go 🚶zwj;♀️🚶 澳門民政總署對海岸徑持續進行優化工作, 包括沿途設置介紹牌, 更換海岸徑的圍欄等, 有關工程在2017年完成。 所以現在我們走的「黑沙龍爪角海岸徑」可謂是重新粉飾, 非常新淨的 沿途看到有很多岩石, 不少「釣魚客」都會走下去垂釣一番。危險動作切勿模仿 身為土生土長的澳門人, 完全沒想似過有這麼的一個地方可以看到澳門美麗的海岸。 很多人都問 為什麼澳門人這麼愛旅行, 我們都會回答, 因為澳門太小沒什麼好玩的。 我們都着重於找尋世界的風景, 卻忘記了發掘自己家裡的美景 海岸線對岸的是鷺環海天度假酒店, 前身為路環威斯汀度假酒店 拍下標距柱 果然我們才剛開始走呢...😅 「猿人石」 猿人石是在「黑沙龍爪角海岸徑」前的海角, 無論從東向西看還是從西向東看, 都像歛足坐着的駱駝, 是澳門地區現存最大的像形石。 其中西南面一部份, 形狀似猿人頭像, 故名為猿人石。 繼續往前走, 可以見到遠處有個伸延到海上的涼亭, 叫「聽海軒」, 名字真美 🏯 可惜是「聽海軒」正在整修, 無法進內。 如果能在「聽海軒」內看日落, 風景一定很美 「黑沙龍爪角海岸徑」沿途都有不少美麗的花朵 路邊的野花不要採🌻🌼 不知不覺已經由 10801 走到 10805 了, 已經走了1公里囉 走著走著已經黃昏日落了 為海岸徑抹上一片晚霞, 澳門的黃昏真的可以這麼美 😍 看到這個圓環, 代表已經走到下圖🔸C31下方的分叉路, 到達「竹灣豪庭」 我們就走到這裡作終點, 再原路往回走。 如果要坐巴士的朋友, 就走走到上圖🔸C31的地方, 再往大馬路走就會見到巴士站 🚏 原路往回走, 夕陽下的海岸徑 🏞️ 享受著海風吹拂, 眺望著大海, 真寫意 ㊙️ 我們也走到岩石上, 更親近大自然 危險動作切勿模仿 海水從岩石間湧進來, 浪還蠻大的, 真的要小心 澳門美麗的黃昏 💕 「黑沙龍爪角海岸徑」沿途擁有奇岩異石 和 豐富的海岸生態 真的非常適合一家大小 或是 三五知己來步行 我們研究了這條步道很久😂 要爬過岩石才能走到樓梯上🤣🤣 旁邊也沒有路來可到達的...😅 我們慢慢走, 又走走停停的看風景和拍照 📷 花了1個半小時來回了這個「黑沙龍爪角海岸徑」 最後我們走回🔸C33對開的地方拿車囉 🚌🚌🚌 如果是坐巴士來的朋友, 有兩個方法 1️⃣ 乘搭 15、21A、26A 和 N3 號巴士在海蘭花苑站落車, 往對面沿黑沙龍爪角海濱馬路步行約7分鐘即到龍爪角海岸徑入口 2️⃣ 乘搭 15、21A、26A 和 N3 號巴士到竹灣豪園1站落車, 向前行去竹灣馬路及黑沙兵房路交匯處即到龍爪角家樂徑出入口, 再往海岸徑方向走 黑沙龍爪角海岸徑 👣 黑沙龍爪角海岸徑 澳門黑沙龍爪角海濱路 ⏰ 全日開放 檢視較大的地圖