函數式語言可以讓你將代碼結構在頂層就將所有討厭的事務分離開來,并且保持代碼的純邏輯。
[…]
當你的單元擁有完全獨立的保障時,單元測試可以變得如此簡單!或者說,最差也能保證清楚和明顯的依賴性。
Robert Goldman也發表辯論說“常規的面向對象編程語言中過度采用的狀態對測試來說很不利”,因為人們需要“創建巨大的互相關聯的對象實體,才能為測試提供平臺。而且,檢驗預期的副作用的過程可能會導致額外的復雜性”。相反,“在類似于Haskell這樣的純函數式框架中,所有這些問題都被封裝在Monad中”。正如Greg Monads提出的那樣,它可以允許編寫“一段(憑空)創建IO命令流的代碼,以及另一段代碼來利用這個IO流,并且決定如何執行這些命令”。
與Greg來自同一個陣營的Ericd堅持認為,在函數式編程中沒有內部狀態,所以也就沒有狀態變化的處理。如果要測試“一個沒有狀態轉變的模型或系統”,人們根本不需要Feathers談到的那種測試:
剩下所需的唯一測試是收集一組輸入來測試所有邊界條件,將這些輸入傳遞給待測函數,然后驗證其輸出就可。
[...]
如果組件可以被分離測試(也就是純函數)并且測試結果表明函數是正確的話,那么這些純函數的組合理所當然也是正確的。
Feathers對此回答說,他“非常理解純函數式,并且也知道擁有好的設計的代碼自然不該有這些問題”。他強調,并不是所有的代碼都有好的設計,而且,“Haskell的確是迫使你將副作用隔離開來的函數式編程語言的一種,然而其他一些語言,比如OCaml或Scala,“它們看起來無法避免人們將代碼搞得亂七八糟”。
無論如何,很多不同意Feathers看法的爭論者認為,將函數式代碼搞得亂七八糟的唯一方式就是在使用函數式語言時采用非函數式用法。Goldman斷言,擁有副作用的程序“被公認為是像ML、Ocaml和Common Lisp這樣的混合性語言的非函數式部分”,顯然是要避免使用的。Greg同樣支持這個觀點,他表示,除非人們非要和函數式語言作對,以非函數式用法的方式來編寫代碼,那自然也就沒辦法“得到你本可以從權威的OO代碼中‘得到’的IoC和分離關注點!边@也是為什么Erikd堅持認為,有OO技術背景的人想要使用函數式語言編寫高質量代碼的話,就必須拋棄“舊習和思考方式”,盡可能長時間地忘卻“面向對象和專斷的編程特性”。
文章來源于領測軟件測試網 http://www.kjueaiud.com/