精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

推行編程利器之一TDD的思考

開發 開發工具
本文內容是我在某大型團隊中推行TDD時的一些思考。如今看來,這些思考仍有現實意義。

[[186765]]

我在參與的開發項目以及咨詢項目中,都有實踐TDD的經驗。直至今日,我仍然會在某些功能開發時采用TDD的方式實現功能。雖然沒有達到將TDD溶于開發血液之中形成自然而然的習慣,但至少也是我常用的編程利器之一,偶爾使用,效果還算不錯。

以下內容則是我在某大型團隊中推行TDD時的一些思考。當時的整個咨詢過程,至少在TDD推行上可以稱得上是舉步維艱。如今看來,這些思考仍有現實意義。

1. 開發人員的質量意識

開發人員包括管理人員的軟件質量意識,常常立足于清晰可見的外部質量。評價一個開發人員的績效,很重要的一個指標就是被測試人員發現的缺陷數。

慣常的軟件開發思想,總是認為開發人員不適合做測試,因為他們總是站在自己的角度去看待問題,從而可能忽略真正需要測試的用例。這種思想給了開發人員一個錯誤信號,認為自己不應該寫測試,即使寫了測試,也寫不好。

殊不知,由開發人員編寫測試帶來的收益,最重要的一點不在于測試本身,而在于它能促進開發、測試以及需求分析人員的交流與溝通。而測試先行的方式也能讓開發者跳出實現的窠臼,而從業務角度去看待問題,從消費者角度去思考接口的設計。

倘若開發者總是憊懶地將測試職責委派給專門的測試人員,漸漸地,就會滋生一種依賴心理。測試人員的精確測試當然可以保障質量,但這種測試通常是黑盒測試,這里保障的質量主要還是外部質量。而且,這種測試帶來的反饋總是慢于開發進度,一旦發現缺陷,修復缺陷的成本也會變得更高。

軟件質量除了外部質量之外,內部質量同等重要。

軟件成本等于開發成本與維護成本之和,而維護成本的增加主要歸咎于內部質量的糟糕。

當我們讓開發人員為原有代碼編寫單元測試時,總是覺得舉步維艱,主因就在于代碼的可測試性不夠好。要測試一個類,竟然連簡單創建它的對象都變成了不可能完成的任務。在為這樣的代碼編寫單元測試時,就好像被落到了蜘蛛網中,被這些網絲牽住,纏住,如何掙扎都無法擺脫;除非,我們能夠快刀斬亂麻。然而,一旦采用這種粗暴的方式,則對于系統而言,就不是維護,而是重寫了。

測試先行的開發至少在一定程度規避了這樣的問題。因為開發人員首先要寫好測試,這就驅使開發人員必須強制地思考代碼的可測試性。而在足夠多的測試保護下,即使代碼的內部質量欠佳,要進行重構也更為簡單。

然而,這些好處都不是短期能見成效的,且團隊若不能達成共識,只靠一二人堅定地踐行TDD,在測試覆蓋率不夠的情況下,無異于杯水車薪。多數開發者在維護別人的丑陋代碼時,可能會罵聲連連,殊不知同時作為罵者自身,其實也在重復被罵者的故事。

2. 需求分析與任務分解

需求分析能力常常是開發人員的短板。開發人員養成了一個習慣,看什么事情都會從技術實現的角度去思考。要實現一個網頁,就會想到如何編寫JavaScript來響應用戶的動作,如何編寫CSS,卻很少思考用戶體驗和操作的流程。要完成一個數據分析,總會想到數據的屬性,轉換和提取數據的算法,卻不會想到分析數據的價值以及合理的流程。

對于繁瑣的需求描述,我們總是沒有耐心去深入研讀,而是在掌握了大體意思后,就開始匆匆進行開發與實現。TDD要求我們在編寫測試之前要做好合理的任務分解。若沒有很好地理解需求,任務分解就無法順利進行。

這就帶來了團隊協作的問題。

