• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            eXile 的專欄

            測試驅(qū)動開發(fā)(TDD)的頓悟

              對于測試驅(qū)動開發(fā)(TDD),始終有一些迷惑,比如說,它的測試需要考慮完備性嗎,需要考慮覆蓋率嗎?等等此類。今天從Javaeye中看到一句話,終于明白了。
              “什么是TDD?TDD就是把你的需求用測試給描述出來。”
              也就是說,TDD中的測試和一般意義上的單元測試并不一樣,盡管TDD中的測試有時也作為單元測試來使用,但它們是兩回事。(這里的需求,指的不是客戶需求,而是程序員的開發(fā)需求)。
              使用TDD時,首先寫的是測試,這時相應(yīng)代碼還沒有實現(xiàn),那么測試什么東西呢?所以說,寫測試的過程,同時也是設(shè)計接口的過程。這和寫單元測試的目的完全是不一樣的。
              TDD還有一個額外的好處。大多數(shù)人都是懶的,不要指望所有的程序員在寫完功能代碼后,再去編寫相應(yīng)的單元測試。我覺得這個接口的實現(xiàn)沒有問題,所以就不用測試。這種想法也很常見。所以一開始就寫下測試,可以杜絕后患。

            posted on 2008-01-23 17:23 eXile 閱讀(2465) 評論(11)  編輯 收藏 引用 所屬分類: 編程與設(shè)計

            評論

            # re: 測試驅(qū)動開發(fā)(TDD)的頓悟 2008-01-23 21:38 neoragex2002

            用TDD做設(shè)計的人是爽了,寫測試一句話,多簡單。可想想你的團(tuán)隊呢?他們的創(chuàng)造熱情和成就感在哪里?他們的士氣在哪里?就幾個空而無物的測試用例?任何方法學(xué)正面地作用在主動積極的人才會起作用。  回復(fù)  更多評論   

            # re: 測試驅(qū)動開發(fā)(TDD)的頓悟 2008-01-23 21:49 eXile

            @neoragex2002
            這個老兄還是對TDD有一個起碼的了解以后,再來討論這個問題吧。
              回復(fù)  更多評論   

            # re: 測試驅(qū)動開發(fā)(TDD)的頓悟 2008-01-23 21:50 eXile

            FROM JAVAEYE:
            對于大多數(shù)的中國的軟件開發(fā)團(tuán)隊來說,難以實現(xiàn)敏捷的最重要問題是人的素質(zhì)問題。一個敏捷團(tuán)隊要求每個成員都有較好的OOP和OOD的能力。.......實現(xiàn)敏捷是一個漸進(jìn)的過程。構(gòu)造一個在技術(shù)上有敏捷能力的團(tuán)隊有兩種方法,一是用足夠的錢去招聘有足夠能力的程序員(大部分企業(yè)沒有那么多錢)。二是將現(xiàn)有不符合敏捷技術(shù)要求的程序員培養(yǎng)為合格的敏捷工作者。而在培養(yǎng)的路上,單元測試正是一個很好的驅(qū)動方式和實踐平臺。  回復(fù)  更多評論   

            # re: 測試驅(qū)動開發(fā)(TDD)的頓悟 2008-01-23 21:52 eXile

            FROM JAVAEYE
            就是因為“文檔/注釋”在代碼的頻繁修改中太容易過時,而且也太容易為人所忘記,所以在我的實踐中不寫文檔,我的文檔就是我的“代碼+單元測試”,想知道我的想法,看“代碼+單元測試”就行了,沒有任何形式的文檔比“代碼+單元測試”更能體現(xiàn)我的設(shè)計
            - 我們的文檔是十分簡短和松散的,一般放在wiki上,起到story guide的作用,但如上所說,隨著開發(fā)很快就過時了,從中你能找到設(shè)計的逐步迭代,但它和最終的產(chǎn)品是有差別的
            - 對于我們開發(fā)工程師來講,“代碼+單元測試”就是我們的文檔,對于客戶來講,有專門的產(chǎn)品文檔供他們使用,但是那是由文檔工程師寫的   回復(fù)  更多評論   

            # re: 測試驅(qū)動開發(fā)(TDD)的頓悟 2008-01-23 21:53 eXile

            FROM JAVAEYE:
            閱讀有些test case只能讓你云里霧里,而閱讀有些則讓你馬上就知道這段代碼的用途。其實找并不是這些test case寫的有水平差別,而往往是有針對問題角度的差別。而進(jìn)一步,你會發(fā)現(xiàn)閱讀這些test case如果按照一定順序,就會從最初的動機到最終的實現(xiàn)細(xì)節(jié)都有一個清晰的理解,而如果我們能夠在寫這些test case的時候就標(biāo)注出這個理解順序,將是十分核算的。而實際上很多時候我們書寫的順序就是最終我們適于閱讀理解的順序。
              回復(fù)  更多評論   

            # re: 測試驅(qū)動開發(fā)(TDD)的頓悟 2008-01-23 21:58 eXile

            JAVAEYE上真是有不少明言警句啊, 看來都是高手。。。  回復(fù)  更多評論   

            # re: 測試驅(qū)動開發(fā)(TDD)的頓悟 2008-01-23 22:01 eXile

            FROM JAVAEYE:
            就說注釋好了,比較一下:
            1。可運行的代碼
            2。測試代碼的單元測試和其他測試
            3。注釋

            這個重要性應(yīng)該是向下遞減的。沒有1,其他都沒有意義了。沒有2,就沒有一種可執(zhí)行、可重復(fù)的方法來驗證1的正確性。

            至于注釋,對于程序的功能、正確性和可靠性,對于客戶來說是沒有任何意義的,所以除非有特殊的理由,我們才去寫注釋。

            一般來說,堅持寫注釋的人最重要的觀點是便于自己或后來者理解代碼,減小程序維護(hù)和變更的成本。這個我們當(dāng)然喜歡,但是要注意幾點:
            1。注釋到底是不是最好的工具來加快和精確理解
            2。達(dá)到這樣的目的需要多少成本

            第一點,首先絕大多數(shù)注釋是細(xì)節(jié)程度上的,基本上和代碼本身處于同一層次,因此我們需要看一看代碼本身是否比注釋更有權(quán)利。
            注釋的目的基本上是為了說明
            1:代碼實現(xiàn)中的權(quán)衡
            2。代碼本身的目的
            3:別的代碼使用該代碼的方法

            以Java舉例,注釋包括包注釋、類注釋和方法注釋。在99%的情況下,我認(rèn)為只有包注釋和類注釋才有意義,因為一個包和
            類只有自己的名字來解釋自己的含義,如果是一個簡單的類,譬如說是Rectangle,當(dāng)然這個名字已經(jīng)說明了一切。但很多時候,
            一個類里面包含很多方法,很難簡單地用一個類名字來描述整個類的意圖和作用這個時候,這個時候代碼本身是不足的,需要類注釋的。

            對于方法層次上的注釋,除非你這個方法用了非常復(fù)雜的算法,那么我們最先關(guān)注的是它的目的,這個目的用方法的名字就足夠了,
            如果你認(rèn)為它有三個目的,或者有幾個階段,那你必須重構(gòu),直到達(dá)到這個目標(biāo)。這里代碼比注釋的好處是能夠優(yōu)化代碼本身的結(jié)構(gòu),
            易于重用和新變化,沒有同步的成本,更重要的是它是可執(zhí)行的。

            有的時候,例如內(nèi)部實現(xiàn)是錯誤的,我們需要修改代碼,這個時候我們也需要理解這個代碼地實現(xiàn)方式,但我認(rèn)為一旦達(dá)到了上面的要求,對一個程序員來講,代碼更精確、更簡單地能夠被理解,而不是注釋,除非注釋逐行解釋代碼地實現(xiàn)。

            至于別的代碼如何來使用你自己的代碼,我不由得回憶起當(dāng)初學(xué)習(xí)delphi地經(jīng)歷,在我使用一段delphi以后,我很多時候都是憑自己對delphi函數(shù)命名的習(xí)慣的猜測去調(diào)用一個個函數(shù),而不是依靠delphi地API文檔和delphi源代碼里面的注釋(實際上非常少),真的無法理解就去看源代碼。而對于一些我完全是初學(xué)的類或者函數(shù),我的做法首先是去尋找范例代碼理解函數(shù)調(diào)用的順序,至于這種理解是否正確
            最終取決于我自己的不斷測試。對于一些復(fù)雜的方法,我會在基本已經(jīng)理解,并且能夠使用的情況下再去看是否還有別的什么"訣竅",后門等等。因此,在這方面單元測試無疑比注釋更有用,但是如果一個方法確實比較復(fù)雜,并且不同地類和函數(shù)之間有一定的依賴關(guān)系,我們需要專門的API文檔,注釋根本做不到這一點。

            第二點,注釋的成本。注釋無法驗證,注釋不能執(zhí)行。因此,注釋必須完全通過手工來進(jìn)行維護(hù),當(dāng)一個類被重構(gòu)為一個類層次,
            當(dāng)一個方法被抽取成兩個方法,當(dāng)一個類的某些方法被移到另一個類,一個類地實現(xiàn)被改變(接口不變)的時候我們都必須手工去維護(hù)
            這些東西,并且無法知道我們的注釋到底是不是正確揭示了這個類、方法的意圖和實現(xiàn)思路。這個成本是非常高的,特別是當(dāng)我們
            知道注釋既不能為客戶提高更多的價值,也不會對其他程序員理解代碼有多大的幫助。當(dāng)然,如果我們有足夠的人力、物力愿意干這樣的活,有些時候也會稍微有點幫助。
              回復(fù)  更多評論   

            # re: 測試驅(qū)動開發(fā)(TDD)的頓悟 2008-01-23 22:02 eXile

            FROM JAVAEYE:
            實際上過多的注釋妨礙了重構(gòu)的進(jìn)行,如果你想讓代碼僵化那么就寫大量的注釋好了,越多越好,甚至注釋:代碼=10:1。重構(gòu)的結(jié)果往往是刪除掉大量的注釋,因為它們或者已經(jīng)不適合代碼當(dāng)前的結(jié)構(gòu),或者已經(jīng)不再需要,因為代碼的結(jié)構(gòu)已經(jīng)非常清晰了。而且我并不知道是否還有可能進(jìn)行下一次重構(gòu),那么我寫太多的注釋是不是很有可能是在做無用功?我其實只要寫很少量的注釋就足夠了。
              回復(fù)  更多評論   

            # re: 測試驅(qū)動開發(fā)(TDD)的頓悟 2008-01-23 22:02 eXile

            FROM JAVAEYE:
            很多大公司的代碼都沒有任何注釋,很多大師寫代碼也沒有注釋(看看junit就知道了,大家可能不知道這個東西是兩個大師在飛機上試驗結(jié)對編程的副產(chǎn)品)。原因在于他們根本就不能容忍任何注釋造成的味道。
              回復(fù)  更多評論   

            # re: 測試驅(qū)動開發(fā)(TDD)的頓悟 2008-01-23 22:35 eXile

            FROM JAVAEYE:
            注釋與文檔的本質(zhì),是為了便于軟件的開發(fā)和維護(hù),而不是在一道一道的工序之間作為“交接班”的說明
              回復(fù)  更多評論   

            # re: 測試驅(qū)動開發(fā)(TDD)的頓悟 2008-01-24 08:08 Enoch

            測試驅(qū)動開發(fā)(TEST DRIVER DEVELOP, TDD)是以測試為驅(qū)動力,進(jìn)行開發(fā),是一種開發(fā)方法。實際上也是極限編程(Extreme Programming, EP)的一個重要特點,TDD不斷的測試推動代碼的開發(fā),既簡化了代碼,又保證了軟件質(zhì)量。
            使用測試驅(qū)動開發(fā)(TDD)就是通過編寫代碼的測試用例,對其功能的分解、使用過程、接口都進(jìn)行了設(shè)計,以滿足軟件需求,這樣使得代碼的設(shè)計更符合后期開發(fā)的需求。
            測試驅(qū)動開發(fā)(TDD)開發(fā)通常需要明確要完成的功能,快速實現(xiàn)功能的測試用例,完成對代碼進(jìn)行重構(gòu),測試完成所有功能的開發(fā)。這里要求測試的完全隔離,不同代碼的測試不應(yīng)該存在耦合。 測試驅(qū)動開發(fā)(TDD)從某種意義上說是單元測試(Unit Test, UT)置于軟件過程的中心地位。
              回復(fù)  更多評論   

            導(dǎo)航

            <2009年3月>
            22232425262728
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            統(tǒng)計

            常用鏈接

            留言簿(18)

            隨筆分類

            隨筆檔案

            服務(wù)器編程

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲中文字幕久久精品无码APP| 国产精品久久久久久一区二区三区 | 久久91精品国产91久久户| 欧美精品福利视频一区二区三区久久久精品| 色88久久久久高潮综合影院| 人妻无码久久精品| 久久综合久久性久99毛片| 国产成人香蕉久久久久| 伊人色综合久久天天| 久久精品国产秦先生| 国产精品久久久久久久| a高清免费毛片久久| 久久婷婷综合中文字幕| 97久久精品人人澡人人爽| 四虎国产精品免费久久久| 国产精品久久久久影院嫩草| 国产精品久久久久久久久鸭| 99久久免费国产精品热| 91精品国产高清久久久久久国产嫩草 | 久久无码人妻一区二区三区| 久久婷婷五月综合国产尤物app| 日产精品久久久一区二区| 99久久成人国产精品免费| 久久99热国产这有精品| 久久久国产精华液| 久久天天躁夜夜躁狠狠| 久久久久国产精品熟女影院| 国产成人精品白浆久久69| 国产精品日韩欧美久久综合| 亚洲国产成人乱码精品女人久久久不卡| 久久久久久国产a免费观看黄色大片| 亚洲va久久久噜噜噜久久狠狠 | 99久久www免费人成精品| 日本加勒比久久精品| 亚洲色欲久久久综合网| 国产精品99久久精品爆乳| 亚洲欧美一级久久精品| 国产精品久久久久9999| 一本综合久久国产二区| 久久久91精品国产一区二区三区 | 亚洲精品乱码久久久久66|