搜尋

搜尋結果

Klook 產品滿HKD1,000減100,船飛自助餐都用得架!
激安優惠
OHChance 旅遊誌・2019-08-29

Klook 推出澳門產品滿HKD1,000減100的優惠碼,自助餐、船飛等都用得,只要一張訂單內澳門的產品夠1000元就可以用。此優惠碼港澳用戶均可使用。 使用方法是只需在付款時輸入 ldquo;KLKMGTO20rdquo; 即可。 優惠碼10月5日前有效,產品使用日期則不限,每個用戶每個code 只能各用1次。 小tips:如果發現使用優惠碼時說你所在地區不能用這個優惠碼,可能是klook 誤判了你的位置,你可以嘗試:1 看看klook 的帳戶是否設定了正確的地區,注意電話號碼也需要澳門/香港地區方可使用此優惠碼;2)你的ip 可能是鄰近地區或被誤認,如果是家裡,可以重開一下上網的路由器讓它重新取一個IP,又或是手機轉用行動上網試試。  【促銷公司】Klook【折扣代碼】KLKMGTO20【預訂時限】10月5日前使用【預訂方式】Klook APP 或網頁【預訂網址】httpsohchance.inforefklook    OHChance 手機 APP 特價資訊直接送到你手!馬上下載:     價錢 Sample ndash; 使用滿1000折100優惠碼 ===== 想搵平機票去玩,即上 OH!Chance!澳燦旅行資訊 httpsohchance.info 去日本旅行買咩 JR Pass好?即上 OH!Note!小燦的旅行筆記做功課 httpsohnote.info 唔知間航空公司好唔好坐?馬上 Subscribe OH Chance Youtube 睇睇佢:httpsyoutube.comcOHChanceTravel 睇埋 Facebook 專頁 httpsfb.comohchance 第一時間獲得最新旅遊資訊!

台灣虎航飛台灣來回連稅HKD849!
激安優惠
OHChance 旅遊誌・2019-02-22

台灣虎航推出6月底前出發適用的promo,搵過清明、復活節等假期都無優惠價,其實呢次價格就唔係幾吸引,除非你是沒有行李需求,那就可以考慮下。 提提大家最平的 tigerlight 票價是不包括托運行李,如果有20KG行李需求建議直接買 tigersmart票價,因為tigersmart比tigerlight貴HKD240,即等於買20KG行李價錢,但 tigersmart 還可以免費選位。 關於護照資料未有或換緊護照不要緊,只要確定姓名、性別、出生日期打對就ok,護照資料可以預訂後自行上官網修改。方法請參考:httpsohnote.infotigerair_manage_booking  《優惠價錢(來回連稅連手續費)》*澳門⇄台北台中高雄:HKD849*台北台中高雄⇄澳門:TWD3,081  《出發日期及最長停留》.出發日期:即日起至6月30日.最長停留:不限  《購票日期及方法》.購票日期:2月23日2359前預訂.預訂方法:台灣虎航官網.預訂網址:httpswww.tigerairtw.comzhtw  【行李資訊】.虎航 tigerlight 票價不包括托運行李額,只包10KG手提行李額。  附註:上述最低價錢為航空公司公告之最優惠價格,或本站能找到的最低價格;每一航班有否優惠票價及所存票量由航空公司決定,優惠票量有限售完即止。  價錢 Sample - 澳門飛台北、台中、高雄優惠價(未連HKD130預訂費) ===== 想搵平機票去玩,即上 OH!Chance!澳燦旅行資訊 httpsohchance.info 去日本旅行買咩 JR Pass好?即上 OH!Note!小燦的旅行筆記做功課 httpsohnote.info 唔知間航空公司好唔好坐?馬上 Subscribe OH Chance Youtube 睇睇佢:httpsyoutube.comcOHChanceTravel 睇埋 Facebook 專頁 httpsfb.comohchance 第一時間獲得最新旅遊資訊!

長榮航空早鳥價,飛台北、台中、高雄 MOP1,229起!
激安優惠
OHChance 旅遊誌・2018-05-23

