搜尋

搜尋結果

金麗華酒店新春推廣
澳城餐飲
LifeMag Editor・2017-01-17

為迎接丁酉雞年的來臨,金麗華酒店特備一連串賀歲節目與眾歡度喜氣洋洋的新歲,精彩節目將在大年初一上午十一時一月二十八日的隆隆炮竹聲及浩浩蕩蕩的醒獅伴隨下掀起序幕,除醒獅及武術的精彩表演外,財神爺更蒞臨各餐廳大派利是,濃厚的節日氣氛讓每一位賓客盡興而歸,來年行好運! 新春豐盛美食 除舊佈新,喜迎雞年!一月起金麗華酒店推出精選佳餚、特色禮物和傳統美點任君選擇!金麗軒中餐廳、薈景閣咖啡室、灆泰國餐廳及乘風廊現推出一系列過年特色美食 與您歡度新年: 春茗套餐 金麗軒中餐廳呈獻六款寓意吉祥的新年春茗套餐,每席澳門幣 3,888 元起。農曆新年期間金麗軒更敬備多款賀年菜譜及中式糕點,更特別推出歡送猴年優惠,由即日起至 2017年 1 月 25 日,凡農曆猴年出生的壽星惠顧金麗軒中餐廳晚市將享高達六五折優惠。 節日盛宴 沒甚麼能比得上於薈景閣咖啡室與家人朋友一同開懷大嚼,更有供應源源不絕的生猛海鮮,您怎可錯過? 半自助餐自助餐 成人每位 澳門幣 268 起 |05 歲 ndash; 免費 618 歲 ndash; 半價 灆泰國餐廳 座立於度假村園林泳池旁的灆泰國餐廳於新年期間提供「羊肉美饌菜單」,讓您可於繁華的澳門當中細嘗泰式的特別賀年菜餚,同時欣賞四周園林美景。 乘風廊酒吧 同樣位於酒店二樓的乘風廊今年推出「新春下午茶套餐」,兩位用澳門幣 298 元,更有特調雞尾酒由澳門幣 98 元起,讓您與摯愛親朋渡過悠閒寫意的春節假期。 查詢及預訂請致電 853 2856 7888 ndash; 金麗華酒店 853 8793 3821 ndash; 金麗軒中餐廳 853 8793 3871 ndash; 薈景閣咖啡室 853 8793 4818 ndash; 灆泰國餐廳 853 8793 3831 ndash; 乘風廊酒吧 全新的「小童」定義 ndash; 十八歲 金麗華酒店,這個唯一位於澳門市中心的豪華度假村酒店,成為全澳第一間將「小童」優惠界限提升至十八歲的酒店。現在,只要有一位以成人正價惠顧自助午或晚餐的客人陪同下,同行的小童只要未滿六歲即可免費進餐,而六歲至十八歲或以下的小童亦可獲半價優惠。此外,當您預訂含早餐的住宿套餐或住房客人以成人價享用自助早餐,同行的最多兩名十八歲或以下的小童可均可享免費待遇,更有免費加床服務。 關於澳門金麗華酒店 澳門,距離香港的不遠處,散發著中葡文化交匯地的攝人魅力!澳門金麗華酒店佔盡地理優勢,身處於商業、購物及娛樂中心,步行至港澳碼頭只需數分鐘,與連接中國的澳門關閘及澳門國際機場亦只需十分鐘車程。酒店薈萃東方及歐陸風情格調,包括 416 間豪華客房及套房、四間提供亞洲美味佳餚的餐廳、佔地一萬五千平方米的金麗華度假村,當中設有金麗華香薰美療中心和兒童中心,都是您伸展筋骨,享受寧靜舒適假期的世外桃園!

【如何用Trading View寫每天只交易一次的策略】
創富坊
程式交易 www.quants.hk (導師: 財經書藉作家: 麥振威)・2024-06-17

