有效的單元測試 讀書筆記第一章 優秀測試的承諾

2021-07-08 11:36:21 字數 3716 閱讀 5397

開發者應該編寫自動化測試,以便發現回歸問題時就使構建失敗。而且,測試先行的程式設計風格已有大量的專業研究,使用自動化測試不僅是保護回歸,而且是幫助設計,在編寫**之前就指出**的期望行為,從而在驗證實現之前先驗證設計。

問題:自動化測試可以改善生產力,使你獲得並保持開發速度。現在自動化測試成為主流,並不意味著測試覆蓋率已經達到理想狀態,或者生產力無法再改善了。那麼測試的價值是什麼,測試質量為什麼重要?

1、測試的價值

(1)有關測試的思維轉變

第一,測試可以幫助我們捕獲錯誤。隨著測試的進行,待修復的缺陷的總數不斷下降。但是100%的測試覆蓋率比95%要好嗎?測試越多,額外測試的價值越少。第乙個測試最有可能是針對**最重要的區域,因此帶來**值和高風險。當我們為幾乎所有事情編寫測試後,那些仍然沒有測試覆蓋的地方很可能是最不重要和最不可能被破壞的。如下圖所示:

第二,測試幫助我們針對實際使用來塑造設計。假如從呼叫者的角度來審視**的設計和行為,用這樣的風格:「先寫乙個失敗的測試,然後寫足夠使測試通過的**,再寫另乙個失敗的測試。重複這個迴圈直到完成任務。」

測試不僅僅是質量保證的工具,或者是對錯誤及回歸的保護。測試作為一種設計**的方式,提供了具體的目的。編寫使失敗測試通過的**比以前的方式簡單多了,而且該做的也都做了。通過明確的指出所需的行為,測試幫助我們避免鍍金。

這樣我們就在不斷認識和理解測試,我們經常因為單元測試有助於避免尷尬、耗時的錯誤而開始編寫他們。隨後我們會學到,將測試作為安全網只是等式的一部分,而另一部分---或許是更大部分---其好處是我們將測試表達為思考**的過程。

第一種思維導致不能支援雙穩態定律:編寫測試的最大價值不在於結果,而在於編寫過程中的學習。

第乙個穩態表明編寫更多更好的測試不再帶來額外的價值。第二個穩態進一步爬公升,從我們想法的改變中發現更多的回報---將測試認為是最豐富的資源,而不僅僅是驗證工具。

只要測試者認為測試僅僅是質量保證工具,那麼潛力就被下面的弧線給限制住了。將我們的認識轉變為一種設計工具,能促使我們從質量穩態移動到第二個以測試為設計工具的穩態。

(2)生產力因素

為什麼要花時間培育你的測試**、對重複的部分進行重構、普遍的注意它的結構、清晰度和可維護性。

測試**天生就比生產**簡單。無論如何,如果你偷工減料,在測試**的質量上留下技術債務,它將會把你拖慢。本質上,測試**的重複和多餘的複雜性會降低你的生產力,低效測試帶來的正面影響。

對生產力直接影響的是反饋環長度和除錯。這兩者是消耗程式設計師時間的罪魁禍首。如果反饋環越長,那麼花在除錯上的時間就越多。

bug成本:google估算出程式設計師在bug出現後馬上修復的成本是5美元;在執行整個構建後才發現,修復成本是50美元;在整合測試時發現,修復成本是500美元;到了系統測試階段,成本高達5000美元。

等待對變更進行確認和驗證在很大程度上牽扯到測試執行的速度。另外三個原因都會影響到程式設計師的除錯量。

缺乏可讀性自然會降低分析速度,鼓勵你開啟偵錯程式,因為閱讀**不會讓你明白,它太難理解。缺乏可讀性也會引入更多的缺陷,因為很難看出你造成的錯誤。而缺陷會導致更多的除錯工作。

缺陷逃逸數量增多的另乙個因素是測試結果的準確度。而可信賴性和可靠性都會直接影響測試結果的準確度。為了測試報告的準確性,測試需要斷言它的承諾,並以可靠、可重複的方式提供斷言。

