精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

中文字幕在线免费不卡| 日韩二区三区四区| 亚洲精品国产精品国自产观看浪潮| 4444亚洲人成无码网在线观看| 欧美一级淫片aaaaaa| 久久精品日产第一区二区| 日韩中文字幕久久| 亚洲激情 欧美| 欧美伊人亚洲伊人色综合动图| 亚洲精品一二三区| 欧美一区1区三区3区公司| 国产日韩欧美中文字幕 | 无码熟妇人妻av在线电影| 九九在线视频| 成人小视频免费在线观看| 国产精品com| 久久精品免费在线| 久久人人99| 亚洲精品在线视频| 日本一区二区免费视频| 久草综合在线| 91久久免费观看| 亚洲一区二区三区av无码| 91精品大全| 久久女同性恋中文字幕| 成人18视频| 国产精品久久久久久久免费看| 久久精品人人| 2019亚洲日韩新视频| 婷婷色中文字幕| 日韩精品久久| 亚洲女人被黑人巨大进入| 黑人玩弄人妻一区二区三区| 国产一区二区三区国产精品| 欧美调教femdomvk| 99热成人精品热久久66| 嗯啊主人调教在线播放视频| 一区二区在线观看免费视频播放| 午夜视频久久久| 免费动漫网站在线观看| 91蜜桃视频在线| 狠狠久久综合婷婷不卡| 国产 欧美 自拍| 国产成人免费视频一区| 97操在线视频| www.97超碰| 国产凹凸在线观看一区二区| 91网站在线免费观看| 一级特黄色大片| 久久国产精品第一页| 国产精品偷伦视频免费观看国产| 黄色网址中文字幕| 老司机精品久久| 国产精品69久久| 久草热在线观看| 美女久久久精品| 国产精品一区二区三区在线播放| 免费黄色片视频| 麻豆精品一区二区综合av| 国产精品亚洲自拍| 国产精品自拍电影| 国产精品自拍一区| 国产精品成人观看视频免费| 蜜桃视频久久一区免费观看入口| 成人av网站在线观看| 精品久久久久久综合日本| 欧美亚洲日本| 国产精品网友自拍| 懂色av一区二区三区四区五区| 国产在线激情| 亚洲一区在线看| 成人羞羞国产免费网站| 成人免费一区| 欧美一卡二卡三卡四卡| www.四虎在线| 国产精品羞羞答答在线观看 | 欧美激情aaa| 日韩精品一区二区三区免费观看| 久久精品2019中文字幕| 久久国产在线视频| 欧美亚洲三区| 成人免费在线视频网址| 亚洲黄色a级片| 久久久久99精品一区| 伊人久久婷婷色综合98网| 人人超在线公开视频| 黑人巨大精品欧美一区二区一视频| 欧美污视频网站| av在线精品| 日韩高清欧美高清| eeuss中文字幕| 一区免费在线| 国产精品久久久久99| 国产精品无码久久久久成人app| 国产成人综合亚洲网站| 欧美伦理一区二区| 成人在线视频亚洲| 欧美色播在线播放| 手机看片国产精品| 日韩mv欧美mv国产网站| 久久亚洲一区二区三区四区五区高| 国产精品成人久久| 久久国产精品第一页| 久久免费视频1| 制服丝袜在线播放| 欧美系列亚洲系列| 亚洲国产精品无码久久久久高潮 | 成年人视频大全| 高清成人在线| 亚洲激情在线观看| 国产老头老太做爰视频| 香蕉久久久久久久av网站| 91嫩草视频在线观看| 伊人免费在线| 欧美视频中文字幕在线| 日韩高清一二三区| 久久久久久久久久久久久久久久久久| 欧美在线观看网址综合| 亚洲av无码一区二区三区dv| 国产精品入口麻豆原神| 日韩a在线播放| 精品精品国产三级a∨在线| 久久精品国产亚洲7777| 999视频在线| 91久色porny| 国产主播自拍av| 欧美电影院免费观看| 最新中文字幕亚洲| 69国产精品视频免费观看| 成人手机电影网| 精品无码av无码免费专区| 精品国产黄a∨片高清在线| 亚洲视频欧洲视频| 色av性av丰满av| 99re66热这里只有精品3直播 | 蜜臀久久精品| 亚洲精品白浆高清久久久久久| 天天干中文字幕| 国产在线精品一区二区三区不卡| 亚洲精品日韩成人| 天堂久久午夜av| 一本色道久久综合亚洲精品小说| 日韩综合在线观看| 国产亚洲一区二区三区四区| 免费高清在线观看免费| 色老板在线视频一区二区| 欧美一级视频在线观看| 视频在线不卡| 色久优优欧美色久优优| 欧美激情aaa| 蜜臀av一区二区在线观看| 亚洲一二三区在线| 宅男噜噜噜66国产精品免费| 俺去亚洲欧洲欧美日韩| 国产美女永久免费| 亚洲欧美偷拍三级| 国产精品无码自拍| 影音先锋久久久| 久久精品五月婷婷| 亚洲a∨精品一区二区三区导航| 亚洲香蕉成视频在线观看| 伊人免费在线观看| 亚洲三级电影网站| 日韩精品xxx| 国产精品综合| 色涩成人影视在线播放| 亚洲欧洲日韩精品在线| 欧美国产日韩在线| 天堂91在线| 欧美日韩精品电影| 欧美黄色一区二区三区| 97se亚洲国产综合自在线不卡| 免费观看日韩毛片| 久久在线视频| 国产伦精品一区二区三区视频黑人 | 亚洲系列在线观看| 亚洲精品少妇30p| 又黄又爽的网站| 日韩电影在线观看一区| 中文字幕一区二区三区有限公司 | 国产精品国产三级国产专区52| 国产日产欧美一区| www.日本久久| 亚洲在线一区| 日韩视频在线免费播放| 国产一级成人av| 国产精品看片资源| 美女91在线| 一区二区三区日韩在线| www.中文字幕| 在线看国产日韩| 久久久久无码国产精品| 国产人妖乱国产精品人妖| 韩国三级hd中文字幕有哪些| 国产精品试看| 中国 免费 av| 精品盗摄女厕tp美女嘘嘘| 亚洲精品免费一区二区三区| 中文字幕在线免费观看视频| 欧美成年人在线观看| 久久国产精品高清一区二区三区| 日韩欧美国产三级电影视频| 在线免费一区二区| 性做久久久久久久久| 女人十八毛片嫩草av| www.欧美日韩国产在线| 极品粉嫩美女露脸啪啪| 奶水喷射视频一区| 99久久99久久精品| 久久精品高清| 欧美亚洲丝袜| 日韩人体视频| 国产九区一区在线| 国产一区二区av在线| 国产精品精品久久久| h片在线观看视频免费| 久久成人精品视频| av免费在线一区二区三区| 亚洲精品xxxx| 蜜臀久久久久久999| 欧美一区二区三区在线视频 | 成人影院入口| 国内成人精品视频| 在线看女人毛片| 日韩在线观看免费| 成年人视频在线观看免费| 日韩国产欧美精品在线| 高h震动喷水双性1v1| 91精品国产手机| 国产又粗又猛又黄又爽无遮挡| 婷婷中文字幕一区三区| 欧美另类视频在线观看| 综合激情成人伊人| 欧美性生交大片| 国产精品福利影院| 亚洲高潮女人毛茸茸| 久久精品免费在线观看| 少妇无套高潮一二三区| 国产日韩视频一区二区三区| 久久精品国产亚洲av久| 久久久久久麻豆| 成人午夜剧场视频网站| 91蜜桃婷婷狠狠久久综合9色| 国产精品久久久免费观看| 成人免费视频免费观看| 亚洲熟女一区二区| 成人激情小说乱人伦| 国产美女视频免费观看下载软件| 成人av资源在线| 538国产视频| 久久综合视频网| 五月天精品视频| 日本一区二区成人| 国产日产在线观看| 亚洲视频你懂的| 男女免费视频网站| 亚洲电影一区二区| 亚洲天堂av片| 精品视频一区二区三区免费| 国产精品久久久久久久久久久久久久久久久久| 欧美另类z0zxhd电影| 99久久久久久久| 精品99一区二区三区| 亚洲色图 校园春色| 亚洲全黄一级网站| 婷婷在线视频观看| 欧美成人精品在线| 国产啊啊啊视频在线观看| 欧美亚洲日本网站| 播放一区二区| 3d蒂法精品啪啪一区二区免费| 哺乳一区二区三区中文视频| 久久99九九| 手机在线电影一区| 日本精品久久久久久久久久| 久久蜜桃精品| 手机在线视频一区| 91丨porny丨国产| 青青青视频在线免费观看| 亚洲精品国产品国语在线app| 日韩成人免费在线视频| 欧美亚洲动漫另类| 亚洲av无码一区二区乱子伦| 亚洲男人av在线| 国产盗摄在线观看| 欧美亚洲成人精品| 只有精品亚洲| 欧美理论一区二区| 欧美日韩亚洲国产精品| 久久精品午夜福利| 国产精品系列在线观看| 三上悠亚ssⅰn939无码播放 | 中文字幕在线日韩| 91超碰在线免费| 成人亚洲激情网| 天堂99x99es久久精品免费| 日本一级淫片演员| 媚黑女一区二区| 欧美xxxx日本和非洲| 国产午夜久久久久| 国产精品成人av久久| 7777精品伊人久久久大香线蕉完整版| 日本免费不卡视频| 久久深夜福利免费观看| gogo亚洲高清大胆美女人体| 91超碰在线免费观看| 欧美在线免费看视频| 欧美在线观看成人| 国产成人精品三级| 亚洲第一视频区| 欧美性猛交xxxx乱大交蜜桃| 亚洲精品97久久中文字幕无码| 伊人精品在线观看| xx欧美视频| 国产精品一区二区不卡视频| 香蕉视频官网在线观看日本一区二区| 久久久久久久激情| 97超碰欧美中文字幕| 日本少妇在线观看| 精品国产亚洲在线| h片在线免费| 国产日韩欧美成人| 精品香蕉视频| 免费在线观看的毛片| 99久久精品国产麻豆演员表| 欧美日韩人妻精品一区二区三区 | 国产成人综合av| 日韩精品免费一区二区三区竹菊| 欧美黄色免费网址| 国产一区二区在线看| 小嫩苞一区二区三区| 欧美日韩中文一区| 国产有码在线| 日韩av电影手机在线| 日韩中出av| 欧美老熟妇喷水| 久久综合九色欧美综合狠狠| 91视频免费网址| 日韩av影视在线| 五月天av在线| 奇米影视首页 狠狠色丁香婷婷久久综合 | 国外成人在线直播| 国产精品毛片久久久| 国产免费黄色一级片| 成人av在线资源网站| 国产又色又爽又黄的| 亚洲毛茸茸少妇高潮呻吟| 波多野结衣亚洲一二三| 免费在线成人av| 日韩影院免费视频| 蜜桃久久精品成人无码av| 欧美日韩中文字幕精品| 麻豆传媒视频在线观看免费| 亚洲在线观看视频| 国产中文一区| 第四色在线视频| 欧美性生交xxxxx久久久| 国产高清视频免费最新在线| 国产精品日日摸夜夜添夜夜av| 日韩欧美高清| 国产999免费视频| 亚洲网友自拍偷拍| 三级在线播放| 国产精品一区二区在线| 欧美激情四色| 亚洲熟女乱综合一区二区三区| 欧美性猛交xxxx乱大交3| 日本亚洲精品| 成人欧美一区二区三区在线观看| 国产日韩亚洲欧美精品| 国产一区二区三区四区在线| 欧美一二三区精品| 黄毛片在线观看| 日韩欧美精品在线不卡| 国产一区二区三区在线看麻豆| 国产在线视频二区| 亚洲美女又黄又爽在线观看| 久久99国产精品二区高清软件| 糖心vlog在线免费观看| 99久久夜色精品国产网站| 国产字幕在线观看| 免费99精品国产自在在线| 欧美男人操女人视频| 最新天堂中文在线| 亚洲国产美国国产综合一区二区| 青青草在线免费观看| 成人午夜高潮视频| 新67194成人永久网站| www.xxxx日本| 亚洲人成电影网| 一区二区三区在线资源| 欧美日韩中文在线视频| 亚洲乱码国产乱码精品精的特点| 天堂91在线| 99re在线视频上| 日韩—二三区免费观看av| 日本亚洲色大成网站www久久| 在线看日韩av| 久久综合社区| 永久av免费在线观看|