若我們能從需求的源頭進行改進,或許TDD會變得更容易。例如,對故事的拆分更合理,遵循User Story的INVEST原則,那么,要實現的Story在測試性、獨立性方面就會有更好的改觀。如果需求分析人員能夠非常明確地編寫出驗收標準(Acceptance Cretiria),任務分解也會變得更加容易。

更進一步,若需求分析人員能夠參考甚至遵循Specification By Example的方式,采用Given-When-Then的模式來描繪各個用例場景;那么,再要進行任務分解,不就變得輕而易舉嗎?所以說,推行TDD之所以非常艱難,或許***的原因是我們僅僅將目光放到了開發者身上,卻忽略了需求分析人員扮演的關鍵角色。正所謂:“問渠那得清如許,為有源頭活水來。”

我一直強調任務分解是有層次的。分析需求時,不能一個猛子就扎進繁瑣的實現細節。要從用戶價值出發,先梳理出最外層的需求任務,然后抽絲剝繭,條分縷析地層層遞進,如此方能理清思路,掌控復雜邏輯。基本上,任務分解可以分為三個層次,即業務價值——>業務功能——>業務實現。這個層次是一種“遞歸”的狀態,視需求的復雜度可以不停向下拆分。

任務分解是TDD的核心,是驅動設計和開發的重要力量,卻被很多人忽略了。不能不說是一種誤解與遺憾。

3. 測試先行的編程習慣

正所謂“江山易改本性難移”,數年養成的開發習慣不可能一朝一夕改變。這恰恰成為許多人反對TDD的借口,鑄造了一塊堅硬的用于防守的盾。

然而,以我個人經驗以及我所觀察到的情況來看,這其中固然有習慣的力量作祟,然而主因還是因為對TDD方法的掌握程度以及一些誤解導致。

前面已經述及,任務分解應該是TDD的起點。多數開發者未能形成任務分解的習慣。因此在改變為測試先行的時候,錯以為應該一上來就寫測試。因為思路沒有理清,腦子里一片亂麻,再加上本身對TDD不夠熟悉,編寫測試就變得舉步維艱,總覺得束手束腳,就好像被綁了一只手,又好像是在泥沼中掙扎。許多時候,甚至發揮不出自己哪怕三分的功力。

一貫以來,我們都在強調測試先行。這容易產生一種錯覺,就是認為TDD必須一開始就寫測試,“簡單設計”嘛,于是就沒有了設計。這讓那些習慣于事先設計的開發者更難以接受。

那么,TDD是否需要事先設計呢?Martin Fowler的文章Is Design Dead其實就是對此問題的正本清源。我個人認為,視場景而定,測試驅動開發仍可進行事先設計。

設計并不僅包含技術層面的設計如對OO思想乃至設計模式的運用,它本身還包括對需求的分析與建模。若不分析需求就開始編寫測試,就好像沒有搞清楚要去的地方,就開始快步前行,***才發現南轅北轍一般。

測試驅動開發提倡的任務分解,實際上就是一種需求的分析。如何尋找職責,以及識別職責的承擔者則可以視為建模設計。

測試驅動像是一種培養設計專注力的手段,就像冥想者通過盤腿靜坐的手段來體悟天地一樣,測試驅動可以強迫你站在測試的角度(就是使用者的角度)去思考接口,如此才能設計出表現意圖的接口。

在開始測試驅動開發之前,做適度的事先設計,還有利于我們仔細思考技術實現的解決方案。它與測試驅動接口的設計并不相悖。解決方案或許屬于實現層面,若過早思考實現,會干擾我們對接口的判斷;但完全不理會實現,又可能導致設計方向的走偏。

例如,我們要實現XML消息到Java對象的轉換。

一種解決方案是通過jaxb將消息轉換為Java對象,然后再定義轉換映射的Transformer,通過硬編碼或者反射的方式將其轉換為相關的領域對象;然后在執行了業務操作后,再將返回的結果轉換為另一個Jaxb對象。另一種解決方案則是通過引入模板,例如StringTemplate或者Velocity,定義轉換的模板,然后進行替換實現。這兩種解決方案的區別,直接影響了我們劃分任務的方式。

