偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

什么TDD,讓它見(jiàn)鬼去吧!

開(kāi)發(fā) 開(kāi)發(fā)工具
張大胖是個(gè)積極進(jìn)取的程序員, 在日常工作之余,他還學(xué)習(xí)單元測(cè)試,重構(gòu)等編程實(shí)踐。這一天晚上他看到微信群里在激烈地爭(zhēng)論一個(gè)叫TDD的東西,不由地來(lái)了興致,上網(wǎng)搜索了一下。

 張大胖是個(gè)積極進(jìn)取的程序員, 在日常工作之余,他還學(xué)習(xí)單元測(cè)試,重構(gòu)等編程實(shí)踐。

這一天晚上他看到微信群里在激烈地爭(zhēng)論一個(gè)叫TDD的東西,不由地來(lái)了興致,上網(wǎng)搜索了一下。

原來(lái)TDD就是Test Driven Development(測(cè)試驅(qū)動(dòng)開(kāi)發(fā)),強(qiáng)調(diào)測(cè)試先行,小步快跑,用測(cè)試用例驅(qū)動(dòng)出程序的接口和代碼。

1

TDD步驟看起來(lái)異常簡(jiǎn)單:

1. 寫(xiě)一個(gè)失敗的測(cè)試用例

2. 寫(xiě)一點(diǎn)代碼,讓這個(gè)測(cè)試通過(guò)

3. 重構(gòu)代碼(如果需要的話),轉(zhuǎn)到第一步

 

 

[[322573]]

 

張大胖心想,這三個(gè)步驟不就是“把大象關(guān)到冰箱里”嘛,太抽象了! 一點(diǎn)兒都不實(shí)用!

他又搜了一些文章,發(fā)現(xiàn)這些文章中講的都是一些極其簡(jiǎn)單的例子,如加減法計(jì)算器,貨幣轉(zhuǎn)換等等。

比如這個(gè)計(jì)算器的例子,第一步先寫(xiě)一個(gè)簡(jiǎn)單的測(cè)試用例,用來(lái)測(cè)試兩個(gè)數(shù)字相加的行為。

  1. public class CalculatorTest { 
  2.     @Test 
  3.     public void testAdd(){ 
  4.         Calculator calculator = new Calculator(); 
  5.         int result = calculator.add(10,20); 
  6.         Assert.assertEquals(30, result); 
  7.     }    

第二步在Calculator中實(shí)現(xiàn)add方法,完成兩個(gè)數(shù)相加的邏輯,讓測(cè)試通過(guò)。

  1. public class Calculator{ 
  2.     public int add(int a, int b){ 
  3.         return a + b; 
  4.     } 

這個(gè)邏輯極其簡(jiǎn)單,就不用重構(gòu)了。直接寫(xiě)下一個(gè)測(cè)試用例, 測(cè)試兩個(gè)數(shù)字相減的行為。這樣周而復(fù)始下去,直到所有功能都完成。

張大胖撇撇嘴:這就是TDD? 太沒(méi)技術(shù)含量了,我明天就在項(xiàng)目中嘗試一把!

2

第二天,張大胖看了一下自己的任務(wù)列表,里邊有這么一個(gè)需求:

在下訂單的時(shí)候,根據(jù)訂單的金額,扣除優(yōu)惠券,按照規(guī)則給用戶增加相應(yīng)積分

張大胖看了看這個(gè)計(jì)算規(guī)則,非常簡(jiǎn)單,估計(jì)一個(gè)函數(shù)就能搞定。

好,就拿你來(lái)試一試TDD這把刀吧,看看TDD到底有沒(méi)有那么好,或者那么差。

第一步,先寫(xiě)一個(gè)失敗的測(cè)試!

張大胖心中非常清楚,這個(gè)系統(tǒng)用的是Spring,典型的Controller -> Service -> DAO。

在Controller中根本沒(méi)有邏輯,就是調(diào)用Service而已。所以直接對(duì)Service層寫(xiě)單元測(cè)試吧, 張大胖很快就定位到這個(gè)新需求相關(guān)的類, 即OrderService的submit方法。

TDD本來(lái)是要驅(qū)動(dòng)出接口的,現(xiàn)在看來(lái)不用了,已經(jīng)存在了,張大胖看了一下接口的輸入輸出:

  1. public class OrderService{ 
  2.     public String submit(String requestBody){ 
  3.         ...... 
  4.     } 

這個(gè)方法的輸入?yún)?shù)居然是一個(gè)XML字符串! 其中包含了像couponID, addressID這樣的東西。

  1. <createOrder> 
  2.     ..... 
  3.     <addressID>xxxx</addressID> 
  4.     <couponID>xxxx</couponID> 
  5.     <paymentType>xxxx</paymentType> 
  6.     ...... 
  7. </createOrder> 

返回值也是一個(gè)XML字符串, 表示成功或者失敗(以及對(duì)應(yīng)的失敗消息)。

  1. <result>     
  2.     <status>xxxx</status> 
  3.     <msg>xxxx</msg> 
  4. </result> 

這年頭還用XML做參數(shù),只能說(shuō)這是一個(gè)老應(yīng)用了!

3

按照TDD的節(jié)奏, 張大胖寫(xiě)下第一個(gè)測(cè)試用例,并且讓它失敗。

  1. public void OrderServiceTest{ 
  2.     public void testBonusPoints(){          
  3.           String requestBody= ......; 
  4.           //執(zhí)行submit方法 
  5.           String result  = orderService.submit( requestBody);            
  6.           ?? 驗(yàn)證積分, 可是怎么驗(yàn)證?? 
  7.     } 

等一下,這個(gè)測(cè)試的輸入?yún)?shù)容易構(gòu)建,但是submit方法的返回值中根本就不會(huì)包含積分信息!那怎么才能我計(jì)算出的積分是正確的?