長榮航空新(再次)推出60天早鳥票價,台中跟高雄價錢都不錯看啊,而且已可以買到2019年5月,已經有 firm plan 真係值得睇下。不過搵過d 大假如聖誕、跨年、新新年、復活節等就沒有優惠。另外早鳥價是可以不同點來回。 提提大家,如果是想6月7月出行就有另一個優惠做緊,來回MOP1,280:httpohchance.info201805evataiwanpromo  《優惠價錢(來回連稅)》*澳門hArr;台北:MOP1,319*澳門hArr;台中高雄:MOP1,229  《出發日期及最長停留》.出發日期:10月3日至2019年5月20日.最長停留:14天  《購票日期及方法》.購票日期:至少出發前60天購票.購票日期:至長榮航空官網.預訂網址:httpswww.evaair.comzhhkindex.html  【輔助資訊】.長榮航空票價已包機上簡餐及 30KG 托運行李額。  附註:上述最低價錢為航空公司公告之最優惠價格,或本站能找到的最低價格;每一航班有否優惠票價及所存票量由航空公司決定,優惠票量有限售完即止。  價錢 Sample ndash; 澳門飛台北、台中、高雄來回連稅價 ===== 想搵平機票去玩,即上 OH!Chance!澳燦旅行資訊 httpohchance.info 去日本旅行買咩 JR Pass好?唔知間航空公司好唔好坐?即上 OH!Note!小燦的旅行筆記做功課 httpohnote.ohchance.info 睇埋 Facebook 專頁 httpsfb.comohchance 第一時間獲得最新旅遊資訊!

美高梅讓您的味蕾踏上深海美饌之旅
澳城餐飲
LifeMag Editor・2016-03-04

澳門美高梅於三月的週末為海鮮愛好者特別搜羅兩款深海珍味:盛事餐廳將呈上國際龍蝦自助餐巡禮,而金殿堂將以矜貴的花尾躉入饌,設計多道精緻的中西式佳,為饕客獻上一個難忘的盛宴體驗。 環球龍蝦週末自助餐巡禮 盛事餐廳採用新鮮的深海澳洲青岩龍蝦、加拿大波士頓龍蝦及越南琵琶蝦等精心炮製佳餚。主廚亦同時加入各國的美食元素,製作多道不同國家的龍蝦菜式,令人回味無窮。 餐前小食「香脆龍蝦薄餅」極具中東特色;「龍蝦魚子醬牛油果沙律」以珍貴的魚子醬配以鮮味的龍蝦,口感香濃柔滑;其他琳瑯滿目的國際美食包括「泰式青咖喱龍蝦配茄子及蘑菇」、「盛事特製法國干邑龍蝦濃湯」、「法式龍蝦乳酪蛋餅」、「意式龍蝦配洋蔥及帕瑪臣芝士」、「西班牙龍蝦飯」、「地中海橄欖配藏紅花燉龍蝦及海鮮」等。享受完主菜,一定不能錯過自家製的龍蝦雪糕,主廚將鮮味龍蝦肉與雲呢拿兩者完美結合,為味蕾帶來超乎想像的感覺。另外,賓客更可以於盛事海鮮吧品嚐無限量供應的海鮮及刺身。 由3月4日起至3月20日,逢週五、六及日晚提供環球龍蝦週末自助餐巡禮,每位澳門幣498元。查詢及訂座,請致電(853)8802 2372。 金殿堂滋補花尾躉饗宴 有「海中珍寶」之稱的花尾躉營養價值甚高,能滋補五臟,養顏美肌。金殿堂於三月指定週五及週六限量推出重量級花尾躉盛宴,喜愛魚鮮的賓客可自選多元的烹調方法細嚐花尾躉的獨有滋味! 金殿堂主廚選用每條重達40公斤的新鮮花尾躉,分為不同部位,如翅、腩、尾部、臉珠肉、鮮花膠等,配合不同烹飪方式以及上佳食材炮製一系列珍饈美饌。矜貴的花尾躉全身是寶,其頭骨、魚尾,下巴等部位亦為精華所在,主廚推薦的「沙參玉竹南棗煲花尾躉骨湯」,以花尾躉骨熬煮出濃香鮮味的湯底,配以滋陰潤肺的沙參和玉竹,簡單的配搭同時兼備美味及食療功效;「遠年陳皮古法蒸躉腩」,陳皮的獨特香氣令甘香細嫩的腩肉滋味昇華;「四川水煮花尾躉球」則冶味可口。其他菜式如「鮑汁麒麟花尾躉皮及鮮花膠」、「薑蔥爆花尾躉扣」、「明火瑤柱花尾躉肉碎滾粥」等,均各具特色。 金殿堂之花尾躉饗宴只於3月4日、5日、18日及19日限量供應,不容錯過。賓客可於訂座時預訂自選的花尾躉部位。查詢及訂座,請致電(853) 8802 2361。 以上價格需另收10%之服務費