最記得以前有學員曾說過,他過去試過很多的交易策略,最後在實戰時的成績都不太好,然後「嬲嬲地」就每天只看到MACD的第一個訊號便入市,開市後見MACD的快線升穿慢線便買入,相反,若MACD的快線跌穿慢線便造淡,然後見MACD的快線繼續上升便平好倉,造淡時則見MACD的快線繼續下跌就平淡倉,就是這樣簡單 但效果反而比很多複雜的策略更好。 這個只是他的意見,最後成績如何他沒有告訴我,但筆者自己研究過很多的Daytrade策略也都是每天只交易一次的,因為交易次數太多,交易成本就會增加,而且長時間交易會覺得更亂,特別是遇上連續虧損的時候,而每天只交易一次就是讓自己有足夠時間冷靜下來。 不過,若要用pine script寫這類每天只交易一次的策略,又應怎樣寫 以下是一個很簡單運用Zero Lag MACD的交易策略,就是快線升穿慢線便買入,當買入後看到連續三支陰陽燭的時間內MACD的快線都在上升,那就平倉離場。 This Pine Scripttrade; code is subject to the terms of the Mozilla Public License 2.0 at httpsmozilla.orgMPL2.0 copy; markchunwaipaul @version=5 strategyquot;zero lag MACD交易例子quot;, margin_long=100, margin_short=100, initial_capital =1000,default_qty_type = strategy.percent_of_equity,default_qty_value = 100 SN=input12 LP=input26 M=input9 ema1=ta.emaclose,SN ema2=ta.emaema1,SN ema3=ta.emaclose,LP ema4=ta.emaema3,LP ZerolagMACDLine=2ema1ema22ema3ema4 ema5=ta.emaZerolagMACDLine,M ema6=ta.emaema5,M ZerolagSignalLine=2ema5ema6 Histogram=ZerolagMACDLineZerolagSignalLine var bool traded =false closeCond=ta.risingZerolagMACDLine,3 noposition=strategy.position_size==0 buyCond=ta.crossoverZerolagMACDLine,ZerolagSignalLine if buyCond and noposition strategy.entryquot;BUYquot;,strategy.long if closeCond and not noposition strategy.closequot;BUYquot; plotZerolagMACDLine,title=quot;MACDLinequot;,color=color.yellow ,linewidth=2 plotZerolagSignalLine,title=quot;SignalLinequot;,color=color.green,linewidth=2 plotHistogram, color=color.black, style=plot.style_histogram,linewidth=2 以上策略的Backtest report 可以看到這樣寫每天的交易次數肯定不只一次,交易了1023次,獲利交易只有514次,勝率約50.24%,一年的虧損約37.45%。 另以下是同一個策略但每日只交易一次的寫法 This Pine Scripttrade; code is subject to the terms of the Mozilla Public License 2.0 at httpsmozilla.orgMPL2.0 copy; markchunwaipaul @version=5 strategyquot;用zero lag MACD每日只交易一次例子quot;, margin_long=100, margin_short=100, initial_capital =1000,default_qty_type = strategy.percent_of_equity,default_qty_value = 100 SN=input12 LP=input26 M=input9 ema1=ta.emaclose,SN ema2=ta.emaema1,SN ema3=ta.emaclose,LP ema4=ta.emaema3,LP ZerolagMACDLine=2ema1ema22ema3ema4 ema5=ta.emaZerolagMACDLine,M ema6=ta.emaema5,M ZerolagSignalLine=2ema5ema6 Histogram=ZerolagMACDLineZerolagSignalLine var bool traded =false closeCond=ta.risingZerolagMACDLine,3 noposition=strategy.position_size==0 buyCond=ta.crossoverZerolagMACDLine,ZerolagSignalLine if buyCond and not traded and noposition strategy.entryquot;BUYquot;,strategy.long traded=true if closeCond and not noposition strategy.closequot;BUYquot; if ta.changetimequot;Dquot;=0 traded=false plotZerolagMACDLine,title=quot;MACDLinequot;,color=color.yellow ,linewidth=2 plotZerolagSignalLine,title=quot;SignalLinequot;,color=color.green,linewidth=2 plotHistogram, color=color.black, style=plot.style_histogram,linewidth=2 留意克體的部份就是加上後令策略變成「每天只交易一次」。 先設定traded為false,然後當買入後便設定為true,由於入市條件加上了not traded,代表要traded 必需為false時才會入市,這樣交易一次後就不會再交易,最後加上ta.changetimequot;Dquot;=0,代表要轉為第二個交易日,traded才會再轉變為false,然後第二日當ZerolagMACD的快線升穿慢線時就會符合入市條件。 策略的backtest report 同一樣的交易策略,只是將其改變為「每天只交易一次」,可以看到結果也是虧損,不過,虧損幅度卻由37.45%大幅下降至10.75%。另外要留意,筆者寫這兩個策略是沒有計算「佣金」及「滑價」的,而第一個策略在一年裏交易了1023次,但加上「每天只交易一次」這個條件後,一年裏只交易了258次,交易成本會相差很遠,不過勝率就未見有大幅改善,獲利的次數只有132次,勝率只輕微由50.24%提高至51.16%。 交易策略當然不可能這樣簡單,但只要將以上兩個策略作比較便可看到,每天只交易一次的Daytrade策略確實能提高成效。 網頁 www.quants.hk Youtube httpswww.youtube.com@markchunwai Facebook專頁 httpswww.facebook.comquantshk Patreon httpswww.patreon.comquantshk