難道讓submit方法返回積分?jǐn)?shù)據(jù)?那就修改了本來(lái)是通用的接口協(xié)議,太不像話了!

第二個(gè)問(wèn)題也很快浮現(xiàn),積分計(jì)算的邏輯很簡(jiǎn)單,但是需要訂單總金額和優(yōu)惠券這兩個(gè)信息,可是在測(cè)試用例中,這兩個(gè)信息從哪里來(lái)?

訂單總金額需要購(gòu)物車,這是在數(shù)據(jù)庫(kù)存放的,優(yōu)惠券ID在submit方法的參數(shù)中,詳情也在數(shù)據(jù)庫(kù)中。

積分的計(jì)算這么簡(jiǎn)單,難道我還得先在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)購(gòu)物車和優(yōu)惠券,然后通過(guò)ShopCartService和CouponService從數(shù)據(jù)庫(kù)讀出來(lái)?這也太變態(tài)了吧?

不,單元測(cè)試一定要避開(kāi)數(shù)據(jù)庫(kù),必須得用Mock的方式吧,張大胖知道一個(gè)Mock框架叫Mockito,挺好用的,就用它了。

張大胖又瀏覽了一下OrderService.submit這個(gè)長(zhǎng)達(dá)2000多行的函數(shù),這一看不打緊,張大胖發(fā)現(xiàn)這個(gè)函數(shù)依賴了另外七八個(gè)Service: UserService, ShopCartService, CouponService ......

這幾個(gè)Service有的嚴(yán)重依賴數(shù)據(jù)庫(kù), 有的嚴(yán)重依賴Http ,有的依賴消息隊(duì)列。

也就是說(shuō)要想讓submit方法順利執(zhí)行,必須得把這七八個(gè)Service都Mock出來(lái),讓它們能協(xié)調(diào)工作,例如:

給一個(gè)userID,就能返回一個(gè)正確的user對(duì)象。