美高梅迎秋獻美饌
澳城餐飲
LifeMag Editor・2015-08-28

金殿堂貴賓廳之「眉州烤肉配手切炸饅頭」,選用肥瘦均勻的三度腩以慢火烤煮,味道濃郁、肉腍鬆化 金殿堂貴賓廳之「漁香鱈魚球」,佐以四川甜酸醬料,味道甘香帶點微辣。而「花椒香糯鴨」,以花椒醃鴨並配合糯米,口感軟糯、椒香味濃。 美高梅金殿堂特別於入秋之際限量推出花錦鱔王滋補饗宴 踏入九月,秋意漸濃,澳門美高梅金殿堂和金殿堂貴賓廳分別推出一系列的時令限定秋季佳餚,包括滋補花錦鱔王美饌及精選四川菜式,為賓客迎來令人大快朶頤的季節。 金殿堂花錦鱔王滋補饗宴 鱔乃「四大河鮮」之一,當中以珍貴的花錦鱔王為上品,每到秋天特別肥美。美高梅金殿堂特別於入秋之際推出一系列花錦鱔王精選菜式。 花錦鱔產量少且營養價值甚高,能滋補五臟,養顏美肌。花錦鱔球肉質肥厚彈牙,魚油甘香豐腴,故大受老饕們歡迎。金殿堂主廚選用每條重量達16公斤的新鮮鱔王,配合不同烹飪方式及上佳食材炮製一系列珍饈美饌。如「雲腿茸金銀蒜蒸花錦鱔球」、「銀稔子薑麵醬蒸花錦鱔球」、「豉油皇煎焗花錦鱔球」、「椒鹽焗花錦鱔球」等,各具特色,讓人一試難忘。矜貴的花錦鱔王全身是寶,其頭骨、魚尾,下巴等部位亦為精華所在,其中以入口鮮甜回甘的「天麻北旗黨參南棗燉花錦鱔頭骨及尾湯」最為滋補;而另一道「蒜子秋菇火腩生扣花錦鱔腩及下巴」,冶味可口,令人回味無窮。 金殿堂之花錦鱔王滋補饗宴只於9月4日、5日、18日及19日限量供應,不容錯過。賓客可於訂座時預訂自選的花錦鱔王部位。查詢及訂座,請致電(853) 8802 2361。

Docker 來源掃瞄 - Docker Image Scan
科技新知
MacauYeah・2024-12-19

當網安要求越來越高時,我們也要留心 docker image 的來源是不是有漏洞問題。 docker hub 本身就已經有一些安全掃瞄報告,以 nginx 的 1.27.3 版本為例, docker hub nginx 1.27.3 , docker hub 已經列出相當多的CVE漏洞。 不過對於不公開的 docker image ,安全描瞄可是要收費的。作為小團隊,可能想先尋求一些簡單的免費方案。如果你想同樣的需求,可能Trivy會幫到你。 Trivy Trivy 是一個用於描瞄軟件版本依賴或設定檔是否引用到一些有漏洞問題的軟件,它也能檢測 docker image 是否有漏洞或錯誤設定的問題。而且更好的是, Trivy 本身亦有 Docker Image 版本,我們就不用煩惱怎樣弄一個 Trivy 的執行環境,只要可以運行 docker ,有網路就可以了。但使用 Docker Image 版的 Trivy 有一個額外要求,就是它要有主機上的 docker.sock 權限。 描瞄的指令如下,其中 docker.sock 就是為了讓 containers 內部的程式可以存取主機的 docker daemon , .cache 則是為了方便暫在下載資源。 上面故意用 nginx 的兩個同版本號不同平台的 docker image,其實就是為了引出一些潛在問題。nginx 預設是使用的debain OS的,在筆者寫文章的當下,已經更新到最近的 image ,但始終有一大部份可能的漏洞。反觀 alpine OS 版本,就找不到這麼多問題。 這是因為 alpine 預設安裝的依賴較少,所以找到的漏洞也少。正所謂,做多錯多,唔做唔錯(大誤)。這其實有好有不好,因為在發生問題時,在 alpine 下可能連基本的除錯工具都沒有。除非大家有完整測試,或者對 alpine 有相當的認識,你才會選擇一個非官方預設的版本。但就以事論事,引用較少的依賴,長久之下的確是不會有那麼多隱患。大家如果有條件,也可以試試 alpine 或其他版本。 前一節我們可以看到,Trivy需要經過 socket 的方式才能存取主機上的 container daemon 操作權。但 podman 作為一個不主張 daemon daemon less,亦主張不需要 root rootless,那麼它該怎樣執行? 其實podman也有user層面上的 socket,而且 trivy 也有對應的方式去轉用第三方 socket 有點像使用遠端主機 socket,但官方並未宣佈正式支援遠端的方式。 具體使用方式,筆者亦已在 steam deck 上測試,使用方式如下。不過因為 steam deck 預設沒有 root,筆者就省略 cache 指令,免得之後要有權限問題要手動清理。 Ref Podman socket activation Trivy Support for rootless podman