小心!新勒索病毒 Defray 假冒醫院寄送郵件,教你用 3 招拆穿!
科技新知
StanSteve・2017-09-03

近期有一款名為「Defray」的新勒索病毒,正在國際間發動攻擊,已被國外資安業者偵測到,呼籲電腦用戶收發郵件務必要提高警覺。 新勒索病毒 Defray,偽裝成醫院相關的寄件者,透過網路釣魚的假冒手法,寄出內附有加密的惡意連結綁架電腦。圖翻攝自IBTimes 外媒《Securityintelligence》報導指出,資安業者 Proofpoint日前在進行病毒監測時,發現到一款變種的勒索病毒「Defray」,主要是透過網路釣魚的方式,寄件者會假冒為來自某家醫院資訊科技部門的電子郵件,並附有Word文件檔,由於寄件者、寄件主題都是跟健康醫療有關,因此很容易讓使用者失去戒心,較不容易察覺。 一旦開啟了郵件,裝置就會中招,開始執行加密程序,電腦所有的文件檔案資料就會被綁架上鎖。 新勒索病毒 Defray,偽裝成醫院相關的寄件者,透過網路釣魚的假冒手法,寄出內附有加密的惡意連結綁架電腦。圖擷取自Proofpoint 據了解,到目前為止,已知美國、英國都有傳出中毒災情,雖然規模還不至於到非常龐大,但觀察其發動攻擊的模式,都是特別針對健康、教育類相關。也就是說會選擇特定的對象進行「客製化」攻擊。因此,不排除未來還有可能針對特定用戶,假冒為特定類型的寄件者,持續透過網路釣魚方式發動勒索病毒攻擊。 圖擷取自SecurityIntelligence 根據資安業者 Proofpoint 所發佈的最新研究報告,一旦不慎點擊,電腦中招遭綁架後,駭客會要求高達 5千美元的贖金,相當於台幣15萬元左右。至於要如何防範假冒的釣魚信件?Proofpoint 提出以下 3 點的假冒特徵: 網路釣魚郵件附加假冒的Word文件檔案,內藏惡意加密勒索的軟體程式。圖擷取自Proofpoint 1.假冒的寄件者多採用:group@...、或websupport@、....等等的型式,讓使用者不容易察覺。 2.假冒的釣魚信件,可能依據收件者所在的地區,顯示出其假吂的醫院、健康醫療等相關的地理位置,讓使用者失去戒心。這項推測主要是從英國、美國傳出災情研究觀察的發現。 3.假冒的釣魚信件多會附有假冒為Word文件、或txt記事本的檔案。文件內附有執行綁架檔案的惡意連結。 網路釣魚郵件附加假冒的Wodr文件檔案,內藏惡意加密勒索的軟體程式圖擷取自Proofpoint 網路釣魚郵件附有假冒的記事本檔案,內藏惡意加密勒索的軟體程式。圖擷取自Proofpoint 推測認為類似的釣魚手法,很可能會因應不同的族群假冒為不同類型屬性的寄件者,特別公開呼籲所有電腦使用者,面對各式變種病毒潛在的風險威脅,收發郵件時務必要提高警覺,多加防範,不要輕易點擊。此外,也要養成電腦檔案定期備份的習慣。 以上文章及圖片均轉載自網路,所有版權歸原作者所有 原文地址:http3c.ltn.com.tw

智能家居潮流沒法擋,LG推SmartThinQ Hub
創意生活
LifeMag Editor・2015-12-31

