Test-Driven Development?別逗了

jopen 13年前發布 | 11K 次閱讀 敏捷開發

這篇文章來源于 Peter Sergeant 在 Write More Test 博客上的《Test-Driven Development? Give me a break…》,在原文和 Reddit 上有很大反響。這篇文章里的很多觀點在《TDD 并不是看上去的那么美》和《再談敏捷和 TW 咨詢師》里都出現過(我個人覺得我的觀點比其更全面一些)。就像我轉的《Scrum 為什么不行》 和《Bob 大叔和 Jim Coplien 對 TDD 的論戰》一樣,從這些貼子我們可以看到——這是一個全世界的問題,并不是只有在中國才有的問題

很多敏粉都在說我在是噴敏捷,黑敏捷,向敏捷潑臟水,我只想對這些人說——你們這樣的見解很膚淺也很敏感,你們根本就沒有認識到——爭論,反思和不同觀點的意義,你也就無法了解你們所信仰的敏捷!你們只是在膚淺和盲目地信仰和教條敏捷中的許多名詞、方法和標準答案罷了。

——————————————正文開始——————————————

對于程序員來說有些事有非常危險的信號(red flag)。當我聽到有人開始信仰 Test-Driven Development 是 One True Programming Methodology(唯一正確的編程方法論),這就是危險信號(red flag),我開始假設你是一個劣等、沒有經驗的程序員,或是某些敏捷咨詢師。

測試只是一個工具來幫助你,而不是用來證明誰比誰更虔誠,或是我的屌比你的要大,等這種愚蠢的行為。測試是用來讓程序員得到有幫助的、更快的反饋,從而找到正確的路徑,如果你搞壞一些事,其還可以用來給后人一些警告。這根本就不是一個神秘的有魔力的方法其可以讓你的代碼變得更好……

整個 Test-Driven Development 的概念是麻痹和信奉,從而讓其成為你的人生觀。相反的:Developer-Driven Testing,它給你和你的同事一些有用的工具來解決問題,來支持你自己,而不是那種以工具或方法為中心的讓你假設其應該是那樣的測試。

是不是在有些時候我們需要在寫代碼前寫測試?當然是,比如,“修改已有的功能”,這會一個適用的場景,還有那些短小的和已定義完善的事物,或是對已被測試過的代碼做一些改善。

但, 是不是你就應該需要總是要去先寫測試?省省吧,別逗了。

這是極度白癡的行為,尤其是在設計,調查和開發的初期。讓你的測試來接管你的代碼(而不是影響那個模塊的代碼)和接管你的設計這是一個巨大的失敗,就是因為你寫的那些測試范圍太大太不靠譜。(陳皓注:我在《TDD 并不是看上去的那么美》一文中說過測試案例的測試范圍的問題,敏捷社區除了對我進行人身攻擊外從未對此做過正面回答。)

在寫代碼前寫測試案例在一些場景下的確很不錯。然后,Test Driven Development,被敏捷專家或是其它各種五花八門的江湖騙子像神給凡人宣揚一樣,這就是欺騙大眾。

行動在想法之下,于是測試必需先行(所有我已看到的,所有我正在看到的都表明這是 TDD 的中心思想—— 你寫了測試,然后你再寫代碼并通過測試),于是測試成為了最有用的活動并可以幫助程序員。這是錯的。

就算你在一開始要寫一些測試案例,但只要你想讓這些測試案例更有意義,那么,你要么得讓這些測試案例的測試范圍更小更底層更精確,要么你就得在整個軟件快要寫完的時候再去寫測試,要不然你就得欺騙或是篡改測試案例。在為數不多的情形下,前者是正確的——測試圍繞于 bug,或是小的,定義地很好的功能碎片(陳皓注:我個人理解為單元測試是目前最有效的))

把測試變成整個活動的中心因為其對程序員有用?真牛逼。老實說,控制程序員的工作流程只可能得出一條無比正確的答案——荒謬可笑。

測試幫助程序員,是因為其可以幫程序員組織自動化測試,所以才幫了程序員,而不是 cargo-cult(貨物崇拜,參看《各種流行的編程方法》中的 cargo-cult 編程)——信仰一種工作流程并讓所有的人或事來適應于他。

先寫測試這種方法只會在“Developer Driven Testing”(程序員自己驅動的測試)下可行——關注于選取一個正確的方法讓程序員更有生產力。生成一堆測試的規則并說這是唯一的真理是不正確的。

一些討論和想法(在此貼發出數小時后)…

當我這篇博文發出幾個小時后,其被轉到了別的地方并引發了一些討論。

在 Hacker News 上,有人說我提出了很多很不錯的問題,并且那是真正的有理有據的觀點。我在用用戶名叫peteretep 的回復了一些。

在 Reddit 上的爭論更多更強。那里有很多的人覺得需要寫自動化測試。并且這篇博文被大家演變成擁護測試和可實踐的建議,我覺得我是誤傳達了我的想法,我覺得軟件測試是非常重要的,而不是根據哪個方法論進行的教條主義!

——————————————正文結束——————————————

我在 Reddit 上看到了下面的事,我也作些評論。

  • 大家在討論很多很多的技術細節,比如如何測試私有方法,如何測試 inner class,甚至還有代碼。我太喜歡了,這才是真正的討論,而不是像酷殼這邊那些敏粉們說人而不說事的討論,那些所謂的敏捷咨詢師的話里連一點技術細節都沒有
  • 并且也有人說 TDD 可以讓你去 Design,但隨后就有人說,正真的 Design 就是 Design,而不是 hack 測試來強行讓你 Design。后面有了附和到——有很多思想意識想用流程來代替思考,軟件開發就是需要在某中上下文下去思考,而不是使用某種機制來讓你思考
  • 我看了兩極分化的大量的爭論,這是我最喜歡看到事。世界就是因為有不同的觀點而美好。有反對才有爭論,有爭論才有思考,這才是進步的源泉,而不是統一認識,形成標準。而對于那些黨同伐異的,一聽到有反對聲就激動就要打壓的敏粉來說,我只能認為他們的人生觀世界觀扭曲得就像朝鮮那樣。
來自: coolshell.cn

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!