Docker Swarm mode 指令教學 | docker service
科技新知
MacauYeah・2023-08-22

之前一直都討論Image 的打包形式,現在聊聊部署上線時的一些指令。 Docker Service swarm mode 主要通過quot;docker servicequot; 指令去產生一堆可以在不同節點上運行的container。為了更加形象地講,我把container稱為Image的分身。 docker service create跟docker container run的感覺很像,兩者都可以指定image # swarm mode $ docker swarm init $ docker service create name nginx_s nginx # container mode $ docker container run d name nginx_c nginx 兩者的差別在於docker service 可以指定多少個分身,可以隨時加減數目,而且如果你有多過一台機器,分身就會在不同的機器上遊走。而docker container就是只對本機有操作,也不會散播到其他機器。 # swarm mode $ docker service create replicas=2 name nginx_s nginx $ docker service ls ID NAME MODE REPLICAS IMAGE PORTS uro4rwy6nelh nginx_s replicated 22 nginxlatest $ docker service update replicas=5 nginx_s $ docker service ls ID NAME MODE REPLICAS IMAGE PORTS uro4rwy6nelh nginx_s replicated 55 nginxlatest # container mode $ docker container run d name nginx_c1 nginx $ docker container run d name nginx_c2 nginx $ docker container run d name nginx_c3 nginx $ docker container run d name nginx_c4 nginx $ docker container run d name nginx_c5 nginx $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c45771f06612 nginx quot;dockerentrypoint.hellip;quot; 7 seconds ago Up 6 seconds 80tcp nginx_c5 a587a718da3a nginx quot;dockerentrypoint.hellip;quot; 9 seconds ago Up 9 seconds 80tcp nginx_c4 079f206f8645 nginx quot;dockerentrypoint.hellip;quot; 9 seconds ago Up 9 seconds 80tcp nginx_c3 e10dc525fd22 nginx quot;dockerentrypoint.hellip;quot; 10 seconds ago Up 9 seconds 80tcp nginx_c2 dcaa2b4bb3de nginx quot;dockerentrypoint.hellip;quot; 10 seconds ago Up 9 seconds 80tcp nginx_c1 在建立網段時也差不多,service需要的是overlay network,而container用一般network就可以。 # swarm mode $ docker network create driver overlay nginx_s_gateway $ docker service update networkadd name=nginx_s_gateway,alias=gateway nginx_s $ docker service ps nginx_s ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS fxqtheyvr914 nginx_s.1 nginxlatest dockertest Running Running 33 seconds ago u0pvj1leoizw _ nginx_s.1 nginxlatest dockertest Shutdown Shutdown 33 seconds ago q7arumjlxduv nginx_s.2 nginxlatest dockertest Running Running 36 seconds ago kurlwqfmopbg _ nginx_s.2 nginxlatest dockertest Shutdown Shutdown 37 seconds ago zd0zlkhxafv0 nginx_s.3 nginxlatest dockertest Running Running 40 seconds ago 3kapr00fs6pt _ nginx_s.3 nginxlatest dockertest Shutdown Shutdown 40 seconds ago 5o4afd3whygo nginx_s.4 nginxlatest dockertest Running Running 35 seconds ago oxocropolbo8 _ nginx_s.4 nginxlatest dockertest Shutdown Shutdown 35 seconds ago x5y94jf3ok51 nginx_s.5 nginxlatest dockertest Running Running 38 seconds ago cgld3au0w1i9 _ nginx_s.5 nginxlatest dockertest Shutdown Shutdown 39 seconds ago # container mode $ docker network create nginx_c_gateway $ docker network connect alias gateway nginx_c_gateway nginx_c1 $ docker network connect alias gateway nginx_c_gateway nginx_c2 $ docker network connect alias gateway nginx_c_gateway nginx_c3 $ docker network connect alias gateway nginx_c_gateway nginx_c4 $ docker network connect alias gateway nginx_c_gateway nginx_c5 不過比較大的差異是service會停了原有的分身,重開新的分身去加入網段。所以上面的docker service ps nginx_s執行結果,就有一半是停掉的。 類似地,docker service也不能單獨地停掉分身,頂多只能調整replicas=NUMBER,來控制分身數量。而單機則可以經過docker container stop來暫停分身。