給一個(gè)couponID,就能返回一個(gè)正確的coupon對(duì)象。

Mockito能實(shí)現(xiàn)這個(gè)功能,但是協(xié)調(diào)七八個(gè)個(gè)Service的相關(guān)對(duì)象,需要寫(xiě)出大量代碼才行!測(cè)試用例中的代碼會(huì)變得非常復(fù)雜、非常脆弱。

張大胖傻眼了 !自己連一個(gè)測(cè)試用例都寫(xiě)不出來(lái),還搞什么TDD?

4

張大胖嘆了一口氣, 放棄了寫(xiě)測(cè)試用例的想法, 在OrderService.submit方法中,找到了合適的地方,然后根據(jù)訂單金額和優(yōu)惠券信息,寫(xiě)了幾十行代碼,把積分計(jì)算了出來(lái),保存到數(shù)據(jù)庫(kù)中。

然后啟動(dòng)程序,通過(guò)界面的方式提交了幾個(gè)訂單,涵蓋了各種情況, 做了手工測(cè)試,然后檢查數(shù)據(jù)庫(kù),他高興地發(fā)現(xiàn),積分計(jì)算完全正確,這才花了不到一個(gè)小時(shí)。

什么TDD, 讓它見(jiàn)鬼去吧!

后記:

實(shí)際上真正的TDD并不是文章中那么簡(jiǎn)單的三個(gè)步驟, TDD正確的做法是根據(jù)需求先寫(xiě)粗粒度的功能測(cè)試,這些測(cè)試能驅(qū)動(dòng)出程序的接口, 然后寫(xiě)細(xì)粒度的單元測(cè)試,驅(qū)動(dòng)出細(xì)節(jié)代碼。今天這篇文章實(shí)在太長(zhǎng)了,就不展開(kāi)了,再寫(xiě)一篇文章來(lái)講吧。

理解了TDD的思路以后,改變思維,實(shí)施TDD并不是一件特別難的事情。

我這些年遇到的主要困難是遺留項(xiàng)目,代碼很亂,可測(cè)試性很差,想寫(xiě)出清晰良好的測(cè)試,經(jīng)常需要重構(gòu)大量代碼,這就得不償失了,說(shuō)是做TDD,其實(shí)大量的時(shí)間是在重構(gòu)代碼,開(kāi)發(fā)進(jìn)度緩慢,看不到立竿見(jiàn)影的好處,于是就放棄了。

【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)coderising獲取授權(quán)】

 

戳這里,看該作者更多好文

 

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專欄
相關(guān)推薦

2013-05-13 11:51:29

2018-06-07 09:32:07

2017-07-19 09:04:37

2011-09-15 16:18:04

Android應(yīng)用IOS應(yīng)用FatBooth

2021-12-31 18:24:45

ThreadLocal數(shù)據(jù)庫(kù)對(duì)象

2018-05-08 14:58:07

戴爾

2022-01-26 14:29:04

區(qū)塊鏈加密貨幣技術(shù)

2018-08-01 23:35:30

量子計(jì)算機(jī)芯片超算

2017-03-16 13:17:54

TDD代碼開(kāi)發(fā)

2019-05-07 08:09:08

WiFi運(yùn)營(yíng)商網(wǎng)絡(luò)

2022-11-25 09:42:53

AI技術(shù)

2017-03-16 13:28:34

TDD代碼軟件架構(gòu)

2011-05-04 11:26:47

優(yōu)化

2023-11-07 08:00:00

Kubernetes

2018-03-22 14:47:13

容器開(kāi)發(fā)人員筆記本

2015-08-17 10:50:34

2017-07-18 09:02:05

磁盤(pán)克隆軟件

2024-11-25 12:20:00

Hystrix微服務(wù)架構(gòu)

2016-06-12 09:48:40

2016-10-12 15:27:30

虛擬主機(jī)維護(hù)模式虛擬機(jī)管理器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)