通過關注對生產力的影響力,可以擴充套件質量穩態。使程式設計師變得高效的關鍵正是這些已經識別出的根本原因。高產的先決條件是你足夠了解你的工具,而不是持續分散你的注意力。一旦你了解了程式語言,你可以瀏覽其核心api。當你熟悉了問題域,就專注於根本原因--可讀性、可靠性、可信賴性和測試的速度。

(3)設計潛力的曲線

從編寫測試中找到完全不同的價值---價值來自於創新及設計導向,而非防止回歸缺陷的保護及驗證導向。

為了能同時達到兩個穩態,從而完全發揮測試的潛力,需要:

第一,像生產**一樣對待你的測試**--大膽的重構、建立和維護高質量測試。

第二,開始將測試作為一種設計工具,指導**針對實際用途進行設計。

2、將測試用於設計工具

使用自動化測試作為設計工具將世界顛倒過來了,當你用測試設計**時,將典型的「設計,編碼,測試」序列變成「測試,編碼,設計」。測試先於編碼,並以追溯性的設計活動來得出結論。那結論性的設計活動成為重構,序列變成「測試,編碼,重構」。

(1)測試驅動開發

tdd,基於乙個簡單的想法:「在編寫出能夠證明**存在的失敗測試之前,不寫生產**」。這也是它有時被稱為測試先行程式設計的原因。

先寫測試,會向測試所希望的方向來驅動生產**的設計。會帶來:

第一,**變得可用---**的設計和api適合於你的使用場景。

第二,**變得精益---生產**僅僅實現場景所需要的功能。

因為,首先將場景翻譯為乙個可執行的例子,以自動化測試的方式。執行測試,看著它失敗,就具有了乙個使之通過的清晰目標,只編寫足夠的生產**---不要多寫。將場景刻畫為可執行的測試**是一種設計行為,測試**成為生產**的呼叫者,使你在還沒寫任何**之前就驗證你的設計。用具體例子的形式來表達需求時一種強大的驗證工具---我們只能通過將測試作為設計工具才能獲取價值。

其次,嚴格遵循規則,僅僅編寫足以使測試通過的**,會保持設計簡單並適合目的。**質量的罪魁禍首之一,以及使開發者生產力停滯的主要因素,就是稱為偶發複雜性。

測試指出缺陷或**中缺失的功能,只寫足以使測試通過的**,嚴格地向簡單設計來重構,這三者的組合極其強大,可以將偶發複雜性消滅在萌芽中。這不是魔法藥劑,程式設計師的設計觀念和經驗會影響到你最終的設計。

(2)行為驅動開發

用「行為」來代替「測試」一詞。被bdd實踐者證明是有效的乙個特殊概念,是利用驗收測試進行由外而內的開發,先編寫乙個失敗的客戶驗收測試,用於從客戶視角描述系統。編寫例子來從業務干係人那裡獲得反饋,在動手之前就能了解我們是否在構建正確的東西。

第一章讀書筆記

本章內容主要講的是android系統移植和驅動開發概述,通過本章的學習知道了學習linux驅動程式設計一定要了解linux驅動只與linux核心有關,與客戶的使用的linux系統無關。也就是說,不管是那個linux系統,只要使用了同樣的linux核心,驅動就可以通過。唯一可以判斷的linux核心是否...

第一章讀書筆記

android的系統架構分為4層 第一層 linux核心。第二層 c c 庫。第三層 android。第四層 應用程式。android移植可兩個部分 應用移植和系統移植。目前linux核心主要維護3個版本 linux2.4,linux2.6和linux3.x,大多數linux系統都使用了這3個版本的...

第一章讀書筆記

若給android增加新的驅動,則hal也要做出相應修改。不同的linux版本的驅動程式並無法通用,那麼通過判斷linux核心版本號是否相同,可以檢驗驅動是否可以通用。目前最廣泛的核心版本應該是linux2.6。電腦或者手機等不同硬體裝置越來越豐富,則需要更多的linux裝置驅動來完成硬體裝置間的互...