MARVEL 粉絲絕不能錯過的遊戲首發日|本週手遊重點推介 2021/07/26-08/01
手機‧電玩
MacauYeah・2021-08-02

MARVEL 未來革命 前幾週已經提過MARVEL會有新作品啦,最近正式公佈就正式公佈上市日為8月25日 咁官方就形容啦,今次遊戲係以開放世界進行,而且還有原創劇情。再加上是MMORPG的定位,所以一定會實時同其他玩家連線,如果大家平時WiFi收得唔太好,記得去搵個好位先再登入遊戲。 遊戲最新的實機展示 連結 官網 Android iOS 我在江湖有座城 人老了,反應不像年輕時快,但當然不代表這樣就沒有遊戲可以玩。接下來為大家介紹的是一款經營類遊戲我在江湖有座城。本作就不走主流的PVP方向,回歸養成的基本玩法,讓玩家無壓力地培養一個自己喜愛的城池,在整個水墨的襯托下,整個人都好像回到了古代一樣 遊戲暫時只有Android預約連結,iOS大家要再等等。 連結 官網 Android 搖搖星球 華語遊戲開發裏,比較多的還是以中國大陸為主,很少香港、台灣團隊可以擠身這個市場。但無論多難的事,都會有熱心開發者嘗試去挑戰。而最近就有一隊台灣獨立開發團隊,要推出他們的處女作《搖搖星球》。 不要看畫風可愛,就以為它是慢動作的解迷作品,其實他是一款動作彈幕遊戲。遊戲其實以台灣手搖杯廢水文化出發,主人公要把手上獨立的特色飲料,經歷重重關卡送到客人手上,獨立團隊的創意真的不能少看。 概念影片 暫時筆者就未有找到官方上市日期,想要知道更多內容,就只好跟實我地嘅報導。 連結 官網

Spring Boot 04 - 進入http json api 世代
科技新知
MacauYeah・2024-05-23