LGE IoT Eco System LG SmartThinQHUB 智能家居是現時每家科技廠商都會想要涉足的新市場,今年只是個開始,明年將會有更多的智能家居產品面世。LG 就準備在即將舉行的 CES 中,展示最新的 SmartThinQ Hub 智能家居中樞系統。 LG SmartThinQ Hub 顧名思義,是作為 LG 智能家居產品的中樞系統而存在,可以連接家中不同支援的電器,例如冷氣機、吸塵機、雪櫃、焗爐、洗衣機等。在 SmartThinQ Hub 上更配備有 3.5 吋的 LCD 螢幕,顯示提示和通知,用家亦可以使用智能電話 App 來得到相關的通知。 SmartThinQ Hub 將會有黑色和香檳金兩種顏色選擇,它本身內置了喇叭,可以播放網上電台和串流音樂。除此之外,LG 亦夥拍 Lowe,讓 SmartThinQ Hub 支援 Iris 系列智能家居 App 和相關服務。相信在 CES 2016 上將會有更多詳情公開。智能家居作為新興的科技產品,在明年的發展也是讓人期待。 目前 Samsung、LG、Google 和 Apple 等等在智能家居方面都可說是出盡全力去開發相關產品,在電話和平板電腦市場開始飽和的情況下,智能家居產品對他們來說就是兵家必爭之地。不過對於消費者來說,在經濟環境未完全恢復的情況下,是否願意花費更多的金錢去購入支援智能系統的電器,就是另一個問題。相信要等待主流電器品牌都在產品上預先內置智能家居服務,配合容易設定的系統,才可以令智能家居普及。 來源:LG,unwire.hk

新春喜臨新濠影滙 日行百萬濠運
澳城餐飲
LifeMag Editor・2017-01-14

除舊歲,迎新禧,齊齊迎接開運新春!同慶農曆新年,以荷里活電影為主題的度假村新濠影滙即將展開連串開運及慶祝活動,與賓客一同迎接滿載幸運的新一年,祝願雞年鴻運連年。 賓客凡於2017年1月5日至2月19日新春期間登記成為新濠會會員,即可免費乘搭全球首個及亞洲最高「8」字型摩天輪「影滙之星」,寓意乘運沖天,步步高升。此外,每位乘客皆可獲得賀年祈願卡一張,可填上新歲祝願掛到許願金樹上,慶賀新年運轉,心想事成!想新的一年行運一條龍,又怎少得跟隨過年習俗在舞獅表演中輕摸獅頭,及闔家團聚在新濠影滙的食府共享一席開運意頭菜。 除了食、玩,新濠影滙為賓客帶來時尚購物體驗迎接如意雞年,大派新春福袋,送出五重禮賞,當中包括價值高達12,000元的新濠影滙購物大道購物現金券! 春節喜臨新濠影滙,盡享新春娛樂及優惠,新歲繁盛豐足: 免費乘運沖天 新春行大運!成為新濠會會員,即可免費乘搭「影滙之星」一次。成功登記成為會員將可獲贈兌換券一張,於售票處換取「影滙之星」門票。 參加者需年滿21歲。有關條款及細則適用。 願望運轉兆豐年 新春期間,所有「影滙之星」乘客可獲得賀年祈願卡一張,填上新歲祝願,隨摩天輪運轉後再掛到許願金樹上,人人心想事成! 地點︰新濠影滙三樓「影滙之星」 獅王賀歲添濠運 感受傳統過年熱鬧氣氛,與威風凜凜的獅王拍照留念,觸摸獅頭更會帶來好運。 表演日期:2016年1月28日至2月6 日(年初一至初十) 地點︰澳門時代廣場 「五福臨門福袋」購物賞 於新濠影滙購物大道購物滿指定金額即可一次獲贈五重禮賞,包括高達12,000元購物禮券! 新春賀年菜 以下食府將推出多款新春慶節賀年菜式: 碧迎居 「盤滿砵滿」 富貴鮑魚盤菜 $688 「年年有餘 」松子桂花魚 $238 「橫財就手」 髮菜花菇扣豬手 $138 東南薈 「招財進寶」 波士頓龍蝦黑毛豬火腿籠仔蒸飯 $398 「包羅萬有」 原隻鮑魚海味煲 $368 「年年有餘」 泰椒金蒜燜鱸魚 $188 麵棧 「龍馬精神」 海膽醬燒原隻龍蝦 $398 「步步高升」 鐵板燒澳洲和牛西冷 $228 「福星高照」 磯煮原隻大連鮮鮑魚 $168 正盅 「大富大貴 」 $688 御品佛跳牆 鮮蟲草花红棗風鱔蒸飯 「吉星高照」 $468 清雞湯四寶燉鮑翅 金牌臘味蒸飯 「恭喜發財」$328 猴頭菇北芪燉雞湯 原隻鮑魚鵝掌蒸飯 價格以澳門幣計算並需加收10%服務費。此推廣不能與其他優惠同時使用。 新濠影滙 「春日之旅」套票 春日入住新濠影滙,享受驚喜不斷的星級度假之旅,自選享用豐盛自助早餐或二人踏上全球首個及亞洲最高「8」字型摩天輪飽覽美景、跟隨蝙蝠俠穿梭葛咸城!精彩自主,體驗城中獨有燦爛。 只需每晚港幣1,098元起,套票包括: 明星滙明星經典客房一晚住宿 二選一:二人於「星滙餐廳」享用自助早餐 或 「沖天飛馳套票」兩張 免費使用戶外游泳池及明星滙健身中心 港幣100元娛樂消費券 免費無線上網 有關條款及細則適用。 踏入農曆新年,新濠影滙宣佈為其多個「全球唯一」娛樂項目推出最新之開放時間表,包括全球首個及亞洲最高「8」字型摩天輪 ndash; 「影滙之星」、以蝙蝠俠為主題的4D數碼遊樂設施 「蝙蝠俠夜神飛馳」、世紀滙師的魅幻奇程 「魔幻間」、以及雲集華納兄弟與DC漫畫英雄,《樂一通》及《漢娜巴伯拉》等角色人物的主題樂園 「華納滿FUN童樂園」等。 有關各個娛樂項目最新之開放時間,請參閱下表: 影滙之星 2017年1月1日 2017年1月8日 2017年1月14日 2017年5月13日 2017年5月20日 2017年5月24日 2017年6月13日 2017年9月3日 2017年9月26日 2017年11月12日 2017年11月18日 2017年11月26日 2017年12月19日 2017年12月31日 魔幻間 2017年1月1日 2017年2月19日 2017年2月25日 2017年5月21日 2017年5月27日 2017年9月3日 2017年9月9日 2017年11月5日 2017年11月11日 2017年12月31日 蝙蝠俠夜神飛馳 2017年1月1日 2017年5月7日 2017年5月13日 2017年12月31日 華納滿FUN童樂園 則全年無休。 為確保旅客繼續獲得最優質卓越的服務,各個娛樂項目將於不對外開放的期間進行優化。有關詳情及最新資訊,請瀏覽httpwww.studiocitymacau.comtc.

