1. 啤酒的系列
世濤啤酒推薦
入門款推薦(5款):迷失海岸黑八世濤、迷失海岸花生醬牛奶世濤、釀酒狗燕麥牛奶世濤、常陸野貓頭鷹咖啡、巨石極權主義濃縮咖啡俄羅斯帝國世濤
進階款推薦(10款):打嗝海貍世濤啤酒、左手牛奶世濤啤酒(氮氣版)、帝磨欄風車地獄與詛咒、岬角花生醬海上雄風帝國波特啤酒、珀亞拉 椰子爆竹 帝國世濤、創始者早餐燕麥世濤、邪惡雙胞胎 意式咖啡世濤、天神豆蔻年華 可可香草世濤、天神彌天大罪 帝國世濤、打嗝海貍 太空之味牛奶世濤
深入款推薦(5款):珀亞拉黑夜過雪莉桶、奧斯卡藍調 /雪茄城 班布雅娜 帝國世濤、岬角海威斯特過桶海上雄風、創始者 肯塔基KBS、角頭鯊 黑色錫拉庫薩帝國世濤
頂 級款推薦(8款):艾爾史密斯賽道、普萊瑞炸彈辣椒橡木桶、普萊瑞布朗尼八爪魚帝國世濤、邪惡雙胞胎 皇家婚禮蛋糕 帝國波特、角頭鯊世界世濤啤酒、偉大理念雙倍堆疊 帝國世濤、巴克斯頓/歐米尼珀羅 膽小鬼圣代 帝國世濤、巴克斯頓 / 歐米尼珀羅 膽小鬼花生醬餅干 帝國世濤
能舔一口就好款(3款):樹屋星塵帝國世濤、樹屋雙倍濃縮帝國世濤、安克雷奇 時不我待 帝國世濤
2. 啤酒的系列英文怎么寫
啤酒上的p和e的意思
°P
°P常用于啤酒,是“plato”的縮寫,翻譯過來就是柏拉圖度。是麥芽汁中的固形物與麥芽汁的質量百分比,因此對啤酒而言°P表示原麥汁濃度,而非酒精度數。
“原麥汁濃度”也是鑒定啤酒的一個硬性參考指標:一般來說,麥芽汁濃度越高,營養價值就越好,同時酒味也會愈發醇厚柔和,保質期也更長。
e
有些酒在容量單位后,有一個“e”的標志,很多愛好者不知道是什么意思。其實,“e”代表英文“ estimate”,即“大約”的意思,是歐盟產品中的一種標志。它標示著容量是一個估計值,并不是絕對量,還是會存在誤差的可能性,和是否為假酒,沒有直接聯系。
3. 啤酒的系列英文
啤酒別稱:
1.馬尿,因顏色與形態相似。淡黃色液體,有氣泡。喝多了天大地大我最大。誰也不服。多用于夫妻之間因男人喝醉后吵架用詞匯。列:妻子說喝了幾杯馬尿就不知道天高地厚,不知道自己幾斤幾兩。
2.慫人樂,因酒精度數較低,對于酒量不好的人事帶來了福音。但也相應的增加了酒桌上的談資。酒局開場時,先聲明今天誰也不能喝慫人樂,誰喝誰買單。再有相互敬酒時,你的慫人樂干了,我白酒隨意。從而給酒場帶來些許快樂。
4. 啤酒的系列名字
三個字的啤酒有:
1、嘉士伯啤酒:
嘉士伯啤酒由丹麥啤酒巨人CARLSBERG公司出品。CARLSBERG公司是僅次于荷蘭喜力啤酒公司的國際性啤酒生產商,1847年創立,至今已有160多年的歷史,在40多個國家都有生產基地,遠銷世界140多個國家和地區,產品風行全球。
2、科羅娜啤酒:
科羅娜啤酒以其獨特的口味成為世界上銷量第一的墨西哥啤酒,美國進口啤酒排行第一名,由莫德羅啤酒公司生產。莫德羅啤酒公司位于墨西哥,創建于1925年,在當地有八家酒廠,年產量達到4100萬噸,在本國的市場占有率達60%以上。
3、金龍泉啤酒:
金龍泉啤酒是金龍泉啤酒集團的主導產品,是金龍泉員工長期精心培育的品牌。金龍泉啤酒集團與中國武漢大學緊密攜手,并成為其科研試驗基地,不斷提高金龍泉啤酒的技術含量和工藝水平,短短二十年就由一個中國啤酒行業的后起之秀變成今日之星。
4、考尼格啤酒:
考尼格啤酒是考尼格啤酒廠生產的啤酒,創始人是才多·考尼格。Konig這個啤酒品牌在1911年正式被承認。如今以每年超過2000000百升的產量供國內外啤酒愛好者品嘗。
5、哈爾濱啤酒:
哈爾濱啤酒集團有限公司創建于1900年,是中國最早的啤酒制造商,其生產的哈爾濱啤酒是中國最早的啤酒品牌,至今仍風行于中國各地。
5. 啤酒的系列海報
走訪了不少白酒企業,與各企業老總交流后發現,他們多熱衷于外聘專家進行理念培訓,可是,意想不到的是,理念培訓得越多,現實操作卻越來越拿不定主意!看似眼界開闊了,思想進步了,卻反而受到了這些不著實際的營銷理念的羈絆。那些半生不熟不明真意或者看似先進卻根本無法細化實施的營銷理念,最終成了企業發展的絆腳石!
作為深扎在白酒企業幫助企業進行一線實踐的營銷人,長期進行營銷經驗的實際應用與推廣,并在此匯總出白酒業十大營銷理念,以供白酒企業主或經銷商參考與應用。
一、“深度分銷”,可最大限度解決竄貨等渠道管理問題
竄貨問題是白酒業每個企業都高度關注卻仍難以解決的“老大難”問題。只要到白酒企業,業務系統最頭痛的肯定是竄貨問題。可是,在食品飲料啤酒等快速消費品企業,卻有越來越多的企業在這個方面得到很大的改善甚至可以說已基本杜絕了此現象!總結多家企業經驗發現,能解決這個問題的倒不是管理辦法,而是他們都進行了營銷模式的調整!
當然,解決竄貨首推直銷模式,去掉中間環節,所有過程完全可控,其他經銷商的貨自然就竄不進來,但一個企業要實施直銷,成本高、管理難度大,何其難!
其實,深度分銷不妨一試!
深度分銷在以下幾個方面進行了控制,因而杜絕了一些竄貨產生的條件:
1、終端建議零售價的價格管控
2、終端拜訪與督導的過程管理
3、政策制定的統一性或者說基于終端的政策制定而非經銷商政策制定
都說終端導向的深度分銷是管理的深度,看來此話不假。
二、銷量達成是營銷過程管理的結果,“營銷要從過程抓起”
無論是企業自己還是經銷商,都在強調要結果。可是越是要好的結果,結果卻往往不理想,為什么?
除開團購直銷,白酒的營銷主渠道就是餐館、超市、小賣部。小湖涂仙、金六福、豐谷等白酒企業都是弱勢或祼品牌企業打敗優勢企業的樣本,他們發現只要做好終端的陳列與生動化表現等過程,即使不要求銷量指標,都就會有成倍的銷量增長。河北有個核桃露產品,在河北河南兩省銷售三四年內就達九個億,現在成了整個糖煙酒行業推廣的樣本,靠的就是抓好營銷過程;王老吉可以說上百億的單品銷量基本是靠貼海報貼出來的,即使線上有廣告。也就是說,營銷說起來簡單,但過程卻因為不確定因素太多而需要中間管控,只有中間過程管控到位了,銷量才不會溜走到對手那里!
三、產品開發與引進,須有個“金字塔組合”
以往白酒企業或經銷商可用一支產品打天下,可是,現在的白酒企業或經銷商卻發現,銷售的產品越多,利潤越低!經營越差!這是什么原因呢?
產品銷售一定有一個產品組合或產品體系!如何沒有產品體系、無產品規劃,產品再多,銷量將不可能上去。四川有個非常知名的白酒企業,評過中國名酒,是六朵金花之一,酒質非常不錯,甚至還獲得過全國質量獎,產品開發得很多,可是有個非常可怕的現象:絕大部分產品年銷量就是百萬、千萬的水平,幾十個產品年銷量加起來不足千萬!結果,產品開發越多,消費者越迷惘越沒興趣越反感,最終連獲得過全國名酒的產品也僅落得個年銷量三四千萬的下場!
很多企業與經銷商,都步入了產品越多經營越不善的怪圈,這像極了“猴子掰玉米”的道理。其實,一個企業只要將形象產品、競爭產品、利潤產品、覆蓋率產品設置成一個金字塔,各司其職,每個產品都發揮其應有的作用,就能既開發出市場、抵御住競爭、上得了銷量、要得了利潤、塑造起形象。
每年企業或經銷商都會面對這個難解的問題,其實,解決之道卻很簡單!
四、廣告、包裝只是營銷的一部分,“營銷必須系統性、一體化”
白酒業的品牌與廣告、包裝關系特緊密,可是,品牌不只是廣告與包裝,營銷更不只是品牌形象的使用與推廣。
白酒從業人員基本都是從一線實操成長的,正因如此,市場上什么方式成功過,就會用最快速度克隆過來,而廣告、包裝都在業內有過成功史,自然就會在白酒業形成一些氣候。四川有一名酒,近十年的銷售停滯,雖廣告、包裝一直在改進、在升級,可就是銷量上不去,才發現產品體系待梳理、營銷模式老化、考核與激勵不到位、渠道沒有積極性、目標沒有細化等等營銷要素都存在著許多問題!
過度廣告與過度包裝已成了行業的普遍現象,即使有秦池這個前車之鑒。中國煙草的領導已經看到了過度包裝的弊病,已經對高檔煙的過度包裝表示關注并調整,可是白酒業的喝酒喝瓶子的現象要到幾時才會回歸到理性?營銷不系統,做再多的廣告都會打水漂啊!
五、從來沒有“一招鮮”,做銷售入門簡單,做營銷升級很難
任何企業都希望一招制勝,但一招制勝應是多資源與能力配合的結果。一招鮮只能短暫成功,對手立馬就可跟上。營銷就是連環套路,一招一式將策略實施、將對手擺脫、將消費者牢牢捆住。
所以,我們放眼任何一個現在發展不錯的白酒企業,都是設定了幾年的規劃與戰略,如郎酒的“351”戰略、五糧液原來的品牌輸出戰略,通過幾年的實施,都使企業上了一級甚至是幾級臺階,從而將對手甩在后面。
對于白酒業來講,一個市場、一個產品、一種模式,應都是有個接受與提升的過程,一般需要超過一年的時間。而據說帝亞吉歐考慮了一兩年才對水井坊品牌進行升級,現在的“第一坊”、“成都名片”一出臺便獲得好評,就是在營銷升級上打通了很多環節,從而一矢中的!
六、做品牌就是要體現“個性、情感甚至社會價值”,不要再只強調品質!
白酒業產品同質化嚴重,卻還是有不少企業在大談或僅談自己的產品品質如何好。郞酒近年的發跡成長給中國白酒業一個最好的提示:“醬香典范紅花郞”遠不如“神采飛揚中國郎”提得多叫得響!
湖南衛視的躍起成了打造情感產品最好案例,全國幾十家衛視為何獨湖南衛視脫穎而出,因為湖南衛視不靠說自己的節目好取勝,只說“快樂”:“快樂中國”、“快樂出發”,為了快樂定位,連原來的苦巴巴的“真情”節目都砍掉了。白酒與衛視其實一樣,都是精神產品,如果不打造情感,還可能打造什么?
國酒、國窖、國宴、國緣等概念現在雖然差不多用濫了,但從打造品牌來講,體現了國人對某些事物、歷史、文化的情感之外,上升到了社會層次,擺脫了只說產品質量的最低級品牌打造階段,仍不失為白酒業的一種進步。只是,如何尋找更具情感表達的主題,成了白酒業品牌打造的另一道檻。
七、白酒業的執行力來自于目標細化分解與過程跟蹤
聽到過太多白酒企業今天十億、明年十五億后年三十億之類的豪言,卻也發現不少白酒企業只聽雷聲不見下雨,僅是一種美好愿望。浙江商源將一個一個終端店服務好,對運作進行精細化管理,將一個無太深文化、無絕質水源、無頂尖技術、好像不太可能做起來的伊力特都賣得風生水起,并且作為一個經銷商的銷量能輕松實現年度近三十億的業績!這不能不讓某些白酒企業感到羞愧!
很多白酒企業不信管理,認為只要策略對就行。這相對來說可能也不錯。在企業的初始階段甚至在高速發展的局部階段,都可將策略擺在第一位。可是,策略是需要人去執行的,人如果不進行管理,執行力打折扣,策略最終效果肯定更打折扣!
八、白酒業的企業文化要明確“全民營銷”
企業文化是籠聚員工思想統一的重要手段。通過目標管理來引導員工行動,通過企業文化來聚集員工思想,有了這兩條,企業管理無比輕松。
白酒企業不少是國有企業。國有企業加強團隊建設、煥發活力的較好方式就是全民營銷,將營銷這個龍頭來帶動整個企業的發展,是一條最快捷的正常道路。
白酒是一種“情感用品”,如果采取全民營銷,就會鏈接起最強大的情感紐帶。茅臺、五糧液都基本達到了一個全民營銷的狀態,所以,企業的銷售人員很少,產品卻從來不愁賣!
九、白酒業可以拒絕價格戰
相對其它行業而言,白酒業是最不需要價格戰的,因為白酒雖然競爭也非常激烈,但基本屬于“非正面碰撞”競爭,即各白酒品牌基本都有其自己的消費者群,消費者不存在很大的品牌游移性。
看看近年來多少白酒企業的產品漲價卻并未影響多大的銷量,就會明白此中道理。看看超市貨架上的產品,沒人能分得清到底哪個產品應該賣多少錢,就會知道個中奧妙。如果白酒企業或經銷商為圖銷量,就在產品價格上做文章,就得三思了。
六、做品牌就是要體現“個性、情感甚至社會價值”,不要再只強調品質!
白酒業產品同質化嚴重,卻還是有不少企業在大談或僅談自己的產品品質如何好。郞酒近年的發跡成長給中國白酒業一個最好的提示:“醬香典范紅花郞”遠不如“神采飛揚中國郎”提得多叫得響!
湖南衛視的躍起成了打造情感產品最好案例,全國幾十家衛視為何獨湖南衛視脫穎而出,因為湖南衛視不靠說自己的節目好取勝,只說“快樂”:“快樂中國”、“快樂出發”,為了快樂定位,連原來的苦巴巴的“真情”節目都砍掉了。白酒與衛視其實一樣,都是精神產品,如果不打造情感,還可能打造什么?
國酒、國窖、國宴、國緣等概念現在雖然差不多用濫了,但從打造品牌來講,體現了國人對某些事物、歷史、文化的情感之外,上升到了社會層次,擺脫了只說產品質量的最低級品牌打造階段,仍不失為白酒業的一種進步。只是,如何尋找更具情感表達的主題,成了白酒業品牌打造的另一道檻。
七、白酒業的執行力來自于目標細化分解與過程跟蹤
聽到過太多白酒企業今天十億、明年十五億后年三十億之類的豪言,卻也發現不少白酒企業只聽雷聲不見下雨,僅是一種美好愿望。浙江商源將一個一個終端店服務好,對運作進行精細化管理,將一個無太深文化、無絕質水源、無頂尖技術、好像不太可能做起來的伊力特都賣得風生水起,并且作為一個經銷商的銷量能輕松實現年度近三十億的業績!這不能不讓某些白酒企業感到羞愧!
很多白酒企業不信管理,認為只要策略對就行。這相對來說可能也不錯。在企業的初始階段甚至在高速發展的局部階段,都可將策略擺在第一位。可是,策略是需要人去執行的,人如果不進行管理,執行力打折扣,策略最終效果肯定更打折扣!
八、白酒業的企業文化要明確“全民營銷”
企業文化是籠聚員工思想統一的重要手段。通過目標管理來引導員工行動,通過企業文化來聚集員工思想,有了這兩條,企業管理無比輕松。
白酒企業不少是國有企業。國有企業加強團隊建設、煥發活力的較好方式就是全民營銷,將營銷這個龍頭來帶動整個企業的發展,是一條最快捷的正常道路。
白酒是一種“情感用品”,如果采取全民營銷,就會鏈接起最強大的情感紐帶。茅臺、五糧液都基本達到了一個全民營銷的狀態,所以,企業的銷售人員很少,產品卻從來不愁賣!
九、白酒業可以拒絕價格戰
相對其它行業而言,白酒業是最不需要價格戰的,因為白酒雖然競爭也非常激烈,但基本屬于“非正面碰撞”競爭,即各白酒品牌基本都有其自己的消費者群,消費者不存在很大的品牌游移性。
看看近年來多少白酒企業的產品漲價卻并未影響多大的銷量,就會明白此中道理。看看超市貨架上的產品,沒人能分得清到底哪個產品應該賣多少錢,就會知道個中奧妙。如果白酒企業或經銷商為圖銷量,就在產品價格上做文章,就得三思了。
六、做品牌就是要體現“個性、情感甚至社會價值”,不要再只強調品質!
白酒業產品同質化嚴重,卻還是有不少企業在大談或僅談自己的產品品質如何好。郞酒近年的發跡成長給中國白酒業一個最好的提示:“醬香典范紅花郞”遠不如“神采飛揚中國郎”提得多叫得響!
湖南衛視的躍起成了打造情感產品最好案例,全國幾十家衛視為何獨湖南衛視脫穎而出,因為湖南衛視不靠說自己的節目好取勝,只說“快樂”:“快樂中國”、“快樂出發”,為了快樂定位,連原來的苦巴巴的“真情”節目都砍掉了。白酒與衛視其實一樣,都是精神產品,如果不打造情感,還可能打造什么?
國酒、國窖、國宴、國緣等概念現在雖然差不多用濫了,但從打造品牌來講,體現了國人對某些事物、歷史、文化的情感之外,上升到了社會層次,擺脫了只說產品質量的最低級品牌打造階段,仍不失為白酒業的一種進步。只是,如何尋找更具情感表達的主題,成了白酒業品牌打造的另一道檻。
七、白酒業的執行力來自于目標細化分解與過程跟蹤
聽到過太多白酒企業今天十億、明年十五億后年三十億之類的豪言,卻也發現不少白酒企業只聽雷聲不見下雨,僅是一種美好愿望。浙江商源將一個一個終端店服務好,對運作進行精細化管理,將一個無太深文化、無絕質水源、無頂尖技術、好像不太可能做起來的伊力特都賣得風生水起,并且作為一個經銷商的銷量能輕松實現年度近三十億的業績!這不能不讓某些白酒企業感到羞愧!
很多白酒企業不信管理,認為只要策略對就行。這相對來說可能也不錯。在企業的初始階段甚至在高速發展的局部階段,都可將策略擺在第一位。可是,策略是需要人去執行的,人如果不進行管理,執行力打折扣,策略最終效果肯定更打折扣!
八、白酒業的企業文化要明確“全民營銷”
企業文化是籠聚員工思想統一的重要手段。通過目標管理來引導員工行動,通過企業文化來聚集員工思想,有了這兩條,企業管理無比輕松。
白酒企業不少是國有企業。國有企業加強團隊建設、煥發活力的較好方式就是全民營銷,將營銷這個龍頭來帶動整個企業的發展,是一條最快捷的正常道路。
白酒是一種“情感用品”,如果采取全民營銷,就會鏈接起最強大的情感紐帶。茅臺、五糧液都基本達到了一個全民營銷的狀態,所以,企業的銷售人員很少,產品卻從來不愁賣!
九、白酒業可以拒絕價格戰
相對其它行業而言,白酒業是最不需要價格戰的,因為白酒雖然競爭也非常激烈,但基本屬于“非正面碰撞”競爭,即各白酒品牌基本都有其自己的消費者群,消費者不存在很大的品牌游移性。
看看近年來多少白酒企業的產品漲價卻并未影響多大的銷量,就會明白此中道理。看看超市貨架上的產品,沒人能分得清到底哪個產品應該賣多少錢,就會知道個中奧妙。如果白酒企業或經銷商為圖銷量,就在產品價格上做文章,就得三思了。
十、營銷即創新
營銷即創新,營銷就是賣不同。雖然白酒業也有不少企業是通過模仿、抄襲也能發展,也可能就活得很好了。
小糊涂仙的終端突破方式開了中國白酒業營銷的先河,五糧液通過品牌輸出迅速發展壯大,金六福用“福”來演繹品牌內涵,舍得酒打文化牌獨辟生存空間,洋河獨創藍色經典曾遭無數人反對現在賣得風生水起。。。。這些,無不是“營銷即創新”的最好演繹。
中國白酒業由于并無太多束縛,應是一片好的創新土壤。“營銷即創新”,有了對營銷如此深刻的理解,中國的白酒業更能一飛沖天!
6. 啤酒的系列圖片
現在市面上能見到的青島啤酒較常見的有:奧古特啤酒,純生啤酒,極品白金裝啤酒,綠色裝啤酒,冰醇啤酒(以上各種都有兩到三種不同規格包裝,不同包裝有些也有區別),逸品純生啤酒,棕金裝啤酒,黑啤酒。
還有一些不常見的如:假日紅色裝啤酒,紅色裝冰醇啤酒,另一種綠色裝啤酒,各種出口裝啤酒等,品種過多,不一一贅述。這些可能只能從青島本地見到。
擴展資料:
青島啤酒產自青島啤酒股份有限公司,公司的前身是國營青島啤酒廠,1903年由英、德兩國商人合資開辦,是最早的啤酒生產企業之一。2008年北京奧運會官方贊助商,躋身世界品牌500強。
青島啤酒選用優質大麥、大米、上等啤酒花和軟硬適度、潔凈甘美的嶗山礦泉水為原料釀制而成。原麥汁濃度為十二度,酒精含量3.5-4%。酒液清澈透明、呈淡黃色,泡沫清白、細膩而持久。
7. 啤酒的系列產品
啤酒是在二十世紀初傳入我國,屬外來酒種。啤酒是人們根據英語“Beer”的字頭發音,譯成中文“啤”,稱其為“啤酒”,沿用至今。 啤酒以大麥芽﹑酒花﹑水為主要原料﹐經酵母發酵作用釀制而成的飽含二氧化碳的低酒精度酒。
現在國際上的工業啤酒大部分均添加輔助原料。有的國家規定輔助原料的用量總計不超過麥芽用量的50%。但在德國﹐除制造出口啤酒外﹐國內銷售啤酒一概不使用輔助原料。國際上工業啤酒常用的輔助原料為﹕玉米﹑大米﹑大麥﹑小麥﹑淀粉﹑糖漿和糖類物質等。
一、按顏色劃分
(一)淡色啤酒。俗稱黃啤酒,根據其顏色的深淺不同,又將淡色啤酒分為三類:
1.淡黃色啤酒。酒液呈淡黃色,香氣突出,口味淡雅,清亮透明。
2.金黃色啤酒。呈金黃色,口味清爽,香氣突出。
3.棕黃色啤酒。酒液大多是褐黃、草黃,口味稍苦,略帶焦香。
(二)濃色啤酒。色澤呈棕紅或褐色,原料為特殊麥牙,口味醇厚,苦味較小。
(三)黑色啤酒。酒液呈深棕紅色,大多數紅里透黑,故稱黑色啤酒。
二、按麥汁濃度劃分
⒈低濃度啤酒。原麥汁濃度為7%~8%,酒精含量在2%左右。
⒉中濃度啤酒。原麥汁濃度為11%~12%,酒精含量在3.1%~3.8%左右,是中國各大型工業啤酒主要產品。
⒊高濃度啤酒。原麥汁濃度為14%~20%,酒精含量在4.9%~5.6%左右,屬于高級啤酒,例如近年來興起的精釀啤酒。
三、按是否經過殺菌處理劃分
⒈鮮啤酒。又稱生啤,是指在生產中未經巴士殺菌的啤酒,但也屬于可以飲用的衛生標準之內。此酒口味鮮美,有較高的營養價值,但酒齡短,適于當地銷售。
⒉熟啤酒。經過殺菌的啤酒,可防止酵母繼續發酵和受微生物的影響,酒齡長,穩定性強,適于遠銷,但口味稍差,酒液顏色變深。
四、按傳統的風味劃分
⒈白啤酒或稱麥酒(Ale)。
白啤酒主要產于英國,它是用麥芽和酒花釀制而成的飲料。采用頂部高溫發酵法,酒液呈蒼白色,具酸味和煙熏麥芽香,酒精含量為4.5%,麥芽濃度為5%~5.5%。飲時需稍加食鹽,為歐洲人所喜愛。
⒉黃啤酒(Beer)。
它是市場上銷售最多的一種啤酒,呈淡黃色,味清苦,爽口、細致。目前世界上公認12°(指麥芽濃度)以上的啤酒為高級啤酒,酒精含量一般在3.5%左右。
⒊熟啤酒或稱拉格(Lager)。
主要產于美國,采用底溫發酵法釀制,在儲存期中使酒液中的發酵物質全部耗盡,然后充入大量二氧化碳氣裝瓶,它是一種徹底發酵的啤酒。
⒋烈啤酒或稱世濤啤酒(Stout)。
主要產于英國和愛爾蘭。它與白啤酒風味近似。但比白啤酒強烈。此酒最大的特點是酒花用量多,酒花、麥芽香味極濃,略有煙熏味。
⒌黑啤酒或稱波特啤酒(Porter)。
它最初是倫敦腳夫喜歡喝的一種啤酒,故以英文“Porter”相稱。它使用較多的麥芽、焦麥芽,麥汁濃度高,香味濃郁,泡沫濃而稠,酒精含量4.5%,其味較烈啤酒要苦、要濃。
⒍烈黑啤酒或稱包克啤酒(Bock)。
包克啤酒陽一種用啤酒沉制作的濃質啤酒,通常比一般的啤酒黑而甜,但酒性最強。它通常是冬天制,春天喝。在美國,春天一至就是包克啤酒節,大約要持續6周。在這個節日里,人們都喝包克啤酒。
8. 啤酒的系列有哪些
目前雪花勇闖天涯系列有5種,即:雪花勇闖天涯500ML(瓶裝酒)、雪花勇闖天涯500ML(聽裝酒)、雪花勇闖天涯330ML(聽裝酒)、雪花勇闖天涯迷彩版330ML(聽裝酒)、雪花勇闖天涯330ML(小支酒)
“雪花啤酒勇闖天涯”活動是華潤雪花啤酒中國(有限)公司推出的原創性品牌推廣活動。它不僅是國內啤酒品牌大規模、廣區域的一次全國范圍的品牌推廣活動,更是雪花啤酒為回饋中國啤酒愛好者所創立的一個獨特的文化品牌。
“勇闖天涯”是華潤雪花主推的一個原創性營銷活動,從05年推出至今,已經走過15年春秋。繼探索雅魯藏布大峽谷、探秘長江源、遠征國境線,極地探索之后,2009年的“挑戰喬戈里峰”是首次由中國人組織的非專業團體挑戰活動。
以其對人跡罕至的自然地理的獨特挑戰方式和對自然環境的關注引起了業界的廣泛關注,也是雪花啤酒5年來最為艱險的一次。
“勇闖天涯”不僅有效提高了雪花的知名度和影響力,也為自己向產品品牌升級奠定了良好基礎。
9. 啤酒的系列名稱
一、二鍋頭酒清香純正、綿甜爽凈,是一種大眾型的白酒。
“二”是第二的意思。二鍋頭酒是我國釀造史上第一個以釀酒工藝命名的白酒。在蒸酒過程中掐頭、去尾、保留中段,故稱“二鍋頭”。“掐頭”指在蒸餾時,先將從蒸鍋流出的酒去掉一部分,因為這部分所含的低沸點物質乙醛、丙烯等使酒暴辣,剌激感強;“去尾”就是為了防止過多的高脂肪酸等高沸點的物質流入酒中,去掉一部分最后流出的酒。
二、花雕酒是著名的黃酒品牌。
花雕酒又稱“女兒紅”“狀元紅”。早在宋代,紹興家家會釀酒。每當一戶人家生了小孩,滿月那天就選酒數壇,請人在酒壇上刻字彩繪(通常會雕上各種花卉蟲鳥、民間故事、戲劇人物、山水亭榭等),以兆吉祥。然后泥封窖藏。待孩子長大出嫁、娶親,便將酒取出用以款待賓客。因酒壇外雕繪有各種民族風格的彩圖,故取名“花雕酒”。生女兒的美其名曰“女兒紅”,生兒子的則喜稱為“狀元紅”。
三、紹興加飯酒是指一種黃酒。
加飯酒是紹興酒的代表,是因為在生產時改變了配料的比例,增加了糯米或糯米飯的投入量而得名。
四、干紅是指用葡萄原汁制成的紅葡萄酒,干白是指用葡萄原汁制成的白葡萄酒。
“干”是英語dry的直譯,意思是沒有甜味。干酒是沒有甜味的酒的統稱,如干紅、干白。
五、劍南春
劍南春酒產于四川綿竹,而綿竹在唐代屬于劍南道(所謂“劍南”,就是劍門關之南)。劍南春酒歷史悠久,脫胎于唐代的“劍南燒春”,以地命名。
六、五糧液中
“五糧液酒”是濃香型白酒的杰出代表,以高粱、大米、糯米、小麥和玉米五種糧食為原料,經陳年老窖發酵,精心勾兌而成。
七、四川名酒全興大曲
不是產地。全興大曲源遠流長。乾隆年間,有位王姓釀酒師在成都東門外大佛寺側,開辦“福升全”(諧音“佛身全”以求大佛保佑)酒坊,門取用著名的薛濤井的井水釀酒。道光年間,福升全酒坊在城內建立新的作坊,以“福升全”的“全”字為首字,取名曰“全興成”,釀出的酒也命名為“全興酒”。
八、安徽的古井貢酒。
是實指。古井貢酒產于亳州市古井鎮(原亳縣減店集)。因此地有一口古井(系三國遺跡),水質清澈透明,對人體有益的礦物質含量極其豐富。當地人用此井水釀酒,得名“古井酒”。曹操煮酒論英雄,用的就是古井酒。到了明代萬歷年間,此酒為進貢宮廷之酒,故得名“古井貢酒”。
九、郎酒
“郎酒”之“郎”系泉名。郎酒產于四川古藺縣二郎灘鎮,當地是丘陵地帶,用以釀酒的水取自高山深谷中的一處清泉——郎泉,郎酒因此而得名。
十、陜西名酒西鳳酒。
西鳳酒原產于陜西省的鳳翔、寶雞、岐山、眉縣一帶,而以鳳翔城西柳林鎮所產最出名。自唐朝以來,鳳翔一直是西府臺所在地,故人們稱之為“西府鳳翔”。西鳳酒即由它的產地而得名。
十一、有一種啤酒叫“生啤酒”(鮮啤)
熟啤酒是經巴氏滅菌或瞬時高溫滅菌以延長保質期;而生啤酒則是通過物理方法去菌——微孔膜過濾除菌達到保質要求,由于沒有受高溫損傷,這樣就保持了啤酒的生鮮口味。
十二、雞尾酒是用幾種酒加果汁、香料等混合起來的酒,多在飲用時臨時調制。
“雞尾酒”是個外來詞(英文cocktail)。這種酒的得名,有多種說法。最權威的是國際酒吧者協會(IBA)的教科書給出的解釋:很久以前,一批英國船只開進了墨西哥的尤卡里半島的坎佩切港。經過長期海上顛簸的水手們找到了一間酒吧,喝酒聊天。酒吧臺上,一位少年酒保正用一根漂亮的雞尾形無皮樹枝調著一種混合飲料。水手們好奇地問酒保這種混合飲料的名字,酒保誤以為對方是在問他樹枝的名稱,于是答道,“考拉德·嘎窖”。這在西班牙語中是公雞尾的意思,以訛傳訛,便成了“雞尾酒”。
10. 啤酒的系列有哪些品牌
1、Budweiser百威。百威英博投資(中國)有限公司,Budweiser百威,世界知名的啤酒品牌,誕生于1876年美國,1995年進入中國市場,世界500強安海斯-布希英博集團旗下,全球領先的釀酒制造商,以其純正的口感,過硬的質量贏得消費者的青睞。
2、喜力HeineKen。喜力(中國)企業管理有限公司,1864年創立于荷蘭阿姆斯特丹,享譽國際的啤酒品牌,口感平順甘醇,不含枯澀刺激味道,世界大型的啤酒出口商。
3、Carlsberg嘉士伯。嘉士伯啤酒集團,嘉士伯啤酒(廣東)有限公司,十大品牌啤酒,創立于1847年丹麥,全球領先的啤酒集團,主要從事啤酒和軟飲料的生產與銷售,與足球的合作伙伴關系是嘉士伯引以為傲的傳統。
4、Beck`s貝克。百威英博投資(中國)有限公司,Beck`s貝克,起源于16世紀德國,其優良的釀造技術,使BECK'S品牌傳播至今,德國啤酒的代表。
5、Corona科羅娜。百威英博投資(中國)有限公司,Corona科羅娜,世界十大啤酒品牌,創立于1925年墨西哥,其獨創的瓶口插檸檬的飲法廣受歡迎,國內酒吧及較大的超市有銷售。
6、Stella Artois時代。百威英博投資(中國)有限公司,Stella Artois時代,始于1366年,比利時生產的為數不多的下發酵拉格啤酒,世界著名啤酒品牌,百威英博集團三大全球旗艦品牌之一,全球領先的釀酒制造商。
7、Krombacher科隆巴赫。北京科隆巴赫啤酒銷售有限公司,Krombacher,源自1803年德國,德國較大的私有啤酒集團公司之一,啤酒口味圓滑香甜,有特殊的啤酒花的氣味。
8、Oettinger奧丁格。深圳市奧丁格啤酒銷售有限公司,Oettinger奧丁格,始于1731年德國,德國銷量較大的啤酒品牌,德國擁有大型酒廠最多的品牌商之一。
9、TigerBeer虎牌。喜力(中國)企業管理有限公司,TigerBeer虎牌,源自1932年新加坡,亞太釀酒集團的旗艦品牌,亞洲風格與現代生活方式的象征,亞洲最佳啤酒之一。
10、Kronenbourg凱旋1664。凱旋1664,源自1644年法國,嘉士伯集團旗下,法國非常暢銷的日常啤酒,采用清新怡人的藍色鈷玻璃瓶,酒以柑橘等水果來調味,色澤清純,香甜可口,口味適合不常喝啤酒的人。
11. 啤酒的系列描述分析試驗
在軟件開發的生命周期中,每個人都對質量負有責任。理想情況下,開發人員在開發周期中,用像 Junit 和 TestNG 這樣的測試工具保證早期質量,而質量保證團隊用功能性系統測試在周期末端跟進,使用像 Selenium 這樣的工具。但是即使擁有優秀的質量保證,有些應用程序在交付的時候仍然被認為是質量低下的。為什么呢?因為它們并沒有做它們應當做的事。
在客戶、(編寫應用程序需求的)業務部門和(實現需求的)開發團隊之間的溝通錯誤,通常是摩擦的原因,有時還是開發項目徹底失敗的常見原因。幸運的是,存在一些方法可以幫助需求作者和實現者之間盡早 溝通。
FIT 化的解決方案
集成測試框架 (FIT)是一個測試平臺,可以幫助需求編寫人員和把需求變成可執行代碼的人員之間的溝通。使用 FIT,需求被做成表格模型,充當開發人員編寫的測試的數據模型。表格本身充當輸入和測試的預期輸出。
下載 FIT
集成測試框架(FIT)最初是由 Ward Cunningham 創建的,他就是 wiki 的發明人。請訪問 Cunningham 的 Web 站點了解關于 FIT 的更多知識并 免費下載它。
圖 1 顯示了用 FIT 創建的結構化模型。第一行是測試名稱,下一行的三列是與輸入(value1 和 value2)和預期結果(trend())有關的標題。
圖 1. 用 FIT 創建的結構化模型
好消息是,對于編程沒有經驗的人也能編寫這個表格。FIT 的設計目的就是讓消費者或業務團隊在開發周期中,盡早與實現他們想法的開發人員協作。創建應用程序需求的簡單表格式模型,可以讓每個人清楚地看出代碼和需求是否是一致的。
清單 1 是與圖 1 的數據模型對應的 FIT 代碼。不要太多地擔心細節 —— 只要注意代碼有多么簡單,而且代碼中沒有包含驗證邏輯(例如,斷言等)。可能還會注意到一些與表 1 中的內容匹配的變量和方法名稱;關于這方面的內容后面介紹。
清單 1. 根據 FIT 模型編寫的代碼
package test.com.acme.fit.impl;
import com.acme.sedlp.trend.Trender;
import fit.ColumnFixture;
public class TrendIndicatorextends ColumnFixture {
public double value1;
public double value2;
public String trend(){
return Trender.determineTrend(value1, value2).getName();
}
}
清單 1 中的代碼由研究上面表格并插入適當代碼的開發人員編寫。最后,把所有東西合在一起,FIT 框架讀取表 1 的數據,調用對應的代碼,并確定結果。
FIT 和 JUnit
FIT 的優美之處在于,它讓組織的消費者或業務端能夠盡早參與測試過程(例如,在開發期間)。JUnit 的力量在于編碼過程中的單元測試,而 FIT 是更高層次的測試工具,用來判斷規劃的需求實現的正確性。
例如,雖然 JUnit 擅長驗證兩個 Money 對象的合計與它們的兩個值的合計相同,但 FIT 可以驗證總的訂單價格是其中商品的價格減去任何相關折扣之后的合計。區別雖然細微,但的確重大!在 JUnit 示例中,要處理具體的對象(或者需求的實現),但是使用 FIT 時要處理的是高級的業務過程。
這很有意義,因為編寫需求的人通常不太考慮 Money 對象 —— 實際上,他們可能根本不知道這類東西的存在!但是,他們確實要考慮,當商品被添加到訂單時,總的訂單價格應當是商品的價格減去所有折扣。
FIT 和 JUnit 之間絕不是競爭關系,它們是保證代碼質量的好搭檔,正如在后面的 案例研究中將要看到的。
測試用的 FIT 表格
表格是 FIT 的核心。有幾種不同類型的表格(用于不同的業務場景),FIT 用戶可以用不同的格式編寫表格。用 HTML 編寫表格甚至用 Microsoft Excel 編寫都是可以的,如圖 2 所示:
圖 2. 用 Microsoft Excel 編寫的表格
也有可能用 Microsoft Word 這樣的工具編寫表格,然后用 HTML 格式保存,如圖 3 所示:
圖 3. 用 Microsoft Word 編寫的表格
開發人員編寫的用來執行表格數據的代碼叫作裝備(fixture)。要創建一個裝備類型,必須擴展對應的 FIT 裝備,它映射到對應的表。如前所述,不同類型的表映射到不同的業務場景。
用裝備進行裝配
最簡單的表和裝備組合,也是 FIT 中最常用的,是一個簡單的列表格,其中的列映射到預期過程的輸入和輸出。對應的裝備類型是 ColumnFixture。
如果再次查看 清單 1,將注意到 TrendIndicator 類擴展了 ColumnFixture,而且也與圖 3 對應。請注意在圖 3 中,第一行的名稱匹配完全限定名稱(test.com.acme.fit.impl.TrendIndicator)。下一行有三列。頭兩個單元格的值匹配 TrendIndicator 類的 public 實例成員(value1 和 value2),最后一個單元格的值只匹配 TrendIndicator 中的方法(trend)。
現在來看清單 1 中的 trend 方法。它返回一個 String 值。可以猜測得到,對于表中每個剩下的行,FIT 都會替換值并比較結果。在這個示例中,有三個 “數據” 行,所以 FIT 運行 TrendIndicator 裝備三次。第一次,value1 被設置成 84.0,value2 設置成 71.2。然后 FIT 調用 trend 方法,并把從方法得到的值與表中的值比較,應當是 “decreasing”。
通過這種方式,FIT 用裝備代碼測試 Trender 類,每次 FIT 執行 trend 方法時,都執行類的 determineTrend 方法。當代碼測試完成時,FIT 生成如圖 4 所示的報告:
圖 4. FIT 報告 trend 測試的結果
trend 列單元格的綠色表明測試通過(例如,FIT 設置 value1為 84.0,value2 為 71.2,調用 trend 得到返回值 “decreasing”)。
查看 FIT 運行
可以通過命令行,用 Ant 任務并通過 Maven 調用 FIT,從而簡單地把 FIT 測試插入構建過程。因為自動進行 FIT 測試,就像 JUnit 測試一樣,所以也可以定期運行它們,例如在持續集成系統中。
最簡單的命令行運行器,如清單 2 所示,是 FIT 的 FolderRunner,它接受兩個參數 —— 一個是 FIT 表格的位置,一個是結果寫入的位置。不要忘記配置類路徑!
清單 2. FIT 的命令行
%>java fit.runner.FolderRunner ./test/fit ./target/
FIT 通過插件,還可以很好地與 Maven 一起工作,如清單 3 所示。只要下載插件,運行 fit:fit命令,就 OK 了!(請參閱 參考資料 獲得 Maven 插件。)
清單 3. Maven 得到 FIT
C:/dev/proj/edoa>maven fit:fit
__ __
| // |__ _Apache__ ___
| |//| / _` / V / -_) ' / ~ intelligent projects ~
|_| |_/__,_|/_//___|_||_| v. 1.0.2
build:start:
java:prepare-filesystem:
java:compile:
[echo] Compiling to C:/dev/proj/edoa/target/classes
java:jar-resources:
test:prepare-filesystem:
test:test-resources:
test:compile:
fit:fit:
[java] 2 right, 0 wrong, 0 ignored, 0exceptions
BUILD SUCCESSFUL
Total time: 4 seconds
Finished at: Thu Feb 02 17:19:30 EST 2006
試用 FIT:案例研究
現在已經了解了 FIT 的基礎知識,我們來做一個練習。如果還沒有 下載 FIT,現在是下載它的時候了!如前所述,這個案例研究顯示出可以容易地把 FIT 和 JUnit 測試組合在一起,形成多層質量保證。
假設現在要為一個釀酒廠構建一個訂單處理系統。釀酒廠銷售各種類型的酒類,但是它們可以組織成兩大類:季節性的和全年性的。因為釀酒廠以批發方式運作,所以酒類銷售都是按桶銷售的。對于零售商來說,購買多桶酒的好處就是折扣,而具體的折扣根據購買的桶數和酒是季節性還是全年性的而不同。
麻煩的地方在于管理這些需求。例如,如果零售店購買了 50 桶季節性酒,就沒有折扣;但是如果這 50 桶不是 季節性的,那么就有 12% 的折扣。如果零售店購買100 桶季節性酒,那就有折扣,但是只有 5%。100 桶更陳的非季節性酒的折扣達到 17%。購買量達到 200 時,也有類似的規矩。
對于開發人員,像這樣的需求集可能讓人摸不著頭腦。但是請看,我們的啤酒-釀造行業分析師用 FIT 表可以很容易地描述出這個需求,如圖 5 所示:
圖 5. 我的業務需求非常清晰:
表格語義
這個表格從業務的角度來說很有意義,它確實很好地規劃出需求。但是作為開發人員,還需要對表格的語言了解更多一些,以便從表格得到值。首先,也是最重要的,表格中的初始行說明表格的名稱,它恰好與一個匹配的類對應(org.acme.store.discount.DiscountStructureFIT)。命名要求表格作者和開發人員之間的一些協調。至少,需要指定完全限定的表格名稱(也就是說,必須包含包名,因為 FIT 要動態地裝入對應的類)。
請注意表格的名稱以 FIT 結束。第一個傾向可能是用 Test結束它,但要是這么做,那么在自動環境中運行 FIT 測試和 JUnit 測試時,會與 JUnit 產生些沖突,JUnit 的類通常通過命名模式查找,所以最好避免用 Test 開始或結束 FIT 表格名稱。
下一行包含五列。每個單元格中的字符串都特意用斜體格式,這是 FIT 的要求。前面學過,單元格名稱與裝備的實例成員和方法匹配。為了更簡潔,FIT 假設任何值以括號結束的單元格是方法,任何值不以括號結束的單元格是實例成員。
特殊智能
FIT 在處理單元格的值,進行與對應裝備類的匹配時,采用智能解析。如 圖 5 所示,第二行單元格中的值是用普通的英文編寫的,例如 “number of cases”。FIT 試圖把這樣的字符串按照首字母大寫方式連接起來;例如,“number of cases” 變成 “numberOfCases”,然后 FIT 試圖找到對應的裝備類。這個原則也適用于方法 —— 如圖 5 所示,“discount price()” 變成了 “discountPrice()”。
FIT 還會智能地猜測單元格中值的具體類型。例如,在 圖 5 余下的八行中,每一列都有對應的類型,或者可以由 FIT 準確地猜出,或者要求一些定制編程。在這個示例中,圖 5 有三種不同類型。與 “number of cases” 關聯的列匹配到 int,而與 “is seasonal” 列關聯的值則匹配成 boolean。
剩下的三列,“list price per case”、“discount price()” 和 “discount amount()” 顯然代表當前值。這幾列要求定制類型,我將把它叫作 Money。有了它之后,應用程序就要求一個代表錢的對象,所以在我的 FIT 裝備中遵守少量語義就可以利用上這個對象!
FIT 語義總結
表 1 總結了命名單元格和對應的裝備實例變量之間的關系:
表 1. 單元格到裝備的關系:實例變量
單元格值對應的裝備實例變量類型list price per caselistPricePerCaseMoneynumber of casesnumberOfCasesintis seasonalisSeasonalboolean
表 2 總結了 FIT 命名單元格和對應的裝備方法之間的關系:
表 2. 單元格到裝備的關系:方法
表格單元格的值對應的裝備方法返回類型discount price()discountPriceMoneydiscount amount()discountAmountMoney
該構建了!
要為釀酒廠構建的訂單處理系統有三個主要對象:一個 PricingEngine 處理包含折扣的業務規則,一個 WholeSaleOrder 代表訂單,一個 Money 類型代表錢。
Money 類
第一個要編寫的類是 Money類,它有進行加、乘和減的方法。可以用 JUnit 測試新創建的類,如清單 14 所示:
清單 4. JUnit 的 MoneyTest 類
package org.acme.store;
import junit.framework.TestCase;
public class MoneyTest extendsTestCase {
public void testToString()throws Exception{
Money money = new Money(10.00);
Money total = money.mpy(10);
assertEquals("$100.00", total.toString());
}
public void testEquals() throwsException{
Money money = Money.parse("$10.00");
Money control = new Money(10.00);
assertEquals(control, money);
}
public void testMultiply()throws Exception{
Money money = new Money(10.00);
Money total = money.mpy(10);
Money discountAmount = total.mpy(0.05);
assertEquals("$5.00", discountAmount.toString());
}
public void testSubtract()throws Exception{
Money money = new Money(10.00);
Money total = money.mpy(10);
Money discountAmount = total.mpy(0.05);
Money discountedPrice = total.sub(discountAmount);
assertEquals("$95.00", discountedPrice.toString());
}
}
WholeSaleOrder 類
然后,定義 WholeSaleOrder 類型。這個新對象是應用程序的核心:如果 WholeSaleOrder 類型配置了桶數、每桶價格和產品類型(季節性或全年性),就可以把它交給 PricingEngine,由后者確定對應的折扣并相應地在 WholeSaleOrder 實例中配置它。
WholesaleOrder 類的定義如清單 5 所示:
清單 5. WholesaleOrder 類
package org.acme.store.discount.engine;
import org.acme.store.Money;
public class WholesaleOrder {
private int numberOfCases;
private ProductType productType;
private Money pricePerCase;
private double discount;
public double getDiscount() {
return discount;
}
public void setDiscount(doublediscount) {
this.discount = discount;
}
public Money getCalculatedPrice() {
Money totalPrice = this.pricePerCase.mpy(this.numberOfCases);
Money tmpPrice = totalPrice.mpy(this.discount);
return totalPrice.sub(tmpPrice);
}
public Money getDiscountedDifference() {
Money totalPrice = this.pricePerCase.mpy(this.numberOfCases);
returntotalPrice.sub(this.getCalculatedPrice());
}
public int getNumberOfCases() {
return numberOfCases;
}
public void setNumberOfCases(intnumberOfCases) {
this.numberOfCases = numberOfCases;
}
public voidsetProductType(ProductType productType) {
this.productType = productType;
}
public String getProductType() {
return productType.getName();
}
public voidsetPricePerCase(Money pricePerCase) {
this.pricePerCase = pricePerCase;
}
public Money getPricePerCase() {
return pricePerCase;
}
}
從清單 5 中可以看到,一旦在 WholeSaleOrder 實例中設置了折扣,就可以通過分別調用 getCalculatedPrice 和 getDiscountedDifference 方法得到折扣價格和節省的錢。
更好地測試這些方法(用 JUnit)!
定義了 Money 和 WholesaleOrder 類之后,還要編寫 JUnit 測試來驗證 getCalculatedPrice 和 getDiscountedDifference 方法的功能。測試如清單 6 所示:
清單 6. JUnit 的 WholesaleOrderTest 類
packageorg.acme.store.discount.engine.junit;
import junit.framework.TestCase;
import org.acme.store.Money;
importorg.acme.store.discount.engine.WholesaleOrder;
public class WholesaleOrderTestextends TestCase {
/*
* Test method for 'WholesaleOrder.getCalculatedPrice()'
*/
public void testGetCalculatedPrice() {
WholesaleOrder order = newWholesaleOrder();
order.setDiscount(0.05);
order.setNumberOfCases(10);
order.setPricePerCase(new Money(10.00));
assertEquals("$95.00", order.getCalculatedPrice().toString());
}
/*
* Test method for 'WholesaleOrder.getDiscountedDifference()'
*/
public void testGetDiscountedDifference() {
WholesaleOrder order = newWholesaleOrder();
order.setDiscount(0.05);
order.setNumberOfCases(10);
order.setPricePerCase(new Money(10.00));
assertEquals("$5.00", order.getDiscountedDifference().toString());
}
}
PricingEngine 類
PricingEngine 類利用業務規則引擎,在這個示例中,是 Drools(請參閱 “關于 Drools”)。PricingEngine 極為簡單,只有一個 public 方法:applyDiscount。只要傳遞進一個 WholeSaleOrder 實例,引擎就會要求 Drools 應用折扣,如清單 7 所示:
清單 7. PricingEngine 類
package org.acme.store.discount.engine;
import org.drools.RuleBase;
import org.drools.WorkingMemory;
import org.drools.io.RuleBaseLoader;
public class PricingEngine {
private static final String RULES="BusinessRules.drl";
private static RuleBase businessRules;
private static void loadRules()throws Exception{
if (businessRules==null){
businessRules = RuleBaseLoader.
loadFromUrl(PricingEngine.class.getResource(RULES));
}
}
public static voidapplyDiscount(WholesaleOrder order) throws Exception{
loadRules();
WorkingMemory workingMemory = businessRules.newWorkingMemory( );
workingMemory.assertObject(order);
workingMemory.fireAllRules();
}
}
關于 Drools
Drools 是一個為 Java? 語言度身定制的規則引擎實現。它提供可插入的語言實現,目前規則可以用 Java、Python 和 Groovy 編寫。要獲得更多信息,或者下載 Drools,請參閱 Drools 主頁。
Drools 的規則
必須在特定于 Drools 的 XML 文件中定義計算折扣的業務規則。例如,清單 8 中的代碼段就是一個規則:如果桶數大于 9,小于 50,不是季節性產品,則訂單有 5% 的折扣。
清單 8. BusinessRules.drl 文件的示例規則
<rule-setname="BusinessRulesSample"
xmlns="http://drools.org/rules"
xmlns:java="http://drools.org/semantics/java"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="http://drools.org/rules rules.xsd
http://drools.org/semantics/java java.xsd">
<rule name="1st Tier Discount">
<parameter identifier="order">
<class>WholesaleOrder</class>
</parameter>
<java:condition>order.getNumberOfCases() > 9 </java:condition>
<java:condition>order.getNumberOfCases() < 50 </java:condition>
<java:condition>order.getProductType() == "year-round"</java:condition>
<java:consequence>
order.setDiscount(0.05);
</java:consequence>
</rule>
</rule-set>
標記團隊測試
有了 PricingEngine 并定義了應用程序規則之后,可能渴望驗證所有東西都工作正確。現在問題就變成,用 JUnit 還是 FIT?為什么不兩者都用呢?通過 JUnit 測試所有組合是可能的,但是要進行許多編碼。最好是用 JUnit 測試少數幾個值,迅速地驗證代碼在工作,然后依靠 FIT 的力量運行想要的組合。請看看當我這么嘗試時發生了什么,從清單 9 開始:
清單 9. JUnit 迅速地驗證了代碼在工作
packageorg.acme.store.discount.engine.junit;
import junit.framework.TestCase;
import org.acme.store.Money;
importorg.acme.store.discount.engine.PricingEngine;
importorg.acme.store.discount.engine.ProductType;
importorg.acme.store.discount.engine.WholesaleOrder;
public class DiscountEngineTestextends TestCase {
public void testCalculateDiscount() throwsException{
WholesaleOrder order = newWholesaleOrder();
order.setNumberOfCases(20);
order.setPricePerCase(new Money(10.00));
order.setProductType(ProductType.YEAR_ROUND);
PricingEngine.applyDiscount(order);
assertEquals(0.05, order.getDiscount(), 0.0);
}
public void testCalculateDiscountNone() throws Exception{
WholesaleOrder order = newWholesaleOrder();
order.setNumberOfCases(20);
order.setPricePerCase(new Money(10.00));
order.setProductType(ProductType.SEASONAL);
PricingEngine.applyDiscount(order);
assertEquals(0.0, order.getDiscount(), 0.0);
}
}
還沒用 FIT?那就用 FIT!
在 圖 5 的 FIT 表格中有八行數據值。可能已經在 清單 7 中編寫了前兩行的 JUnit 代碼,但是真的想編寫整個測試嗎?編寫全部八行的測試或者在客戶添加新規則時再添加新的測試,需要巨大的耐心。好消息就是,現在有了更容易的方法。不過,不是忽略測試 —— 而是用 FIT!
FIT 對于測試業務規則或涉及組合值的內容來說非常漂亮。更好的是,其他人可以完成在表格中定義這些組合的工作。但是,在為表格創建 FIT 裝備之前,需要給 Money 類添加一個特殊方法。因為需要在 FIT 表格中代表當前貨幣值(例如,像 $100.00 這樣的值),需要一種方法讓 FIT 能夠認識 Money 的實例。做這件事需要兩步:首先,必須把 static parse 方法添加到定制數據類型,如清單 10 所示:
清單 10. 添加 parse 方法到 Money 類
public static Money parse(String value){
return newMoney(Double.parseDouble(StringUtils.remove(value, '
Money 類的 parse 方法接受一個 String 值(例如,FIT 從表格中取出的值)并返回配置正確的 Money 實例。在這個示例中,$ 字符被刪除,剩下的 String 被轉變成 double,這與 Money 中現有的構造函數匹配。
不要忘記向 MoneyTest 類添加一些測試來來驗證新添加的 parse 方法按預期要求工作。兩個新測試如清單 11 所示:
清單 11. 測試 Money 類的 parse 方法
public void testParse() throwsException{
Money money = Money.parse("$10.00");
assertEquals("$10.00", money.toString());
}
public void testEquals() throwsException{
Money money = Money.parse("$10.00");
Money control = new Money(10.00);
assertEquals(control, money);
}
編寫 FIT 裝備
現在可以編寫第一個 FIT 裝備了。實例成員和方法已經在表 1 和表 2 中列出,所以只需要把事情串在一起,添加一兩個方法來處理定制類型:Money。為了在裝備中處理特定類型,還需要添加另一個 parse 方法。這個方法的簽名與前一個略有不同:這個方法是個對 Fixture 類進行覆蓋的實例方法,這個類是 ColumnFixture 的雙親。
請注意在清單 12 中,DiscountStructureFIT 的 parse方法如何比較 class 類型。如果存在匹配,就調用 Money 的定制 parse 方法;否則,就調用父類(Fixture)的 parse 版本。
清單 12 中剩下的代碼是很簡單的。對于圖 5 所示的 FIT 表格中的每個數據行,都設置值并調用方法,然后 FIT 驗證結果!例如,在 FIT 測試的第一次運行中,DiscountStructureFIT 的 listPricePerCase 被設為 $10.00,numberOfCases 設為 10,isSeasonal 為 true。然后執行 DiscountStructureFIT 的 discountPrice,返回的值與 $100.00 比較,然后執行 discountAmount,返回的值與 $0.00 比較。
清單 12. 用 FIT 進行的折扣測試
package org.acme.store.discount;
import org.acme.store.Money;
importorg.acme.store.discount.engine.PricingEngine;
importorg.acme.store.discount.engine.ProductType;
importorg.acme.store.discount.engine.WholesaleOrder;
import fit.ColumnFixture;
public class DiscountStructureFITextends ColumnFixture {
public Money listPricePerCase;
public int numberOfCases;
public boolean isSeasonal;
public Money discountPrice() throwsException {
WholesaleOrder order = this.doOrderCalculation();
return order.getCalculatedPrice();
}
public Money discountAmount() throwsException {
WholesaleOrder order = this.doOrderCalculation();
return order.getDiscountedDifference();
}
/**
* required by FIT for specific types
*/
public Object parse(String value, Classtype) throws Exception {
if (type == Money.class) {
return Money.parse(value);
} else {
return super.parse(value, type);
}
}
private WholesaleOrderdoOrderCalculation() throws Exception {
WholesaleOrder order = newWholesaleOrder();
order.setNumberOfCases(numberOfCases);
order.setPricePerCase(listPricePerCase);
if (isSeasonal) {
order.setProductType(ProductType.SEASONAL);
} else {
order.setProductType(ProductType.YEAR_ROUND);
}
PricingEngine.applyDiscount(order);
return order;
}
}
現在,比較 清單 9 的 JUnit 測試用例和清單 12。是不是清單 12 更有效率?當然可以 用 JUnit 編寫所有必需的測試,但是 FIT 可以讓工作容易得多!如果感覺到滿意(應當是滿意的!),可以運行構建,調用 FIT 運行器生成如圖 6 所示的結果: