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