本節,我們將會建立一個http服務,提供json api讓程式訪問。 下戴模版 我們跟上節一樣,使用Spring Initializr Maven 下載模版,但細節筆者就不再講啦。Dependency主要選擇 Spring Web Spring Boot DevTools 下載後,可以直接運行測試,可以用指令 mvn test 或經IDE運行。Spring會至少測試下能不能成功取用預設的8080端口。 Controller 我們若要實作 http json api,需要在 spring 中加入一個類,附註為 @RestController ,那方便起見,類名我們也命名為 XXXController 吧。作為示範,我們弄一個 HomeController.java ,裏面有最常見的 http GET, POST功能。 srcmainjavaiogithubmacauyeahspringboottutorialspringbootwebapibasiccontrollerHomeController.java import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; ... other import @RestController @RequestMappingquot;apiquot; public class HomeController @GetMappingquot;someRecorduuidquot; public Map readSomeRecord@PathVariable String uuid return Map.ofquot;retquot;, quot;your uuidquot; uuid; @PostMappingquot;someRecordquot; public Map createSomeRecord@RequestBody Map requestBody HashMap ret = new HashMaprequestBody; ret.putquot;retquot;, quot;got your requestquot;; return ret; HomeController裏,完整的URL 其實為 GET httplocalhost8080apisomeRecorduuid POST httplocalhost8080apisomeRecord URL中的api之後的路徑,都是定義在 HomeController 中,而前半的8080及context path,是使用預設值。在正式環境下,可能隨時會被重新定義。但我們做本地測試,只需要驗證預設值就可以了。 我們真的運行起程式mvn clean compile springbootrun,再使用最簡測試工具進行測試。Windows的朋友,可以選擇Postman作為測試,它有圖形介面。而linux的朋友,請用curl,預設安裝都會有。下列為方便表示測試參數,筆者選用curl。 測試GET,其中1234會自動對應到spring裏的uuid。 curl httplocalhost8080apisomeRecord1234 # return quot;retquot;quot;your uuid1234quot; 測試 POST,其中的 d 參數,會對應 spring裏的 @RequestBody, H 參數則是設定 http header 的意思,我們就使用約定俗成的 json 作為 header 。 curl X POST httplocalhost8080apisomeRecord H quot;ContentType applicationjsonquot; d 'quot;requstquot;quot;did you get itquot;' # return quot;requstquot;quot;did you get itquot;,quot;retquot;quot;got your requestquot; 上面的兩個操作,都回傳了我們輸入的資訊,這代表了我們成功用spring架起了http json api,而且正常讀入資訊。 Test Case 雖然我們可以正常地架起 api,但每次開發都要 postman curl這種工具額外試一次,其實也有一些成本。而且 api 數量變大,或經多次修改後,就重複人手執行,就變得相當討厭。 面對這個問題,筆者會建議寫測試用例,即是Test Case,而且用Spring內置的@SpringBootTest來寫。 產生一個空的Test類,vscode中,最簡單可以Source Action =gt; Generate Test,然後加入這次要測試的參數。 srctestjavaiogithubmacauyeahspringboottutorialspringbootwebapibasiccontrollerHomeControllerTest.java import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.RequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; @SpringBootTest @AutoConfigureMockMvc public class HomeControllerTest @Autowired private MockMvc mockMvc; @Test void testGetSomeRecord throws Exception RequestBuilder requestBuilder = MockMvcRequestBuilders.getquot;apisomeRecord1234quot; .contentTypeMediaType.APPLICATION_JSON; this.mockMvc.performrequestBuilder .andExpectMockMvcResultMatchers.jsonPathquot;$.retquot;.valuequot;your uuid1234quot; .andDoMockMvcResultHandlers.print; @Test void testPostSomeRecord throws Exception String request = quot;quot;quot; quot;requstquot;quot;did you get itquot; quot;quot;quot;; RequestBuilder requestBuilder = MockMvcRequestBuilders.postquot;apisomeRecordquot; .contentTypeMediaType.APPLICATION_JSON .contentrequest; this.mockMvc.performrequestBuilder .andExpectMockMvcResultMatchers.jsonPathquot;$.requstquot;.valuequot;did you get itquot; .andExpectMockMvcResultMatchers.jsonPathquot;$.retquot;.valuequot;got your requestquot; .andDoMockMvcResultHandlers.print; 最後就是執行 mvn test 或經IDE運行,應該都會得到所有測試都通過的結果。 mvn test # other test result ... INFO Tests run 2, Failures 0, Errors 0, Skipped 0, Time elapsed 0.368 s in io.github.macauyeah.springboot.tutorial.springbootwebapibasic.controller.HomeControllerTest # other test result ... 上面的程式碼很多,我們逐一來。 @SpringBootTest 寫在類的外面,代表執行這個測試類時,需要運行起整個Spring程序,當然也包括http的部份。 @AutoConfigureMockMvc 寫在類的外面,代表執行這個測試類時,可以模擬一些發向自己的 http 請求。 @Autowired private MockMvc mockMvc 寫在類的裏面,因為之前有定義了可以模擬 http 的請求,Spring在運行時為大家提供了那個所謂的模擬http client的實例。 MockMvcRequestBuilders,則是建造要測試的URL及Header參數。 MockMvcResultMatchers,則是檢查回傳的結果是否如遇期的一樣。 為何這個http client叫模擬 Mock 因為在測試用例中,可能連Controller 內部依賴組件也需要進一步模擬,這樣才能把測試目標集中在Controller裏,這也是單元測試的原意。只是本次的例子看不出模擬與否的差別。 MockMvcResultMatchers.jsonPath,這是用來檢測json的結構是否跟預期一樣。有些網路上的其他例子會簡寫成 jsonPath ,但因為vscode IDE的自動import功能比較差,筆者還是保留傳統的寫法。 如果大家覺得@SpringBootTest很難,想折衷地把其他測試方法,那麼把 postman curl好好管理起來,每次修改完程式,都完整地執行一次 postman curl ,也可以達到測試的效果。只不過大家還是要好好學會整合 postman curl,知道如何檢測json結構,什麼時候有錯,什麼時候叫測試通過,所以也要花一樣功夫來實現。 最後,大家千萬不要因為測試難寫而逃課,因為寫測試絕對地可以減輕日後重執行的工作量。除非你的程式碼即用即棄,否則都建議寫測試。測試跟寫文檔不一樣,有了測試也不能沒有文檔。好消息的是,文檔現在越來越多自動生成的工具,我們日後再找機會介紹。 Source Code spring boot web api basic