所以,在運用TDD時,先不要一巴掌拍死,可以先抱著開放的態度嘗試嘗試。何況,TDD并非一招鮮,吃遍天,總要有適合它的場景。例如UI的開發,交互協作的控制邏輯,數據庫開發,并發處理,都不是運用TDD的好場景。

4. 重構能力

TDD的核心是紅——綠——重構。這意味著重構是TDD非常重要的一環,它直接關系到TDD開發出來的代碼質量。沒有好的重構能力,TDD就會有缺失。若說代碼的內部質量是生命的話,重構就是靈魂,缺少了它,代碼就沒有靈性了。多數時候實施TDD,都會因為重構能力的缺乏而陷入困境。

重構的關鍵首先在于如何識別代碼的壞味道。這需要代碼閱讀的千錘百煉,而非死記硬背Martin Fowler在《重構》一書中總結的壞味道。當這些壞味道變成你的一種直覺,甚至就像與生俱來的一種能力時,你就會降低對糟糕代碼的容忍度。在你眼中,這些爛代碼就是垃圾,必須清掃,否則無法“安居”。

重構手法與代碼壞味道一一對應。若有測試保障,重構就變得安全。但盡可能地,我們還是希望運用工具提供的自動重構功能,這既提高了重構效率,也在一定程度下確保了重構的安全。

當然,重要的是要找到重構的節奏感,即小步前行,每次重構必運行測試的良好習慣。若能結合分布式版本管理系統如Git,做到原子提交,就會更加方便。即使重構出現問題,也可以快速地回到前面的版本快照。

在TDD過程中,若能結對自然是上佳選擇。當一個人在掌控鍵盤時,另一個人就可以重點關注代碼的可讀性,看看代碼是否散發出臭味。兩個人的眼睛終歸要更銳利一些,至少視野的范圍更廣泛。

及時重構是重構諸多實踐中最重要的一點。不要讓重構成為你在未來償還債務的殺手锏。越拖到后面,償還債務的成本就越高。以重構而論,如果將重構拖到***,則需要的重構能力就更強,因為程序結構會變得更復雜。當然,只要你的代碼能夠保證足夠的覆蓋率,以及較好的松散耦合,重構依舊可行。采用TDD,基本能滿足這兩條要求。但以成本而論,小步前行才是重構之道。

5. 單元測試的基礎設施

***說說單元測試的基本設施。很多時候,這可能不是問題;但很多時候,這可能會成為大問題。面對諸如測試數據準備等問題,需要認真分析,找到應對方案。

原則上,***能找到一些開源的測試框架,包括生成測試數據,模擬測試行為等。因為你遇到的問題,別人可能早已遇見過。這個世界上有很多聰明而又樂于分享的程序員,不要局限在自己公司一隅。睜大眼睛看看滿世界吧。所謂“君子生非異也,善假于物也”。好程序員,也要這樣。

 說不定,你會拋棄TDD,因為你找到了更好的適合你的做法。

【本文為51CTO專欄作者“張逸”原創稿件,轉載請聯系原作者】

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

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2021-10-30 18:38:49

Java c++反射

2020-06-09 14:30:17

編程命名代碼

2021-07-07 09:18:00

Java并發編程

2013-11-11 09:26:50

編程思考

2009-09-24 09:41:00

Scala講座Scala

2013-09-12 15:51:04

編程文化垃圾代碼移動開發

2021-06-06 16:56:49

異步編程Completable

2009-10-23 13:24:20

linux Shell

2017-03-16 13:17:54

TDD代碼開發

2013-04-18 09:29:02

編程語言編程

2015-11-24 16:59:13

2024-04-18 08:20:27

Java 8編程工具

2021-06-15 07:10:14

JavaScript異步編程

2014-03-03 09:48:55

SSHTmux

2022-10-19 11:31:49

TDD開發

2011-07-21 14:17:15

Ceylon

2014-03-07 11:32:18

2017-03-16 13:28:34

TDD代碼軟件架構

2023-06-27 08:37:35

Java反射動態代理機制
點贊
收藏

51CTO技術棧公眾號