以後讚人聰明醒目可以話「你仲醒目過隻烏鴉喎!」
環保自然
Chrysalids 少爺・2017-07-16

人類自古就知道烏鴉非常聰明,而美國科學期刊《科學(Science)》13日刊登了一項新論文,指出烏鴉能擬定未來計畫、懂得自制與以物易物,與人類與猩猩擁有同樣的能力。 綜合外媒報導,科學家以大型的渡鴉作為實驗對象,科學家先在一個箱子裡放入食物獎勵,再訓練烏鴉用工具打開箱子。接著科學家在旁邊放了各式各樣的工具來混淆烏鴉,結果大部分的烏鴉都選擇了正確的道具,成功率高達86%。 接著,科學家將實驗複雜化,先讓烏鴉知道箱子裡有較高級的獎勵,接著將箱子取走,地上除了各式各樣的工具外,還放有不太理想的食物,結果烏鴉選擇不管地上的食物,而是叼著工具等待箱子出現。 最後科學家再訓練烏鴉以藍色的瓶蓋來交換食物,發現烏鴉可以理解這種「兌換券」的使用方式,這種以物易物的能力甚至還高於猩猩。這次研究發現,烏鴉除了懂得利用工具,甚至懂得擬定計畫、以物易物,甚至會為了更好的報酬來放棄眼前的獎賞,展現出高超的自制能力。至於烏鴉為什麼能發展出這種能力,至今仍是個謎。 以上文章轉載自網路,所有版權歸原作者所有 原文地址:httpnews.ltn.com.twnewsworld ========================== 小時候,筆者曾經讀過一本書都有提及過, 烏鴉點樣利用石頭將水位升高, 從而去飲樽裹面嘅水。 如果以後想讚人地醒目, 可以話「你仲醒目過隻烏鴉喎!」

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