天天看點

單元測試與代碼的動态行為和靜态行為

    這一問題的引出是來自我們的軟體釋出流程的。我們的産品運作的是Monta Vista或是WindRiver Linux(後面稱之為目标環境),而開發環境是Fedora Linux(後面稱之為主機環境)。我們對于單元測試都會在主機環境上完成,然後,在目标環境上并不做單元測試,而隻是做Sanity Test(你可以了解為功能測試)。一開始,我并沒有發現我們在釋出産品前并不在目标環境下做單元測試的,後來無意的交談中我發現了這一與我所想像的不一緻的現象,即,我認為産品在釋出前應當在目标環境下做單元測試。

    說到這,有人可能會想,單元測試應當一旦做過,就證明了其正确性,為什麼還要在這裡所說的目标環境下再做測試呢?是的,這一問題也同樣出自于我們的一個軟體工程師。在問我的當時,我并沒有想好如何回答。于是,在開車回家的路上,我就在思考“這是一個對于單元測試的了解比較普遍的問題,如何去表述讓别人一下子能明白單元測試還得在目标環境中再做”。思考的結果就是這裡要提出的代碼的動态和靜态行為概念。

    動态行為是指代碼具有一定的響應能力的行為,比如,一個對于線程進行封裝的類,其行為應當就是動态的。另一個例子,就是Socket通訊問題,我們需要對連接配接進行測試,此時其所表現出來的也是動态行為。對于動态行為的代碼,其在不同的作業系統中表現有可能是不同的。

    與動态行為不同的是,靜态行為隻是被動的計算或是組織資料結構。比如,一個MD5的計算函數,其行為就是靜态的,這種行為不論你是在任何作業系統或是處理器上運作,其結果都是一樣的。

    有了這兩個概念,我不知是不是有助于我們去分析,我們所寫的代碼是否應當在不同的環境下做單元測試。借用這兩個述語我們得到如下的陳述:如果全部代碼都隻有靜态行為,那麼隻要在一種環境下做單元測試就行了;如果代碼包括動态行為,那麼我們必須在所有可能運作的環境下做單元測試。

繼續閱讀