女人抽搐喷水高潮国产精品| 久操视频在线观看| 夜久久久久久| 国产午夜精品视频免费不卡69堂| 日韩一级理论片| 欧美天天影院| 成人毛片老司机大片| 欧美在线免费看| 天堂网中文在线观看| 综合欧美亚洲| 色噜噜狠狠成人网p站| 在线精品亚洲一区二区| 黑人精品一区二区| 日韩专区欧美专区| 欧美成人激情视频| 亚洲国产欧美视频| 精品精品视频| 日本乱码高清不卡字幕| 手机看片日韩国产| 久久国产精品高清一区二区三区| 精品一区二区在线视频| 91国产高清在线| 日本裸体美女视频| 中文字幕精品影院| 欧美不卡视频一区| 午夜免费看毛片| 国产夫妻在线| 亚洲精品福利视频网站| 无码免费一区二区三区免费播放 | 成人午夜在线影视| 久久只精品国产| 成人黄色片视频网站| 亚洲综合成人av| 国产精品毛片在线看| 欧美成aaa人片在线观看蜜臀| 国产精品久久久久久久av| 国产精品毛片av| 91精品国产一区二区三区| caopor在线视频| 国产v日韩v欧美v| 亚洲一区二区三区四区在线观看 | 精品国产3级a| 在线视频日韩欧美| 欧美电影在线观看网站| 一本久道中文字幕精品亚洲嫩| 日韩黄色短视频| 天堂av中文在线| 亚洲狼人国产精品| 波多野结衣激情| 日本不卡在线| 国产精品久久久久久久久免费相片 | 久久婷婷国产91天堂综合精品| 国产乱码精品一区二三赶尸艳谈| 亚洲美女在线国产| 日韩精品第1页| 97超碰资源站在线观看| 亚洲av无码片一区二区三区| 国产suv精品一区| 91精品国产综合久久精品| 九九精品久久久| 久久精品黄色| 7777精品伊人久久久大香线蕉| 亚洲欧美国产中文| 福利一区二区免费视频| 欧美日本视频在线| 中文字幕22页| 秋霞一区二区| 精品免费99久久| 国产十八熟妇av成人一区| 清纯唯美激情亚洲| 亚洲国产精品成人精品| av在线播放网址| 国产99久久| 在线播放亚洲激情| 999精品在线视频| 综合久久亚洲| 久久人人爽人人| 成年人av网站| 美美哒免费高清在线观看视频一区二区| 国产精品视频xxxx| 国产精品久久久久久久久久久久久久久久久久| 久草在线在线精品观看| 北条麻妃高清一区| 亚洲人视频在线观看| 国产亚洲成年网址在线观看| 一本一道久久a久久综合精品| 黄av在线免费观看| 亚洲国产日韩在线一区模特| 茄子视频成人免费观看| 国产成人精品一区二区三区视频| 在线成人av影院| 欧美日韩一区二区三区四区五区六区| 天天久久夜夜| 久久精品亚洲一区| 91美女免费看| 韩国三级电影一区二区| 国产三区二区一区久久| 三区四区电影在线观看| 亚洲妇女屁股眼交7| 亚洲色图38p| 粉嫩久久久久久久极品| 国产一区二区三区视频免费| 波多野结衣不卡视频| 亚洲综合精品四区| 成人av番号网| 青青草视频在线观看| 日韩美女精品在线| 国产a级一级片| 成人久久精品| 亚洲欧美中文字幕在线一区| 日韩高清dvd碟片| 久久久777| av一区和二区| 免费看a在线观看| 色偷偷久久一区二区三区| 原创真实夫妻啪啪av| 日韩精品一区二区三区免费观看| 久久久久久久999| 一卡二卡三卡在线| 国产丝袜在线精品| 免费av手机在线观看| 国产精品白丝久久av网站| 亚洲欧美日韩天堂一区二区| 久久精品国产亚洲av香蕉| 久久99在线观看| 日韩高清dvd| 三妻四妾的电影电视剧在线观看| 91精品久久久久久蜜臀| 国产黄色录像视频| 久久九九精品| 久久久久久99| www在线看| 精品精品国产高清a毛片牛牛| 91高清免费观看| 久久国产精品区| 亚洲v欧美v另类v综合v日韩v| 美女扒开腿让男人桶爽久久软| 欧美大片在线观看一区二区| 色偷偷www8888| 美女脱光内衣内裤视频久久网站| 欧美高清一区二区| 久草在线中文最新视频| 亚洲成人精品av| 国产污视频在线看| 国产a视频精品免费观看| 黄黄视频在线观看| 亚洲一级大片| 欧美精品videossex性护士| 性一交一乱一乱一视频| 亚洲精品乱码久久久久久| 一级日本黄色片| 欧美一区亚洲| 国产高清精品一区二区| 欧美xxxx视频| 日韩免费电影网站| 日本在线视频免费观看| 99久久99久久免费精品蜜臀| 亚洲人精品午夜射精日韩 | 国产日韩精品中文字无码| 日本视频一区二区| 亚洲一区精品视频| 国产日韩欧美中文在线| 欧美丰满少妇xxxxx做受| 亚洲风情第一页| 精品久久久一区二区| 人妻体内射精一区二区| 麻豆精品一区二区三区| 亚洲一区二区三区四区中文| 国产精品视频首页| 欧美大秀在线观看| 午夜视频免费看| 在线观看一区二区视频| 五月婷六月丁香| 国产毛片精品一区| 欧美视频在线观看网站 | 91看片淫黄大片91| av综合网页| 国产成人精品综合| 国产激情在线视频| 亚洲成色777777在线观看影院| 成年人午夜视频| 国产精品热久久久久夜色精品三区| 国产亚洲视频一区| 在线国产精品一区| 欧洲在线视频一区| 成人豆花视频| 欧美在线激情网| 成人免费看片| 亚洲男人天堂网站| 国产视频一区二区三区四区五区| 亚洲成人精品影院| 亚洲综合图片一区| k8久久久一区二区三区| 亚洲色精品三区二区一区| 亚洲激情五月| 日韩精品久久一区| 成功精品影院| 国产精品美女免费视频| 福利在线导航136| 中日韩美女免费视频网站在线观看| 精品国产伦一区二区三区| 色综合久久99| 免费麻豆国产一区二区三区四区| 久久午夜老司机| 手机在线播放av| 日本亚洲欧美天堂免费| 国产黄色激情视频| 日韩理论片av| 免费久久99精品国产自| 欧一区二区三区| 国产女精品视频网站免费| 99色在线观看| 欧美另类99xxxxx| 99精品老司机免费视频| 日韩精品视频在线观看免费| 国产欧美综合视频| 欧美午夜精品电影| 日本三级视频在线| 亚洲免费色视频| 国产又粗又长免费视频| 久久免费电影网| 日本少妇xxxx| 国产高清无密码一区二区三区| 日韩大片一区二区| 香蕉久久夜色精品| 福利在线一区二区| 欧美在线国产| 特级黄色录像片| 99久久亚洲精品| 亚洲国产欧美日韩| 精品日韩在线| 日韩资源av在线| 国产不卡av一区二区| 久热国产精品视频一区二区三区| 国产一区调教| 国产一区高清视频| 懂色av一区二区| 国产 高清 精品 在线 a| 欧美一级片网址| 亚洲自拍另类欧美丝袜| 国产精品久一| 91久久精品国产91性色| 亚洲a成人v| 成人免费淫片aa视频免费| 色综合视频一区二区三区日韩| 国产精品白丝jk喷水视频一区| 都市激情综合| 国产经典一区二区| 精品无人乱码一区二区三区| 综合欧美亚洲日本| 777久久久精品一区二区三区| 国产精品va| 国产综合av在线| 亚洲在线国产日韩欧美| 99999精品视频| 久久一区视频| 青青草久久伊人| 国产一区二区在线看| 极品人妻一区二区| av在线不卡网| 国产特级黄色录像| 国产精品国产三级国产| 天天综合天天做| 香蕉影视欧美成人| 天天干,天天干| 欧美日韩亚洲丝袜制服| av高清一区二区| 午夜精品免费在线| 中文字幕在线日本| 成人久久久精品乱码一区二区三区| 久久一区二区精品| 九九综合在线| 一区二区三区精品国产| 欧美激情性爽国产精品17p| 女人帮男人橹视频播放| 久久精品观看| www.久久av.com| 成人av在线资源| 国产精品国产三级国产专业不| 国产精品久久久久影院老司| avove在线播放| 欧美日韩中文字幕| 一区二区精品视频在线观看| 日韩欧美一级二级三级久久久| 凸凹人妻人人澡人人添| 永久555www成人免费| av观看在线| 日本乱人伦a精品| 亚洲欧美一级| 久久亚洲午夜电影| 亚洲成人精选| 国产女女做受ⅹxx高潮| 国产美女一区二区三区| 亚洲蜜桃精久久久久久久久久久久| 国产精品网站在线| 国产一级做a爱免费视频| 在线日韩av片| 成人av免费播放| 国产一区二区三区欧美| 亚洲卡一卡二| 国产精品久久久久久亚洲调教| 在线精品国产亚洲| 少妇精品久久久久久久久久| 亚洲国产91| 超碰成人在线播放| 久久久久久麻豆| 国产精品99无码一区二区| 欧美午夜电影一区| 亚洲人在线观看视频| 久久777国产线看观看精品| 成人在线视频播放| 国产在线欧美日韩| 最新国产精品久久久| 手机在线免费观看毛片| 波多野结衣亚洲一区| 亚洲色婷婷一区二区三区| 欧美影院精品一区| 欧美视频1区| 欧美午夜视频| 亚洲图色中文字幕| 久久综合久久鬼色| 久久久一二三区| 在线不卡欧美精品一区二区三区| 免费a在线观看| 97视频免费在线观看| 日韩区欧美区| 三级在线免费观看| 精品一区二区三区视频在线观看| 成都免费高清电影| 日韩欧美在线观看| 婷婷综合激情网| 欧美激情亚洲综合一区| 日本在线成人| 大桥未久一区二区三区| 久久国产日韩欧美精品| 免费看黄色三级| 色94色欧美sute亚洲线路一ni| 天天综合天天综合| 久久久久免费精品国产| 在线观看视频一区二区三区| 亚洲国产一二三精品无码| 久草在线在线精品观看| 成人黄色短视频| 欧美精品久久久久久久久老牛影院| 国产黄在线看| 国产精品中文在线| 日韩在线二区| www.色就是色.com| 成人免费在线视频| 91成人一区二区三区| 久久精品视频va| 欧美午夜网站| 国产综合中文字幕| 久久先锋影音av| 国产男人搡女人免费视频| 最近2019年好看中文字幕视频| 天然素人一区二区视频| 亚洲日本精品| 国产一区在线看| 久草中文在线视频| 日韩av影视在线| 粉嫩一区二区三区| 一本久道久久综合| 国产乱码精品1区2区3区| 老妇女50岁三级| 亚洲精品在线观看网站| 黄频免费在线观看| 日本不卡一区二区三区在线观看| 青青草原综合久久大伊人精品优势| 俄罗斯毛片基地| 欧美电影精品一区二区| xxxxx性欧美特大| 欧美视频一区二区三区在线观看 | 亚洲一区二区三区sesese| 欧美精品97| 免费在线观看你懂的| 欧美视频在线一区二区三区| 精产国品自在线www| 国产乱码精品一区二区三区日韩精品 | 懂色av一区二区| 黄色一级二级三级| 日韩理论片一区二区| 色婷婷av一区二区三区之红樱桃| 欧洲中文字幕国产精品| 97在线精品| 国产人妻黑人一区二区三区| 欧美午夜电影一区| 欧美寡妇性猛交xxx免费| 蜜桃传媒一区二区| 国产一区二区看久久| 国产成人在线免费视频| 日韩一区在线视频| 欧美色图婷婷| 污污的视频免费观看| 精品福利在线观看| 久久日韩视频| 国模极品一区二区三区| 成人网18免费网站| 特大黑人巨人吊xxxx| 日韩三级.com|